Подключение файла ресурсов
Для того чтобы ресурсы были доступны программе, необходимо в текст программы включить инструкцию (директиву), которая сообщит компилятору, что в файл исполняемой программы следует добавить содержимое файла ресурсов.
В общем виде эта директива выглядит следующим образом:
{$R ФайлРесурсов}
Где ФайлРесурсов – имя файла ресурсов. Например, директива может выглядеть так:
{$R images.res}
Директиву включения файла ресурсов в файл исполняемой программы обычно помещают в начале текста модуля.
Примечание
Если имена файла модуля программы и файла ресурсов совпадают, то вместо имени файла ресурсов можно поставить "*". В этом случае директива включения файла ресурсов в файл исполняемой программы выглядит так:
{$R *.res}
Загрузить картинку из ресурса в переменную типа TBitMap можно при помощи метода LoadFromResourceName, который имеет два параметра: идентификатор программы и имя ресурса. В качестве идентификатора программы используется глобальная переменная Hinstance. Имя ресурса должно быть представлено в виде строковой константы.
Например, инструкция загрузки картинки в переменную Pic может выглядеть так:
Pic.LoadFromResourceName(Hinstance,'FACTORY');
В качестве примера в листинге 10.11 приведен текст программы, в которой изображение фона и самолета загружается из ресурсов.
Листинг 10.11. Пример загрузки картинок из ресурса.
unit aplanel_; {$R images.res} // включить файл ресурсов interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCTRLs, StdCTRLs, Buttons; type TForm1 = class (TForm) Timer1: TTimer; Image1: ТImage; procedure FormActivate(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); private { Private declarations } public { Public declarations } end; var Form1: TForm1; Back, bitmap, Buf: TBitMap; // фон, картинка, буфер BackRct, BufRet: TRect; // область фона, картинки, буфера х,у:integer; // координаты левого верхнего угла картинки W,H: integer; // размеры картинки implementation {$R *.DFM} procedure TForm1.FormActivate(Sender: TObject); begin Back: = TBitmap.Create; // фон bitmap: = TBitmap.Create; // картинка Buf: = TBitmap.Create; // буфер // загрузить из ресурса фон Back.LoadFromResourceName(HInstance,'FACTORY'); Forml.Image1.canvas.Draw(0.0,Back); // загрузить из ресурса картинку, которая будет двигаться bitmap.LoadFromResourceName(HInstance,'APLANE'); bitmap.Transparent: = True; bitmap.TransParentColor: = bitmap.canvas.pixels[1.1]; // создать буфер для сохранения копии области фона, на которую // накладывается картинка W: = bitmap.Width; Н: = bitmap.Height; Buf.Width: = W; Buf.Height: = H; Buf.Palette: = Back.Palette; // Чтобы обеспечить соответствие палитр!! Buf.Canvas.CopyMode: = cmSrcCopy; BufRct: = Bounds(0.0,W,H); x: = -W; y: = 20; // определим сохраняемую область фона BackRct: = Bounds(x,y,W,H); // и сохраним ее Buf.Canvas.CopyRect(BufRet,Back.Canvas, BackRct); end; procedure TForm1.Timer1Timer(Sender: TObject); begin // восстановлением фона (из буфера) удалим рисунок Form1.image1.canvas.Draw(x,y, Buf); x: = x+2; if x>form1.Image1.Width then x: = – W; // определим сохраняемую область фона BackRct: = Bounds(x,у,W,H); // сохраним ее копию Buf.Canvas.CopyRect(BufRct,Back.Canvas,BackRct); // выведем рисунок Form1.image1.canvas.Draw(x,y,bitmap); end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin Back.Free; bitmap.Free; Buf.Free; end; end.
Преимущества загрузки картинок из ресурса программы очевидны: при распространении программы не надо заботиться о том, чтобы во время работы программы были доступны файлы иллюстраций, все необходимые программе картинки находятся в исполняемом файле.