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

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

17.04.2026, 19:11. Показов 1911. Ответов 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
10889 / 5825 / 1288
Регистрация: 12.03.2015
Сообщений: 26,888
20.04.2026, 13:12
Цитата Сообщение от NNK_RTR Посмотреть сообщение
Да, но ведь я преобразовываю строки в байты, не так элегантно, как Вы, но преобразовываю.
Сейчас попытаюсь создать ресурс методом GetResource, если получится, посмотрю, как он выглядит и попробую подменить.
Скажи честно, ну вот нахрена тебе всё это? Для чего ты это планируешь использовать?

Добавлено через 4 минуты
Цитата Сообщение от NNK_RTR Посмотреть сообщение
Да, но ведь я преобразовываю строки в байты, не так элегантно, как Вы, но преобразовываю.
И чо, получается?
0
Злостный нарушитель
 Аватар для Verevkin
10889 / 5825 / 1288
Регистрация: 12.03.2015
Сообщений: 26,888
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
10889 / 5825 / 1288
Регистрация: 12.03.2015
Сообщений: 26,888
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
10889 / 5825 / 1288
Регистрация: 12.03.2015
Сообщений: 26,888
20.04.2026, 18:48
Цитата Сообщение от NNK_RTR Посмотреть сообщение
Основное - чтобы мозги не усохли (мне 75).
Это похвально. Вот исходник, я пошёл готовить ужин.
Вложения
Тип файла: 7z thread3222309.7z (222.9 Кб, 17 просмотров)
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
10889 / 5825 / 1288
Регистрация: 12.03.2015
Сообщений: 26,888
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
Ответ Создать тему
Новые блоги и статьи
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть не большие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru