Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
3 / 3 / 0
Регистрация: 22.06.2017
Сообщений: 72

Извлечение ImageList из ресурсов

17.04.2026, 19:11. Показов 1545. Ответов 28
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток.

Извлекаем ресурс формы в формате .dfm из внешнего (чужого) исполняемого файла.
Открываем его в Notepad++, находим двоичный код ImageList.
Копируем код в буфер обмена.
В Delphi создаем новый проект, помещаем на форму ImageList и добавляем пару картинок.
Щелкаем по форме правой кнопкой мыши и выбираем опцию "View as Text"
Заменяем существующий код ImageList на код из буфера обмена.
Возвращаемся к обычному виду формы
Выполняем двойной щелчок по компоненту ImageList и видим, что все рисунки из внешнего файла теперь доступны.

Это вручную
Можно ли получить этот же результат программно?
Извлечение ресурса автоматизировать не нужно.
С поиском нужного кода сам справлюсь.

С уважением, Николай
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.04.2026, 19:11
Ответы с готовыми решениями:

Извлечение ресурсов на WinApi
Добрый день! Требуется помощь. Пытаюсь извлечь из ресурсов три файла. Компиляция проходит успешно....

Извлечение ресурсов
Программа хранит в себе dll файл и при запуске распаковывает его в C:\speed.dll но в чём-то ошибка...

Извлечение всех ресурсов, даже не зная их имен
Сабж, на WinAPI нужно извлекать все ресурсы из программы, по сути даже не зная их названия, зная...

28
3 / 3 / 0
Регистрация: 22.06.2017
Сообщений: 72
20.04.2026, 13:04  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Verevkin Посмотреть сообщение
Этот метод для загрузки бинарных ресурсов, а не НЕХ-кодированных из DFM.
Да, но ведь я преобразовываю строки в байты, не так элегантно, как Вы, но преобразовываю.
Сейчас попытаюсь создать ресурс методом GetResource, если получится, посмотрю, как он выглядит и попробую подменить.
0
Злостный нарушитель
 Аватар для Verevkin
10878 / 5817 / 1288
Регистрация: 12.03.2015
Сообщений: 26,855
20.04.2026, 13:12
Цитата Сообщение от NNK_RTR Посмотреть сообщение
Да, но ведь я преобразовываю строки в байты, не так элегантно, как Вы, но преобразовываю.
Сейчас попытаюсь создать ресурс методом GetResource, если получится, посмотрю, как он выглядит и попробую подменить.
Скажи честно, ну вот нахрена тебе всё это? Для чего ты это планируешь использовать?

Добавлено через 4 минуты
Цитата Сообщение от NNK_RTR Посмотреть сообщение
Да, но ведь я преобразовываю строки в байты, не так элегантно, как Вы, но преобразовываю.
И чо, получается?
0
Злостный нарушитель
 Аватар для Verevkin
10878 / 5817 / 1288
Регистрация: 12.03.2015
Сообщений: 26,855
20.04.2026, 14:34
Вопщем, чото я никак не вкурю, что тебе надо на выходе.
Я тут от безделья набросал тебе экспорт вот такой, посмотри:



За основу взял пару функций из хэлпа.
Я тупо из DFM беру описание компонента и преобразую в реальный динамически созданный компонент с готовым наполнением (данными). ListView показывает, что данные были успешно загружены.

Тебе ЭТО надо?
0
3 / 3 / 0
Регистрация: 22.06.2017
Сообщений: 72
20.04.2026, 17:51  [ТС]
Цитата Сообщение от Verevkin Посмотреть сообщение
Скажи честно, ну вот нахрена тебе всё это?
Односложно ответить сложно (каламбур?)
Основное - чтобы мозги не усохли (мне 75).
Выше я писал про утилиту и хотелось бы, чтобы она была всесторонне развита
После сборки компьютера "Радио 86РК" увлекся программированием (сначала непосредственно в машинном коде, потом добыл Ассемблер, потом усеченный Паскаль - отсюда зачаточные знания Delphi). Никогда основательно не изучал язык, так, вершки.
По выходу на пенсию увлекся переводом интерфейса программ на Русский язык. Далеко не все программы с радостью воспринимают вмешательство, иначе было бы скучно - отладчики, шест. редакторы, другие специальные программы, я даже написал пару собственных инструментов.
Утилита тоже относится к инструментам переводчика, правда она лишь часть более глубокого замысла. Вы знаете, как легко и просто перемещать, изменять размеры и изменять названия (Caption) в среде разработки Delphi. Неплохо было бы предоставить переводчику такую возможность - динамически создавать форму из ресурса. Такие программы есть и их достаточно много, но все они спотыкаются на сложных формах (например, панели наложены друг на друга или, что еще хуже, используются нестандартные компоненты). В качестве "кролика" я выбрал HELPMAN 10 (программа для написания справок). Начало было положено - несколько сложных форм успешно воссоздаются, но столкнулся с ленточным меню (Ribbon) (ресурс TFRMHELPMAN.dfm оттуда). Раньше никогда не использовал этот компонент и прежде, чем пытаться воссоздать его динамически, решил создать его вручную - то есть, создать полностью идентичную форму HELPMAN. Здесь мне и потребовались оригинальные значки...
Ну и не забывайте про старческий маразм (думаю он Вам не присущ и дай бог, никогда не будет) - вот хочу и все...
Цитата Сообщение от Verevkin Посмотреть сообщение
Я тут от безделья набросал тебе экспорт вот такой, посмотри:
С первого взгляда ничего не понял. Мне нужно объяснять на пальцах
- Где Вы взяли объект Globals
- отрыли его в Notepad++? Непохоже
- ImageListTreeLog - Это пустой TImageList
- скопировали его пустой объект ImageListTreeLog
- ниже объект ImageListCommon - этот объект не нужен?
- дальше что Рабочий стол?
- Что за поток открыт в Rad Studio?
- Вставили текст, откуда взялся код
- Правая панель - в каком инструменте Вы работаете, вроде открывали Rad Studio
ЗАПУТАЛСЯ окончательно!!!!!!!!!!!
Цитата Сообщение от Verevkin Посмотреть сообщение
Тебе ЭТО надо?
Да, конечный результат именно такой (но без копирования и вставки вручную - все средствами Delphi)
0
Злостный нарушитель
 Аватар для Verevkin
10878 / 5817 / 1288
Регистрация: 12.03.2015
Сообщений: 26,855
20.04.2026, 18:36
Лучший ответ Сообщение было отмечено NNK_RTR как решение

Решение

Цитата Сообщение от NNK_RTR Посмотреть сообщение
Где Вы взяли объект Globals
Из своего проекта, у меня их много.
Цитата Сообщение от NNK_RTR Посмотреть сообщение
отрыли его в Notepad++? Непохоже
Это более лёгковесная программа Notepad3, использую в связке с Total Commander для просмотра иходников с подсветкой синтаксиса.
Цитата Сообщение от NNK_RTR Посмотреть сообщение
ImageListTreeLog - Это пустой TImageList
Почему? В нём жэж больше 20 значков.
Вот другой ImageList (его имя не имеет значения):



Цитата Сообщение от NNK_RTR Посмотреть сообщение
скопировали его пустой объект ImageListTreeLog
Нет, непустой. Почему пусто-то??

Цитата Сообщение от NNK_RTR Посмотреть сообщение
дальше что Рабочий стол?
Какой ещё стол? Я просто написал тебе демонстрашку того, как можно создавать готовые компоненты во время выполнения программы по их DFM-коду.
Цитата Сообщение от NNK_RTR Посмотреть сообщение
Что за поток открыт в Rad Studio?

Цитата Сообщение от NNK_RTR Посмотреть сообщение
Вставили текст, откуда взялся код
Какой код? Я скопипастил текст компонента из DFM-файла и вставил его из буфера обмена.
Цитата Сообщение от NNK_RTR Посмотреть сообщение
Правая панель - в каком инструменте Вы работаете, вроде открывали Rad Studio
Это TListView.
Цитата Сообщение от NNK_RTR Посмотреть сообщение
но без копирования и вставки вручную - все средствами Delphi
Копирование/вставка - это всего лишь доставка исходных данных в программу. Естественно, само преобразования от способа доставки не зависит. Можно написать парсер DFM, который будет этим заниматься. Я даже хотел и его написать, но пришло начальство с 4 банками пива и орешками. Пришлось всё бросить и заняться более срочными делами.
1
Злостный нарушитель
 Аватар для Verevkin
10878 / 5817 / 1288
Регистрация: 12.03.2015
Сообщений: 26,855
20.04.2026, 18:48
Цитата Сообщение от NNK_RTR Посмотреть сообщение
Основное - чтобы мозги не усохли (мне 75).
Это похвально. Вот исходник, я пошёл готовить ужин.
Вложения
Тип файла: 7z thread3222309.7z (222.9 Кб, 13 просмотров)
0
3 / 3 / 0
Регистрация: 22.06.2017
Сообщений: 72
21.04.2026, 12:28  [ТС]
Спасибо всем, кто принимал участие в ответе на мой вопрос и огромное СПАСИБО Verevkin(у)!!!
Вопрос решен.
Цитата Сообщение от Verevkin Посмотреть сообщение
Вот исходник, я пошёл готовить ужин
Спасибо, что предоставили мне большую коллекцию функций. Если маразм не одолеет, они мне могут очень даже пригодятся. В частности, моя функция преобразования строки в код (в байт) занимает 256*3=768 строк кода + 10 (подготовительных), а у Вас короткое и элегантное решение.

Дальше можно не отвечать, а можно и ответить.

При попытке открытия проекта в Rad Studio получил сообщение, что не найден стиль 'Windows11 Modern Dark'
После загрузки Rad Studio зависла
Удалил запись "TStyleManager.TrySetStyle('Windows11 Modern Dark');" из файла проекта .dpr
Проект загрузился нормально.
При попытке запуска возникли ошибки в unit uRoutines
в функции
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// преобразование маски в строку типа "1, 2, 5...7, 10" (+19 ноя 2025)
function MaskToPrintPages(mask: NativeInt; const result_if_zero, prefix: string): string;
 ...
 ...
case count of
        0: continue;
 
        1: result:= if result = ''
                      then Format('%s%u', [prefix, idx])              // первый найденный номер
                      else Format('%s, %s%u', [result, prefix, idx]); // ОШИБКА 1
 
        2: result:= if result = ''
                      then Format('%s%u, %s%u', [prefix, idx - count + 1, prefix, idx])  // 2 первыx найденных номера
                      else Format('%s, %s%u, %s%u', [result, prefix, idx - count + 1, prefix, idx]); // // ОШИБКА 2
 
      else result:= if result = ''
                      then Format('%s%u…%s%u', [prefix, idx - count + 1, prefix, idx])   // 3 и более первыx найденных номера
                      else Format('%s, %s%u…%s%u', [result, prefix, idx - count + 1, prefix, idx]); // // ОШИБКА 3
      end; //case
Тип всех ошибок - [dcc64 Error] uRoutines.pas(1898): E2010 Incompatible types: 'string' and 'procedure, untyped pointer or untyped parameter'

Заключил блок case в фигурные скобки. ( по моему, эта функция не используется в интересующем меня блоке программы)
Запустил. Ошибка:
Delphi
1
2
3
4
5
6
7
8
procedure TFormMain.ButtonImportClick(Sender: TObject);
begin
  // Импорт изображений из DFM-текста в ImageList
  try
    var tmp:= StringToComponentProc(MemoDFM.Text);
    if tmp is not TCustomImageList
      then raise Exception.Create('Ошибка преобразования.');// ОШИБКА 4
     ...
Тип ошибки [dcc64 Error] ufMain.pas(101): E2015 Operator not applicable to this operand type
ТУТ ВОПРОС: Разве в Delphi разрешено объявлять переменные внутри тела функции? (var tmp:= StringToComponentProc(MemoDFM.Text)
А так можно:
Delphi
1
2
3
4
5
6
7
8
procedure ...
 var
  r:integer
 begin
  ...
  var S: string;
  S:='Вася';
 end;
Заключил проблему в фигурные скобки
Все заработало.
установил точки останова на вызов ButtonImportClick ( в теле процедуры) - не срабатывают (строки окрашены зеленым) Почему? (конфигурация Debug)

Огромное спасибо!
С уважением, Николай
0
Злостный нарушитель
 Аватар для Verevkin
10878 / 5817 / 1288
Регистрация: 12.03.2015
Сообщений: 26,855
21.04.2026, 12:50
Цитата Сообщение от NNK_RTR Посмотреть сообщение
Спасибо, что предоставили мне большую коллекцию функций.
Да на здоровье. Это не все, у меня их много наработалось за 25 лет стажа.
Цитата Сообщение от NNK_RTR Посмотреть сообщение
В частности, моя функция преобразования строки в код (в байт) занимает 256*3=768 строк кода + 10 (подготовительных), а у Вас короткое и элегантное решение.

Цитата Сообщение от NNK_RTR Посмотреть сообщение
Дальше можно не отвечать, а можно и ответить.
Это смотря как спрашивать будешь!

Добавлено через 7 минут
Цитата Сообщение от NNK_RTR Посмотреть сообщение
Тип всех ошибок - [dcc64 Error] uRoutines.pas(1898): E2010 Incompatible types: 'string' and 'procedure, untyped pointer or untyped parameter'
Всё потому, что я тут использую тернарный оператор if ... then ... else ... ;, который добавили в Delphi XE13. Обнови IDE или переделывай исходник сам, где нужно.
Цитата Сообщение от NNK_RTR Посмотреть сообщение
Тип ошибки [dcc64 Error] ufMain.pas(101): E2015 Operator not applicable to this operand type
Аналогично - про оператор is not.
Цитата Сообщение от NNK_RTR Посмотреть сообщение
Разве в Delphi разрешено объявлять переменные внутри тела функции?
Уже давно, имхо, в 2019 году, уже не помню, в какой версии компилятора это добавили. inline-объявления переменных это называется.
Цитата Сообщение от NNK_RTR Посмотреть сообщение
установил точки останова на вызов ButtonImportClick ( в теле процедуры) - не срабатывают (строки окрашены зеленым) Почему? (конфигурация Debug)
Тут причин может быть мильён, удалённо определить не могу, я не телепат.

Короче, поставь себе 13.1 и используй сразу 64-битную сборку IDE, чтоб не делать маме голову.
0
3 / 3 / 0
Регистрация: 22.06.2017
Сообщений: 72
21.04.2026, 15:39  [ТС]
Спасибо!!!

Удачи во всем!

С уважением, Николай.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.04.2026, 15:39
Помогаю со студенческими работами здесь

Извлечение ресурсов из .exe файла
Я хочу создать программу которая извлекала бы ресурсы из exe файла. И записывала бы в переменную....

Подгрузить картинку из webbrowser в imagelist
Дело токое нужно из webbrowser вытащить картинку и вставить её в imagelist. загружаю картинку так:...

Иконки и ImageList
Итак.... Вначале, конечно же, доброго темного времени суток, жители киберфорума! У меня есть...

Компонент ImageList
Всем доброго времени суток! у меня имеется combobox1, label1, button1, image1 , imagelist1 в...

Как в делфи привязать массив к компоненту imageList ???
как в делфи привязать массив к компоненту imageList ???


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
29
Ответ Создать тему
Новые блоги и статьи
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений. . . .
21 мат мед. Планы на развитие модели здравоСохранения
anaschu 01.06.2026
AnyLogic: план развития симуляционной модели рабочего коллектива — динамический абсентеизм, реальные данные, три сценария сравнения Продолжаю серию постов о дискретно-событийной модели рабочего. . .
20. Мат мед. Абсентеизм как отдельный тип простоя
anaschu 29.05.2026
Апдейт модели: исправленные баги, абсентеизм и новые механизмы Продолжаю развивать ранее описанную модель рабочего коллектива на AnyLogic. За последние несколько дней был проведён серьёзный. . .
19. здоровье, усталость и психотип работника влияют на производительность предприятия, и наоборот, производительность на здоровье, усталось и психотип
anaschu 28.05.2026
Дискретно-событийная модель рабочего коллектива на AnyLogic: здоровье, выгорание, психотипы и микростимуляция Привет, коллеги. Хочу поделиться итогами нескольких недель работы над симуляционной. . .
"Прокси" для последовательного порта
Eddy_Em 28.05.2026
Эту штуку написал я достаточно давно. Но сейчас вот понадобилось настроить датчик грозы, но при этом не отключать его от "метеодемона". Соответственно, надо запустить этот "прокси": метеодемон будет. . .
Рефакторинг программы уравнивания.
Massaraksh7 26.05.2026
Пример по предыдущей записи в блоге. Но, надо заметить, что, во-первых, там оптимизация не только математики, но и работы с базой данных, и с графами, а во-вторых, это ещё не всё.
Использование TThread в Lazarus для математических вычислений.
Massaraksh7 25.05.2026
Производя рефакторинг своих программ на предмет ускорения их работы, обратил внимание на такой аспект, как сокращение времени матвычислений. Дело в том, что приходится работать с большими матрицами. . .
Модель здравосохранения 18. Чем здоровее работник, тем быстрее выгорает
anaschu 24.05.2026
Имитационная модель корпоративного здравоохранения: что показывает математика Сегодня в модели рабочего коллектива на AnyLogic появились три новые механики — выгорание через накопленную усталость,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru