Підключення файлу ресурсів

Для того щоб ресурси були доступні програмі, необхідно в текст програми включити інструкцію (директиву), яка повідомить компілятору, що в файл виконуваної програми слід додати вміст файлу ресурсів.
У загальному вигляді ця директива виглядає наступним чином:

{$ R ФайлРесурсов}

де ФайлРесурсов – ім’я файлу ресурсів. Наприклад, директива може виглядати так:

{$ R images.res}

Директиву включення файлу ресурсів в файл виконуваної програми зазвичай поміщають на початку тексту модуля.

Примітка

Якщо імена файлу модуля програми і файлу ресурсів збігаються, то замість імені файлу ресурсів можна поставити “*”. В цьому випадку директива включення файлу ресурсів в файл виконуваної програми виглядає так:

{$ R * .res}

Завантажити картинку з ресурсу в змінну типу TBitMap можна за допомогою методу LoadFromResourceName, який має два параметри: ідентифікатор програми і ім’я ресурсу. В якості ідентифікатора програм ми використовується глобальна змінна Hinstance. Ім’я ресурсу повинно бути представлено у вигляді строкової константи.
Наприклад, інструкція завантаження картинки в змінну Pic може виглядати так:

Pic.LoadFromResourceName (Hinstance, 'FACTORY') ;

Як приклад в лістингу 10.11 наведено текст програми, в якій зображення фону і літака завантажується з ресурсів.

Лістинг 10.11. Приклад завантаження картинок з ресурс

unit < font face = "Courier New, Courier, mono"> 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.

Переваги завантаження картинок з ресурсу програми очевидні: при поширенні програми не треба піклуватися про те, щоб під час роботи програми були доступні файли ілюстрацій, всі необхідні програмі картинки знаходяться в виконуваному файлі.