Главная страница
    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.5 MB
Время: 0.037 c
3-1093190448
Flagman
2004-08-22 20:00
2004.09.19
Где найти описания EXCEPTION для ORACLE?


1-1093937207
8ung
2004-08-31 11:26
2004.09.19
Чтение байтов из файла


3-1092903581
Denizzz
2004-08-19 12:19
2004.09.19
Математические операции


14-1093948712
VID
2004-08-31 14:38
2004.09.19
Регистрация: что для этого нужно ?


8-1088505767
sashok
2004-06-29 14:42
2004.09.19
Проигрывание видео на форме.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский