Работа с ресурсами в Delphi
Работа с ресурсами в Delphi
Работа с ресурсами в Delphi Windows поддерживает такие виды ресурсов: RT_ACCELERATOR Accelerator table RT_ANICURSOR Animated cursor RT_ANIICON Animated icon RT_BITMAP Bitmap resource RT_CURSOR Hardware-dependent cursor resource RT_DIALOG Dialog box RT_FONT Font resource RT_FONTDIR Font directory resource RT_GROUP_CURSOR Hardware-independent cursor resource RT_GROUP_ICON Hardware-independent icon resource RT_ICON Hardware-dependent icon resource RT_MENU Menu resource RT_MESSAGETABLE Message-table entry RT_RCDATA Application-defined resource (raw data) RT_STRING String-table entry RT_VERSION Version resource Самый простой из них это RT_STRING - то есть строковый. Для работы с ним предусмотрено специальное зарезервированное слово - resourcestring. Пример использования строковых ресурсов смотрите ниже. ================================================== unit StrConst; interface resourcestring SCreateError = 'Cannot create file'; SOpenError = 'Cannot open file'; SLineTooLong = 'Line too long'; implementation end. ================================================== Объявленные строковые ресурсы можно использовать как стандартные константы. Например: ================================================== unit Main; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls, ExtCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation uses StrConst; {$R *.DFM} procedure TForm1.Button1Click(Sender: TObject); var S: array [0..255] of Char; begin LoadString(HInstance, SLineTooLong, S, SizeOf(S)); ShowMessage(S); end; ================================================== Второй способ сделать то же самое немного сложнее, но он показывает принцип работы с ресурсами вообще. Для этого нам нужно создать включаемый файл myres.inc и в теле прописать константы, по которым мы будем обращаться к строковым ресурсам. ================================================== const SCreateError = 1; SOpenError = 2; SLineTooLong = 3; ================================================== Еще нам нужно создать ресурсный текстовый файл myres.rc. ================================================== #include "myres.inc"; STRINGTABLE { SCreateError, "Cannot create file" SOpenError, "Cannot open file" SLineTooLong, "Line too long" } ================================================== Обратите внимание, что теперь текст нужно брать в двойные кавычки. Теперь нам необходимо откомпилировать наш файл ресурсов. Создаем для удобства простой пакетный файл myres.bat, в который записываем такую строку ================================================== brcc32.exe myres.rc ================================================== Запускаем его на выполнение. Он должен создать скомпилированный файл ресурса myres.res. Если этого не произошло, то вам необходимо указать полный путь к файлу brcc32.exe. Это, как правило, C:\Program Files\Borland\DelphiX\Bin\brcc32.exe, где вместо X - номер вашей версии Delphi. Теперь подключаем myres.inc и myres.res в наш Main.pas. ================================================== unit Main; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls, ExtCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} {$R MYRES.RES} {$I MYRES.INC} procedure TForm1.Button1Click(Sender: TObject); begin ShowMessage(SLineTooLong); end; end. Теперь попробуем подключить к приложению свой курсор. Для этого необходимо: 1. Сначала в Image Editor'е или другом редакторе ресурсов создать свой курсор. Сохранить его под именем, например, Cursor.cur 2. Создаем файл MyCursor.rc, в теле которого записываем строку MyCursor CURSOR "cursor.cur" 3. Компилируем наш файл ресурса, набрав в командной строке brcc32 MyCursor.rc и получаем на выходе скомпилированный файл ресурса MyCursor.res. 4. В *.pas-файле добавляем ссылку на наш файл ресурса. {$R MyCursor.res} 5. Объявляем константу, по которой будем обращаться к нашему курсору. const crMyCursor = 1; Замечание. Для своих курсоров можно использовать только положительные значения. 6. Добавляем в список курсоров новый... Screen.Cursors[crMyCursor] := LoadCursor(HInstance, 'MyCursor'); 7. Подключаем, вместо курсора по умолчанию, свой курсор. Cursor := crMyCursor; 8. Запускаем приложение. //============================================ unit Main; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs; type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; const crMyCursor = 1; implementation {$R MyCursor.res} {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin Screen.Cursors[crMyCursor] := LoadCursor(HInstance, 'MyCursor'); Cursor := crMyCursor; end; end. //============================================ Подключение иконок и bitmap-ресурсов аналогично подключению курсоров. Мы попробуем подключить стандартные иконки и bitmap'ы. Это делается так. Image1.Picture.Icon.Handle := LoadIcon(0, PChar(IDI_APPLICATION)); Image2.Picture.Bitmap.Handle := LoadBitmap(0, PChar(OBM_ZOOM)); Для более подробной информации смотрите соответствующие функции WinApi. Теперь мы перешли к работе с определенными пользователем ресурсами. Мы попробуем подключить текстовый и *.avi-файл. 1. Берем из примеров Delphi файл cool.avi, который находится в каталоге C:\Program Files\Borland\DelphiX\Demos\Coolstuf\ 2. Создаем любой текстовый файл с именем app.txt и помещаем эти файлы к каталог нашего проекта. 3. Создаем текстовый файл ресурса MyRes.rc с телом MyText Text APP.TXT CoolAvi AVI cool.avi 4. Компилируем его... brcc32 myres.rc 5. Делаем изменения в *.pas-файле. 6. Запускаем. {*******************************************************} unit Main; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls; type TForm1 = class(TForm) Animate1: TAnimate; Memo1: TMemo; procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } procedure TextResource; procedure AVIResource; end; var Form1: TForm1; implementation {$R *.DFM} {$R MyRes.res} procedure TForm1.AVIResource; begin Animate1.ResName := 'CoolAvi'; Animate1.Active := True; end; procedure TForm1.FormCreate(Sender: TObject); begin TextResource; AVIResource; end; procedure TForm1.TextResource; var Resource: THandle; begin Resource := LoadResource(hInstance, FindResource(hInstance, 'MyText', 'TEXT')); Memo1.Lines.Text := PChar(LockResource(Resource)); UnLockResource(Resource); FreeResource(Resource); end; end.