Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.03.07;
Скачать: [xml.tar.bz2];




Вниз

Теория и практика работы с ресурсами. 


Андрей Сенченко   (2002-02-11 10:27) [0]

Теория мне известна:
1. Создать некий RC файл.
2. Обработать его программой brcc32.exe
3. Подключить готовый ресурс через {+R}
4. Наслаждаться использованием.

С практикой сложнее:
1. В свой ресурс нужно вставить:
(1.1.) несколько иконок ( надоело грузить просто с диска - хочу чтоб красиво было )
(1.2.) ДОС-овский RAR. Ну не хочу я хранить его отдельно на диске, а использую активно.
Вопрос* : а собственно каков формат того самого RC файла ? Хотя бы в моем конкретном случае. И где найти его описание на будущее ? Запуск brcc32.exe /? не совсем помог - слишком быстро гасится окно - читать не успеваю :)

2. и 3. Вопросов вроде как нет

4. Наслаждаться не совсем получаеися - тупым поиском по F1 не удалось найти тот самый набор функций, который отвечает за обработку ресурсов ( может неправильно слово по-английски пишу ).
Вопрос* : Подскажите пожалуйста хотябы процедуру типа LoadFromМойРесурс - дальше сам по ссылкам накопаю.

Спасибо



Виктор Щербаков   (2002-02-11 10:47) [1]

1. В меню IDE пункт:
Project/Resources
решит многие проблемы, ИМХО, намного проще, чем brcc32.exe.

4. В SDK Resource Functions внимательно смотрел?



Андрей Сенченко   (2002-02-11 10:53) [2]

4. >> ( может неправильно слово по-английски пишу ).
Вопрос снят.
По 1-му пока нет



Digitman   (2002-02-11 10:54) [3]

>>"..слишком быстро гасится окно - читать не успеваю"
На то есть CommandPrompt-меню : вызови его и запусти brcc32.exe командной строкой

В составе Wi32API есть вызовы FindResource() и LoadResource(), отвечающие за поиск и загрузку в память заданных ресурсов заданного типа в/из заданного модуля. Универсальней, чем эти вызовы, не найдешь.



Андрей Сенченко   (2002-02-11 11:03) [4]

>> Digitman © (11.02.02 10:54)
>> На то есть CommandPrompt-меню : вызови его и запусти
>> brcc32.exe командной строкой
Что практически и было. Из под Windows Commander 5.0. Видимо, где-то валяется ярлык с галкой "Закрывать по завершении"

И все-таки ... Раскроет кто-нибудь тайну структуры RC-файла ?



Digitman   (2002-02-11 11:17) [5]

>>"Из под Windows Commander 5.0"
Никакого ярлыка нет. brcc32.exe - консоль. Вызови меню "Program|Accessories|CommandPrompt" и в открывшемся окне, эмулирующем DOS-консоль, запусти brcc32 ком.строкой - консольный вывод brcc32 будет направлен в тек.активное окно эмулятора DOS-консоли и исчезнет вместе с его закрытием по команде EXIT.

Не понял) *.RC - обычный текстовый формат, описывающий ресурсы на спец.языке. Ты же сам его и создавал для передачи на обработку в brcc32, а теперь формат его выясняешь ?



Андрей Сенченко   (2002-02-11 11:27) [6]

Digitman © (11.02.02 11:17)
>> Не понял) *.RC - обычный текстовый формат, описывающий
>> ресурсы на спец.языке. Ты же сам его и создавал для
>> передачи на обработку в brcc32, а теперь формат его выясняешь ?

Ну не создавал я его. Не создавал. Смотри собствеено мой первый вопрос. Я ЗНАЮ, что его НУЖНО создать, но я НЕ ЗНАЮ как его написать



Digitman   (2002-02-11 11:31) [7]

Вот, к примеру, строчка, которую нужно поместить в *.RC-файл для подключения к ресурсам некоего файла :

MYFILE RCDATA "SOMEFILE.EXT"



Андрей Сенченко   (2002-02-11 11:35) [8]

Угумс. Осталось выяснить возможные варианты того самого RCDATA
Это ведь может быть и программа и, и иконка, и все что угодно. Ну Сергей, ну что так сложно ссылку дать на раздел хелпа или книжку ? Я ведь не прошу писать этот файл за меня - у самого руки имеются.



McSimm   (2002-02-11 12:44) [9]

Есть способ приятнее brcc32.exe. Достаточно добавить к проекту файл .rc (Project/Add to Project), или в файле проекта вставить:
{$R "myfile.res" "myfile.rc"}
После этого компилятор сам будет отслеживать изменения и компилировать файл ресурсов.
Описание формата я и не искал - пользовался найденными образцами. Но оно есть в MSDN: вот неполный перечень тех самых ключевых слов:
ACCELERATORS,BITMAP,CURSOR,DIALOG,DIALOGEX,FONT,ICON,MENU,MENUEX,MESSAGETABLE,POPUP,RCDATA,STRINGTABLE,VERSIONINFO



Digitman   (2002-02-11 12:53) [10]

RCDATA - нетипизированный ресурсный тип. В ресурсах такого типа может храниться все, что угодно, но интерпретация/обработка считанных ресурсов такого типа возлагается на приложение, поскольку ОС не имеет никаких предположений о содержимом таких ресурсов : она лишь грузит/выгружает из в/из памяти. Прочие ресурсные типы (CURSOR, ICON, MENU, ACCELERATOR и т.п.) являются стандартными ресурсами Windows, и их интерпретация/обработка может производиться встроенными средствами ОС

Вот здесь скачиваешь дистрибутив ResHacker.
http://rpi.net.au/~ajohnson/resourcehacker/

Открыв с помощью него, к примеру, EXCEL.EXE, сохраняешь его ресурсы в формате *.RC, открываешь полученный RC-файл с помощью любого текст.ред-ра и внимательно изучаешь его содержимое, сопоставляя с уже имеющимися у тебя представлениями и описанием вышеупомянутых Win32API-вызовов (FindResource и LoadResource) в Delphi Win32API SDK help и MSDN.



Андрей Сенченко   (2002-02-11 12:58) [11]

YES !!!
Вот теперь ОГРОМНОЕ СПАСИБО !!!



NailS   (2002-02-11 15:10) [12]

Возник вопрос собственно по теме.
Как динамически (в RunTime) загрузить ресурсы в приложение и потом их использовать?



Юрий Зотов   (2002-02-11 16:17) [13]

NailS © (11.02.02 15:10)

Cм. TResourceStream.



Pete   (2002-02-11 16:50) [14]

Зачем досовский РАР??? есть в раре PAS с прототипами



NailS   (2002-02-11 17:18) [15]

Что-то не получается найти ресурс по идентификатору (и имени тоже).
Поправте, где я не правильно делаю.
Собрал Res файл, который содержит 2 иконки.
(RC-файл выглядит как
123 ICON "0.ico"
222 ICON "1.ico")

Далее включил этот файл в длл, как
library Test;
{$R Oper.RES}
begin
end.


В приложении пытаюсь достать иконки таким способом


ResourceHandle := LoadLibrary("test.dll");
aResStream := TResourceStream.Create(ResourceHandle,"#123","RT_ICON");


В результате функция FindResource возвращает значение 0, т.е. ресурс не найден ;(



Андрей Сенченко   (2002-02-11 17:28) [16]

>> Pete © (11.02.02 16:50)
>> Зачем досовский РАР??? есть в раре PAS с прототипами

Надо значит надо :) Есть определенные требования начальства, от которых лучше не отходить - пусть он хоть Лексикон захочет в свое приложение встроить



Digitman   (2002-02-11 17:51) [17]

>NailS
1. TResourceStream предназначен, в 1-ю очередь, для работы с ресурсами типа RT_RCDATA, хранящих потоковый образ сохраненных объектов класса TComponent.

2.>>"В результате функция FindResource возвращает значение 0, т.е. ресурс не найден"
В каком результате ? Где в твоем коде хоть какое-то упоминание о вызове FindResource() ? Как ты вызываешь эту ф-цию ? Зачем она вообще тебе потребоваоась, если всю рутинную работу по поиску и загрузке ресурса ты уже переложил на тело конструктора объекта TResourceStream ? Тем более, что, насколько понятно из твоего объяснения, вызов конструктора не вызвал исключение, а, значит, указанный ресурс был локализован и загружен в память успешно !



NailS   (2002-02-11 18:04) [18]

> Digitman

Сорри, в предыдущем сообщении написал сумбурно.
FindResource вызывается в функции Initialize класса TResourceStream,
HResInfo := FindResource(Instance, Name, ResType);
if HResInfo = 0 then Error;

а Initialize , в свою очередь, вызывается уже в конструкторе класса TResourceStream.
И вот, собственно говоря, FindResource 0 и возвращает.

А как мне иконки достать?



Digitman   (2002-02-11 18:34) [19]

А ты вообще в курсе, что, когда какой-либо WinAPI-вызов дает отказ, можно (и следует !) получить детальную инф-цию об отказе, как сие предписывает MS ?

"возвращает значение 0, т.е. ресурс не найден " - на основании чего ты сделал такой вывод ? Ты получил сообщение об исключении именно с таким "приговором" или это только предположение твое ?



NailS   (2002-02-11 19:30) [20]

Исходя из исходников TResourceStream
if HResInfo = 0 then Error;
procedure Error;
begin
raise EResNotFound.CreateFmt(SResNotFound, [Name]);
end;

SResNotFound = "Resource %s not found";

А SysErrorMessage(GetLastInfo) возвращает "Указанный тип ресурса в файле образа отсутствует"
Подставлял другие значения ResType, рузультат тот же.
Причем MicroAngelo эти иконки в длл отоброжает правильно.
Может я длл неправильно собрал или имя ресурса ввожу неверно?



Иван Шихалев   (2002-02-11 21:00) [21]

Во-первых, не "RT_ICON", а RT_ICON, а во-вторых, не RT_ICON, а RT_ICON_GROUP, а потом его разбираешь и загружаешь уже RT_ICON. Дело в том, что иконки и курсоры хранятся не единым куском, а достаточно хитрой структурой. В качестве примера работы с ней я уже давно выложил в кладовку "Icon Extractor" http://delphi.mastak.ru/cgi-bin/download.pl?look=1&id=1004556220&n=2 . Он извлекает только иконки, работа с курсорами выглядит полностью аналогично, только вместо RT_ICON и RT_ICON_GROUP, RT_CURSOR и RT_CURSOR_GROUP соответственно.



Esa   (2002-02-19 11:34) [22]

Удалено модератором



Anatoly Podgoretsky   (2002-02-19 23:19) [23]

Андрей Сенченко © (11.02.02 11:35)
Это пред-определенный тип, наряду с другими, приведенными в ответах, но МС не ограничивает тебя в использование типов, сожешь создавать свои пользовательские с любым именем, например

FARRES FAR PATH\FAR.EXE

То есть в упрощенном синтаксисе

ИМЯ ТИП ПУТЬ



Esa   (2002-02-20 09:40) [24]

Извините, но я что-то не понял, почему мой вопрос был удален модератором?
Я не по теме спросил или что-то другое?



Иван Шихалев   (2002-02-20 16:48) [25]

Просто вопросы нужно в отдельной ветке задавать.




Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.03.07;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.78 MB
Время: 0.056 c
3-19055           Bormanoid             2002-02-07 21:58  2002.03.07  
Смена позиции курсора или Query.RecNo глючит...


7-19362           Игорь-Х               2001-11-16 21:59  2002.03.07  
Помогите скомпилировать *.rc файл в *.res ?


3-19085           fag2000@ok.ru         2002-02-07 14:08  2002.03.07  
Проблема с TDBGrid


14-19338          AZ                    2002-01-23 06:36  2002.03.07  
Отладка


3-19065           Ulikoff               2002-02-07 11:20  2002.03.07  
Ошибка сетевого доступа к БД