Текущий архив: 2004.09.19;
Скачать: CL | DM;
Вниз
Как правильно вставить ресурс-иконку в исполнительный файл Найти похожие ветки
← →
Jetus © (2004-09-02 00:34) [0]Доброго времени суток! Мастера, помогите решить такую проблему.
Я при помощи функций BeginUpdateResource(), UpdateResource() и EndUpdateResource занёс в ехе-шник свою иконку. Потом я просмотрел этот ехе-шник при помощи ResHacker"a. Иконка (сам ресурс) там появилась, но не отображалась, как остальные. В чём же проблема?
Вот кусок кода, который у меня всё делает:
procedure TForm1.Button1Click(Sender: TObject);
var
FileWnd : THandle;
Ico: TIcon;
begin
FileWnd := BeginUpdateResource("C:\nine\nine.exe", FALSE); // Наш ехе-шник
Ico := TIcon.Create;
Ico.LoadFromFile("C:\my_icon.ico"); // Моя иконка
if UpdateResource(FileWnd, RT_ICON, "1", LANG_RUSSIAN, Ico, 766) then
Label1.Caption := "Success!" else Label1.Caption := "Failed...";
EndUpdateResource(FileWnd, FALSE);
Ico.Free;
end;
766 - это размер моей иконки.
С текстом у меня всё нормально, а вот с иконкай лажа. В чём же баг?
← →
Rem (2004-09-02 09:10) [1]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.
← →
Digitman © (2004-09-02 11:05) [2]http://delphimaster.net/view/4-1094070719/
Страницы: 1 вся ветка
Текущий архив: 2004.09.19;
Скачать: CL | DM;
Память: 0.5 MB
Время: 0.037 c