一. 現在的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.btnUseCursorClick(Sender: TObject);begin Screen.Cursors[1] :=LoadCursor(hInstance,'資源標識符'); Image1.Cursor :=1;end;
4。存取資源文件中的AVI
在工程中添加一TAnimate控件(在Win32控件面板上),在需要的地方加入:
procedure TfrMain.btnUseCursorClick(Sender: TObject);begin Screen.Cursors[1] :=LoadCursor(hInstance,'資源標識符'); Image1.Cursor :=1;end;實踐中的一點總結:並不是所有的AVI資源都可以用TAnimate組件來播放,編定程序時要測試。遇到不能用TAnimate組件來播放的AVI資源,則可以把它從資源文件里分離出來,再使用相應的播放組件比如TMediaPlayer來播放。使用完再把分離出來的臨時文件刪除掉。可以參考后面 “7。”的說明。
5。存取資源文件中的JPEG
把jpeg單元加入到Interface的uses中。
procedure TfrMain.btnUseCursorClick(Sender: TObject);begin Screen.Cursors[1] :=LoadCursor(hInstance,'資源標識符'); Image1.Cursor :=1;end;
6。存取資源文件中的Wave
把MMSystem加入到Interface的uses中
procedure TfrMain.btnUseCursorClick(Sender: TObject);begin Screen.Cursors[1] :=LoadCursor(hInstance,'資源標識符'); Image1.Cursor :=1;end;實踐中的一點結論:PlaySound()的參數Snd_ASync表示異步播放方式,Snd_Sync表示同步播放方式。(1)當采用異步方式的時候,WAV資源可以作為背景音樂來應用;但是當有連續多次異步調用的時候,則可能會丟棄最后一次調用之前的所有播放,用戶得到的效果只是最后一次調用的聲音。(2)當采用同步方式的時候,WAV資源會獨占資源,導致WAV文件未播放完之前用戶無法對應用程序進行任何操作,直至它的調用結束。所以如果有大的同步WAV資源時,會造成應用程序界面的停滯。但是這種方式卻可以連續地一個不漏地執行多次調用。
7。其他資源的調用:
可以把資源文件中的源文件分離出來,建立一個臨時的物理文件存在於應用程序路徑下,然后可以用相應類型的組件來或方法來使用該文件。當程序退出時再不忘把該臨時文件刪除掉。
例如:
procedure TfrMain.btnUseCursorClick(Sender: TObject);begin Screen.Cursors[1] :=LoadCursor(hInstance,'資源標識符'); Image1.Cursor :=1;end;程序退出的時候刪除:
procedure TfrMain.btnUseCursorClick(Sender: TObject);begin Screen.Cursors[1] :=LoadCursor(hInstance,'資源標識符'); Image1.Cursor :=1;end;
一個利用res將文件還原的事例
先用記事本等任何文本編輯器編寫文件“MyMusic.RC”。文件的格式及內容如下:
SRC1 FILE1 a.mp3
SRC2 FILE2 b.mp3
SRC3 FILE3 c.mp3
注意:以上三文件最好與 MyMusic.RC放在同一目錄下。
然后,在開始菜單“運行”中運行brcc32 d;/resmp3/mymusic.rc
生成mymusic.res文件
在你需要利用這些資源的單元中加入如下編譯指示:
{$R MyMusic.RES} //將應用程序中包含的資源(文件)重新還原 procedure MusicResToFile(const ResName, ResType,FileName: string); var Res: TResourceStream; begin Res := TResourceStream.Create(HInstance,ResName, PChar(ResType)); Res.SaveToFile(FileName); //將資源保存為文件,即還原文件 //你還可以進行其它的流操作,在內存中實現對資源利用而不必另存為文件 。。。 Res.Free; end;調用:
MusicResToFile('SRC2', 'FILE2', 'TheSecondMusic.MP3');
五、結束語
位圖、光標和圖標、AVI動畫、JPEG和Wave文件等可以放到資源文件中。上面我們介紹了如何將資源加入到資源文件中,並介紹了在Delphi中動態存取資源文件的方法。Delphi編譯工程會自動創建一個和工程名相同的資源文件(如果沒有其他的資源,主窗口的圖標會放在這個資源文件中)。但是建議最好不要改變這個資源文件。