資源也是數據,它相當於我們熟悉的只讀數據。在應用程序的可執行代碼中,它是單獨存儲的,當其被調用時才載入程序,在程序執行完後又退出。Delphi中的資源有很多類型,適用於不同的地方,大致有以下幾類:
●圖標資源:是一種小型位圖,用戶常常用不同的圖標代替不同的應用程序。
●光標資源:也是小型的位圖,不過它適用的顏色不多。Delphi已經給光標指定了一個光標圖案集,就是我們操作中常用到的Cursor屬性,同時用戶也可自定義光標圖案。
●位圖資源:Delphi只是將位圖資源存入資源文件中,在使用時從資源文件中調出。
●字符串資源:將字串符文件存儲於資源文件中。
本文通過實例程序來說明資源在Delphi中的用法,所有示例程序均在Delphi 4中調試通過。
1、生成資源文件
在Delphi中提供了一個圖形編輯器(Image Editor),通過該編輯器可以編輯生產Bitmap、Icon和Cursor三種資源文件,也可以直接繪制ICO、CUR和BMP文件。該編輯器不能進行文字處理,具體文字處理在後面介紹。編輯圖形類資源文件時,首先啟動Image Editor,選擇:File->New->Resource File ;在彈出的窗口中用鼠鍵右鍵單擊“Contents”,再彈出的菜單中單擊:New ;選擇需要編輯的資源文件的類型(Bitmap、Icon或Cursor)。
2、裝載與使用資源文件
資源文件編輯生成後(文件名後綴為.res),要使用這些資源文件,首先要通過添加代在表單文件的implementation關鍵字中加入:
{$R *.DFM}
{$R 資源文件名.RES}
定義了資源文件並且在單元文件中包括了資源文件名,需要調用Windows的API函數調用資源文件裡的內容,如:LoadIcon,LoadString,LoadBitmap,LoadResource等。
例如:下面的語句裝入了一個名為mybmp.bmp的文件:
Bmp.Handle := LoadBitmap(Hinstance , mybmp.bmp);
下面示例程序說明了圖標、光標和位圖資源的使用方法,在資源文件TEST.RES中定義了兩個光標(cur1和cur2)、兩個位圖(bmp1和bmp2)以及兩個圖標(in1和in2),在程序中對這些資源都進行了調用。並利用定時器使位圖和圖標的顯示有類似動畫的感覺。當鼠標移動到Ladel1上時,光標會變成你定義的第一個光標形狀;當單擊Button1後,再把光標移到Ladel1上時,光標會變成你定義的第二個光標形狀。
unit testtes;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
Label1: TLabel;
Button1: TButton;
Image1: TImage;
Timer1: TTimer;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
bmp12 : Integer;
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
{$R TEST.RES}
const
crMycur1 = 1;
crMycur2 = 2;
procedure TForm1.FormCreate(Sender: TObject);
var
bmp : TBitmap;
ico : TIcon;
begin
Screen.Cursors[crMycur1] := LoadCursor(Hinstance,CUR1);
Screen.Cursors[crMycur2] := LoadCursor(Hinstance,CUR2);
Label1.Cursor := crMycur1;
bmp := TBitmap.Create ;
bmp.Handle := LoadBitmap(Hinstance,BMP1);
Image1.Width := bmp.Width + 10;
Image1.Height := bmp.Height + 10;
Image1.Canvas.Draw(4,8,bmp);
bmp12 := 1;
ico := TIcon.Create ;
ico.Handle := LoadIcon(Hinstance,IN1);
Icon := ico;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Label1.Cursor := crMycur2;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var
bmp:TBitmap;
ico : TIcon;
begin
bmp := TBitmap.Create ;
ico := TIcon.Create ;
if bmp12=1 then bmp12 := 2 else bmp12 :=1;
bmp.Handle := LoadBitmap(Hinstance,PChar(BMP+IntToStr(bmp12)));
ico.Handle := LoadIcon(Hinstance,PChar(IN+IntToStr(bmp12)));
Image1.Width := bmp.Width + 10;
Image1.Height := bmp.Height + 10;
Image1.Canvas.Draw(4,6,bmp);
Icon := ico;
end;
end.
3、字符串資源的定義與使用
字符串的存儲在應用程序中是獨立的,應用程序只有在使用資源時載入,使用完之後清除,從而節省內存,同時字符串也可以用於翻譯,一些漢化軟件都利用了字符串。編輯的字符串放在一個文本文件中,可以使用Delphi中的:File->New->Text,編輯字符串文件,字符串文件的格式如下:
stringtable
begin
1,"book"
2,"apple"
3,"desk"
4,"pen"
5,"computer"
end
編輯完字符串文件後,選擇Save as,注意要將文件類型改為資源編譯文件(.RC),這還不是資源文件,它還必須經過編譯才能成為資源文件(.RES)。編譯命令為Dos提示符下的BRCC32,其路徑為:D:Program FilesBorlandDelphi4Binrcc32.exe ;例如上面的字符串資源編譯文件名為:StrRes.rc,在DOS提示符下輸入:brcc32 mydirStrRes.rc ;則編譯後會生成一個名為:StrRes.res的資源文件,使用該文件即可訪問字符串資源。具體使用見下例:
unit teststr;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
count : integer;
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
{$R StrRes.RES}
const
wordcount = 5;
procedure TForm1.Button1Click(Sender: TObject);
var
strword : string;
begin
if count>wordcount then count := 1;
strword := LoadStr(count);
label1.Caption := strword;
count := count + 1;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
label1.Caption := LoadStr(1);
count := 2;
end;
end.
程序中常量wordcount用來記錄字符串資源文件中字符串的數量,變量count用來記錄顯示的字符串編號。程序運行後單擊Button1按鈕,則將循環顯示字符串資源文件中的每一個字符串。