delphi資源文件製作及使用詳解

delphi資源文件製作及使用詳解

摘自:http://www.ej38.com/showinfo/delphi-131567.html

一、引子:
現在的Windows應用程序幾乎都使用圖標、圖片、光標、聲音等,我們稱它們爲資源(Resource)。最簡單的使用資源的辦法是把這些資源的源文件打入軟件包,以方便程序需要的時候調用。資源是程序的一部分,程序要正常運行就離不了資源文件。但是它是不可執行代碼。
爲了更好地管理資源,Delphi中提供了一種.RES類型的資源文件。它可以把我們程序中所需要的資源整合到一個資源文件(.RES)下來。在編譯應用程序時直接編譯進了可執行程序裏,成爲應用程序的整合體。
這樣做的好處是:1。由於定位資源比在磁盤中定位文件花費時間少,所以應用程序執行會更快。2。多種資源可以放在一個文件中,減少了圖標、圖片、光標、聲音等文件數量。不用怕用戶在使用過程中的不小心而損壞了資源文件致使程序無法正常運行。
缺點是:因爲資源文件的加入從而加大了編譯出的可執行程序的字節數,當資源文件較大時會使應用程序變得看起來雍腫。
使用資源文件的優點很顯著,其缺點也很突出。所以在實際應用中就要根據情況權衡利弊、靈活使用,這已不在本文的討論之列。下面僅就Delphi系統編程中對於資源文件的使用方法做一個大致的總結。
二、創建資源文件:
注意事項:創建的資源文件名不要和工程名相同,因爲Delphi創建工程時會自動創建一個和工程名相同的資源文件。並且最好將資源文件保存到和工程文件同一個文件夾中。
1.首先創建一個.Rc的純文本文件。格式如下:
資源標識符 關鍵字 資源文件名
格式說明:
① 資源標識符:程序中調用資源時的特定標號;
② 關鍵字:標識資源文件類型;例如:
Wave : 資源文件是聲音文件;
RCDATA: JPEG文件;
AVI : AVI動畫;
ICON : 圖標文件;
BITMAP: 位圖文件;
CURSOR: 光標文件;
RMI : RMI音樂文件;
MIDI : MIDI音樂文件
③ 資源文件名:加入的資源文件名(要帶擴展名,可以帶路徑名構成全文件名);
④ 舉例: MyWav WAVE "FileName.Wav"
MyMID MIDI "C:/My Documents/my music/canyon.MID"
MyAVI AVI "SpeedIs.AVI"
例中資源文件名可以不加引號。假設我們把上述三行保存成Sample.RC文件。
2。使用Borland資源編譯器(BRCC32.EXE)轉化.Rc文件成.Res文件。
在DOS命令行下輸入下列命令:
C: //轉在C:驅
CD/ //退回根目錄
CD/Program Files/Borland/Delphi7/Bin //進入BRCC32.EXE的所在目錄
Brcc32 Sample.Rc //把Sample.RC轉換成資源文件Sample.RES
注意轉換前需要把Sample.RC文件中指定的未帶全路徑名的文件Copy進當前目錄C:/Program Files/Borland/Delphi7/Bin中來,纔可保證轉成.RES文件不出錯。如果轉換過程沒有報錯,則成功。
三、引用資源文件
把上一步驟生成的資源文件Sample.RES放到要建立的工程的同一個目錄中來。
爲了存取我們的資源文件,必須告訴Delphi鏈接我們的資源文件到應用程序中。因此要在源代碼中加入一條編譯指令完成上述功能。這條指令必須緊跟在窗口指令後,如下形式:
{$R *.DFM} //Delphi自帶編譯指令
{$R Sample.RES}  //新加入的編譯資源文件的指令
不要刪除{$R *.DFM}指令,因爲這行代碼告訴Delphi鏈接下面的資源到窗口的資源中。
四、調用資源文件
1。存取資源文件中的位圖(Bitmap)
程序中如果想存取資源,必須調用一些Windows API函數。保存在資源文件中的位圖、光標和圖標可以通過調用LoadBitmap、LoadCursor和LoadIcon函數存取。
現舉例說明如何存取資源文件中位圖並顯示在Timage控件中。
procedure TfrMain.btnCanvasPic(Sender: TObject);
begin
Image1.Picture.Bitmap.Handle :=LoadBitmap(hInstance,'資源標識符');
end;
注:如果位圖沒有裝載成功,程序仍舊執行,但是Image將不再顯示圖片。可以根據LoadBitmap 函數的返回值判斷是否裝載成功,如果裝載成功返回值是非0,如果裝載失敗返回值是0。
另外一個存取顯示位圖的方法如下:
procedure TfrMain.btnLoadPicClick(Sender: TObject);
begin
Image1.Picture.Bitmap.LoadfromResourceName(hInstance,'資源標識符');
end;
2。存取資源文件中的光標
Screen.Cursors[]是一個光標數組,使用光標文件我們可以將定製的光標加入到這個屬性中。因爲默認的光標在數組中索引值是0,所以除非想取代默認光標,最好將定製的光標索引值設爲1。
procedure TfrMain.btnUseCursorClick(Sender: TObject);
begin
Screen.Cursors[1] :=LoadCursor(hInstance,'資源標識符');
Image1.Cursor :=1;
end;
3。存取資源文件中的圖標
將圖標放在資源文件中,可以實現動態改變應用程序圖標。
procedure TfrMain.LoadIconClick(Sender: TObject);
begin
Application.Icon.Handle := LoadIcon(hInstance,'資源標識符');
End;
4。存取資源文件中的AVI
在工程中添加一TAnimate控件(在Win32控件面板上),在需要的地方加入:
procedure TfrMain.LoadIconClick(Sender: TObject);
begin
Animate1.ResName :='MyAvi' ; //資源標識
Animate1.Active := True ;
End ;
實踐中的一點總結:並不是所有的AVI資源都可以用TAnimate組件來播放,編定程序時要測試。遇到不能用TAnimate組件來播放的AVI資源,則可以把它從資源文件裏分離出來,再使用相應的播放組件比如TMediaPlayer來播放。使用完再把分離出來的臨時文件刪除掉。可以參考後面 “7。”的說明。
5。存取資源文件中的JPEG
把jpeg單元加入到Interface的uses中。
procedure TForm1.LoadJPGClick(Sender: TObject);
var
Fjpg : TJpegImage ;
FStream : TResourceStream ;
begin
Fjpg := TJpegImage.Create ;
FStream := TResourceStream.Create(hInstance,'資源標識符',RT_RCDATA) ;
FJpg.LoadfromStream(FStream) ;
Image1.Picture.Bitmap.Assign(FJpg);
end;
6。存取資源文件中的Wave
把MMSystem加入到Interface的uses中
procedure TForm1.LoadWaveClick(Sender: TObject);
begin
PlaySound('MyWav',hInstance,Snd_ASync or Snd_Memory or snd_Resource) ;
end;
實踐中的一點結論:PlaySound()的參數Snd_ASync表示異步播放方式,Snd_Sync表示同步播放方式。(1)當採用異步方式的時候,WAV資源可以作爲背景音樂來應用;但是當有連續多次異步調用的時候,則可能會丟棄最後一次調用之前的所有播放,用戶得到的效果只是最後一次調用的聲音。(2)當採用同步方式的時候,WAV資源會獨佔資源,導致WAV文件未播放完之前用戶無法對應用程序進行任何操作,直至它的調用結束。所以如果有大的同步WAV資源時,會造成應用程序界面的停滯。但是這種方式卻可以連續地一個不漏地執行多次調用。
7。其他資源的調用:
可以把資源文件中的源文件分離出來,建立一個臨時的物理文件存在於應用程序路徑下,然後可以用相應類型的組件來或方法來使用該文件。當程序退出時再不忘把該臨時文件刪除掉。
例如:
var
tmpDirectory : string;
myres : TResourceStream;
begin
tmpDirectory := ExtractFilePath(paramstr(0));
if not FileExists(tmpDirectory + 'Music1.RMI') then
begin
myres := TResourceStream.Create(hinstance,'music1','RMI');
myres.SaveToFile(tmpDirectory + 'Music1.RMI');//從資源文件中分離出來
myres.Free;
。。。。。。。。。。
end;
程序退出的時候刪除:
if FileExists(tempDirectory + 'music1.RMI') then
DeleteFile(tempDirectory + 'music1.RMI');
五、結束語
位圖、光標和圖標、AVI動畫、JPEG和Wave文件等可以放到資源文件中。上面我們介紹瞭如何將資源加入到資源文件中,並介紹了在Delphi中動態存取資源文件的方法。Delphi編譯工程會自動創建一個和工程名相同的資源文件(如果沒有其他的資源,主窗口的圖標會放在這個資源文件中)。但是建議最好不要改變這個資源文件。
六、參考資料:
1。http://www.delphiok.com/bcjq/all/114.htm 來自Delphi技巧網;
2。http://www.delphibbs.com/delphibbs/dispq.asp?lid=2358589 ;
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2369429 ;
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2370212 ;來自大富翁論壇
特向以上網站和大富翁Wind8Bell、迷糊、miaofeng、app2001等表示感謝!
 
可以自己做一個RC文件,例如 sample.rc ,RC文件其實就是一個資源文件的描述文本,
通過“記事本”程序創建就行了。然後可以輸入一些我們要定義的資源,例如:
MEN BITMAP c:/bitmap/men.bitmap
ARJ EXEFILE c:/arj.exe
MOV AVI c:/mov.avi
然後用BRCC32把這個RC文件編譯成sample.res(真正的資源文件)。
在Delphi的工程文件中使用 $R 編譯指令讓Delphi包括資源到EXE文件裏面。
{$R sample.res}
這樣我們就可以在這個單一的執行文件中調用資源了。舉例如下:
EXEFILE:
procedure ExtractRes(ResType, ResName, ResNewName : String);
var
Res : TResourceStream;
begin
Res := TResourceStream.Create(Hinstance, Resname, Pchar(ResType)); Res.SavetoFile(ResNewName);
Res.Free;
end;
AVI:
procedure LoadAVI;
begin
{Avi1是一個TAnimate類}
Avi1.ResName:='AVI';
Avi1.Active:=True;
end;

分類: 編程
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章