Работа с ресурсами в Delphi

Автор статьи: alvas.hypermart.net
Сайт Автора: alvas.hypermart.net
E-mail Автора: нет
Дата публикации: 6.08.2005

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.