Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.49 MB
Время: 0.042 c
3-1093332973
Некто
2004-08-24 11:36
2004.09.19
Запрос в файле БД vs программый запрос.


14-1093809510
Vasya.ru
2004-08-29 23:58
2004.09.19
Что за мода среди местных флудить вместо того чтобы промолчать


1-1093964958
Lord de Mon
2004-08-31 19:09
2004.09.19
Типы


1-1093402316
Александр1
2004-08-25 06:51
2004.09.19
Разделение строчек


3-1092904824
Slash
2004-08-19 12:40
2004.09.19
Удаление таблицы