一.編寫 RC 指令碼文本
用記事本或其它文字編輯器編寫一個副檔名為“.rc”的檔案。格式如下:
AVI 無聲動畫
BITMAP 位元影像檔案
CURSOR 游標檔案
ICON 表徵圖檔案
WAVE 音效檔
以上所列均為標準資源類型,也可以給資源自訂一個類型,如:“mytype”。不過兩者在調用方式上有些不同(在後面樣本“存取資源檔中的位元影像”中有詳細描述)。
二.根據 RC 指令檔編譯成 RES 資源檔
在命令提示字元中輸入以下內容:
brcc32 FileName.rc //註:brcc32.exe在DelphiX/Bin目錄中
三.在Delphi單元中加入資源檔
將產生的 RES 資源檔複製到相應程式所在的目錄中,在單元檔案中的“{$R *DFM}”後面加上“{$R FileName.res}”,編譯後資源檔就被包含在可執行檔中了。
說明:如果嫌2、3兩步麻煩,可以採用更簡便的做法,即:將 RC 檔案直接添加到項目中,在編譯Delphi項目時,會自動編譯該資源檔。
四.資源檔調用樣本
(1)存取資源檔中的位元影像
//RC: testBmp bitmap res/test.bmp
Image1.Picture.Bitmap.LoadFromResourceName(HInstance, 'res/test.bmp');
//RC: testBmp bmptype res/test.bmp
var
resStream: TResourceStream;
begin
resStream := TResourceStream.Create(HInstance, 'testBmp', 'bmptype');
Image1.Picture.Bitmap.LoadFromStream(resStream);
resStream.Free;
end;
請注意上面兩種調用方式的不同之處。
(2)存取資源檔中的表徵圖
將表徵圖放在資源檔中,可以實現動態改變應用程式的表徵圖。
//RC: testIcon icon res/test.ico
Application.Icon.Handle := LoadIcon(HInstance, 'testIcon');
(3)存取資源檔中的AVI動畫
//RC: testAvi avi res/test.avi
Animate1.ResName := 'testAvi';
Animate1.Active := True;
(4)存取資源檔中的JPEG映像
為了能夠處理JPEG映像,必須在Interface處引用JPEG單元。
var
jpg: TJPEGImage;
resStream: TResourceStream;
begin
jpg := TJPEGImage.Create;
resStream := TResourceStream.Create(HInstance, 'testJpg', 'jpgtype');
jpg.LoadFromStream(resStream);
Image1.Picture.Assign(jpg);
jpg.Free;
resStream.Free;
end;
附:Delphi編程中資源檔的應用:初級應用篇
資源檔一般為副檔名為res的檔案.在VC中資源檔用得非常普遍,但Delphi在其線上說明中對資源檔沒作什麼介紹,其實利用其內建的資源編譯工具BRCC32.EXE(一般位於/Delphi/BIN目錄下),我們完全可以做出跟VC一樣效果的檔案來。
資源檔最大的好處是能將一些在必要時才調用的檔案跟可執行檔一起編譯,產生一個檔案.這樣做最大的好處就是使外部檔案免遭破壞.例如在一條程式中你要臨時調用一幅圖片,一般作法是把圖片放在某一路徑下(通常是主程式所在路徑),但如果使用者路徑誤刪你的圖片檔案,則可能使程式找不到相應檔案而出錯崩潰.另外,如果你想自己的程式介面美觀,想用一些自訂游標,也要用到資源檔。
資源檔的使用步驟為:
一.編寫rc指令碼文本
用記事本或其它文字編輯器編寫一個副檔名為rc的檔案。例如:
mycur cursor move.cur //加入游標
mypic Bitmap Water.BMP //加入位元影像
mywav WAVE happy.wav //加入聲音
myAVI AVI EPOEN.AVI //加入視頻
myIco ICON CJT.ICO //加入表徵圖
格式分別為在資源檔中的名稱->類型->實際檔案名稱,例如上面第一行定義一個名為mycur的游標,實際名稱為加入游標move.cur.
二.將rc檔案編譯成res資源檔
將指令檔和實際檔案拷到Brcc32.EXE所在目錄,執行DOS命令。格式為:Brcc32 指令檔(斷行符號),例如有一名為myfirst.rc的指令檔,則執行 Brcc32 myfirst.rc(斷行符號)即可。如果你是懶人,也可建立一批次檔,內容只有一行:Brcc32 mufist.rc.(因為Delphi安裝後一般會在自動批次檔中指明搜尋路徑的。)如果編譯成功,則會產生一個結尾為res的檔案,這個檔案就是我們需要的資源檔。
三.在Delphi單元中加入資源檔
將產生的res資源檔拷貝到你所編程式的路徑下,在單元檔案{$R *DFM}後加上一句{$R mufirst.res},則將res檔案加入去,編譯後資 源檔案即已包含在可執行檔中了。若你有多個資源檔,也按上法依次加入。
四.在Delphi程式中調用資源檔
資源檔在Delphi中的關鍵字為hinstance.下面給出具體用法.
1.游標的調用
首先在程式中定義一個值大於0的常量,因為Delphi本身用0-負16來索引預設的游標,所以我們制定的游標應從表面上1開始索引。然後在視窗的Oncreat事件中添加以下代碼:
screen.cursor[35]:=Loadcursor (hinstance,'mycur');
其中35為大於1的常量,mycur為游標在資源檔中的名字。如果希望在其他控制項上使用定製游標,例如Panel控制項,只需在程式的適當處加入以下代碼:
Panel1.cursor:=35;
2.位元影像的調用
建立一項工程,添加一Timage控制項,在需要顯示的地方寫以下代碼:
Var mymap:Hbitmap;
begin
mymap:=LoadBitmap(hinstance,'mypic');
Image1.picture.Bitmap.Handle:=mymap;
end;
其中"mypic"為位元影像資源檔中的名稱。
3.AVI檔案的調用
建立一工程,添加一Animate控制項,在需要的地方加入:
animater1.resname:='myAVI';
animater1.Active:=true;
其中myAVI為視頻檔案在資源檔中的名稱。
4.調用WAV檔案
在uses中加入mmsystm單元,以便在程式中播放WAV檔案。播放時Playsound(pchar('mywav'),hinstance,sndsync or snd_resource);其中mywav為音效檔在資源中的名稱。
5.加入游標
加入游標比較容易,只要將res檔案加入單元檔案中即可。但需注意,名稱最好取"W"."WW"等,使第一個字母盡量靠後,以免與主程式的表徵圖順序顛倒。這樣一來,別人在使用你的程式時如果想選擇其它表徵圖就有很多選擇了。
補充:
1.資源類型除上述類型外,還可以字型檔,字串檔案等。
2.資源檔不但可以在標準圖形介面下使用還可在控制台下使用。
下面我們來實驗一下:
建立一工程,將唯一的一個Form刪除,然後修改工程檔案。增加一句{$Apptype console},在uses子句中加入mmsystem,並將其它引用單元刪掉。將Begin和end之間語句刪掉。至此,我們就可和Turbo PASCAL下編程式一樣,且還可以調用windows的API和資源。將資源檔----{$R myfist.res}加入。在Begin和end之間寫下:
writeln('示範程式,按任意鍵開始!');
readln;
playsound(pchar('mywav'),hinstance,snd_sync or snd_resource);
writeln('示範結束!');
運行程式,將彈出一個標準DOS視窗,按任意鍵播放音效檔。是不是很COOL呢!我曾下載過一個播放器,在其安裝目錄下我發現有一"DOS程式",用滑鼠雙擊它便彈出一個DOS視窗,顯示DOS時代特有的畫圖,並有背景音樂!可能就是用這個方法做的。
3.Delphi本身內建了一個叫Image Editor的工具,同樣可以編輯資源文本,但和本文的方法比較,可得出下表:
| Image |
Editor |
Brcc32 |
| BMP |
只支援16位色 |
任意色 |
| 游標 |
黑白兩色 |
任意色 |
| ICO |
只支援16位色 |
任意色 |
| AVI |
不支援 |
支援 |
| WAV |
不支援 |
支援 |
| 字串 |
不支援 |
支援 |
上面說的是直接在程式本身的調用。其實資源檔還有其它用法。比如說在你的程式攜帶其它檔案,要用的時候釋放出來。
例如: myexe exefile 'ha1.exe'//指令檔
下面是自訂釋放函數ExtractRes,本例中使用如下:
ExtractRes('exefile','myexe','c:/new.exe');
就把ha1.exe以new.exe為名字儲存到C盤根目錄下了.
function TForm1.ExtractRes(ResType, ResName, ResNewName: string): boolean;
var
Res: TResourceStream;
begin
try
Res := TResourceStream.Create(Hinstance, Resname, Pchar(ResType));
try
Res.SavetoFile(ResNewName);
Result := true;
finally
Res.Free;
end;
except
Result := false;
end;
end;