Для того чтобы ресурсы были доступны программе, необходимо в текст программы включить инструкцию (директиву), которая сообщит компилятору, что в файл исполняемой программы следует добавить содержимое файла ресурсов.
В общем виде эта директива выглядит следующим образом:
{$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.
Преимущества загрузки картинок из ресурса программы очевидны: при распространении программы не надо заботиться о том, чтобы во время работы программы были доступны файлы иллюстраций, все необходимые программе картинки находятся в исполняемом файле.
Просмотр "мультика"
Теперь рассмотрим, как можно реализовать вывод в диалоговом окне программы простого "мультика", подобного тому, который можно видеть в диалоговом окне Установка связи при подключении к Internet.
Эффект бегущего между телефоном и компьютером красного квадратика достигается за счет того, что в диалоговое окно выводятся сменяющие друг друга картинки.
Кадры мультика обычно находятся в одном файле или в одном ресурсе. Перед началом работы программы они загружаются в буфер, в качестве которого удобно использовать объект типа TBitMap. Задача процедуры, реализующей вывод мультика, состоит в том, чтобы выделить очередной кадр и вывести его в нужное место формы.
Вывести кадр на поверхность формы можно применением метода copyRect к свойству canvas этой формы. Метод CopyRect копирует прямоугольную область одной графической поверхности на другую.
Инструкция применения метода CopyRect в общем виде выглядит так:
Canvas1.CopyRect (Область1, Canvas2, 06ласть2)
где:
- canvas1 — графическая поверхность, на которую выполняется копирование;
- Canvas2 — графическая поверхность, с которой выполняется копирование;
- параметр Область2 —- задает положение и размер копируемой прямоугольной области, а параметр область i — положение копии на поверхности Canvas1.
В качестве параметров область! и область2 используются структуры типа TRect, поля которых определяют положение и размер области.
Заполнить поля структуры TRect можно при помощи функции Bounds, инструкция обращения к которой в общем виде выглядит так:
Bounds(x,у,Width,Height)
где:
- х и у — координаты левого верхнего угла области;
- width и Height — ширина и высота области.
Следующая программа, текст которой приведен в листинге 10.12, выводит в диалоговое окно простой мультик — дельфийскую колонну, вокруг которой "летает" некоторый объект. На рис. 10.19 приведены кадры этого мультика (содержимое файла film.bmp).
Диалоговое окно программы приведено на рис. 10.20, оно содержит один единственный компонент — таймер.
Рис. 10.19. Кадры мультика
Рис. 10.20. Форма программы