摘自:http://www.ej38.com/showinfo/delphi-131567.htmlhtml
1、引子:
如今的Windows應用程序幾乎都使用圖標、圖片、光標、聲音等,咱們稱它們爲資源(Resource)。最簡單的使用資源的辦法是把這些資源的源文件打入軟件包,以方便程序須要的時候調用。資源是程序的一部分,程序要正常運行就離不了資源文件。可是它是不可執行代碼。
爲了更好地管理資源,Delphi中提供了一種.RES類型的資源文件。它能夠把咱們程序中所須要的資源整合到一個資源文件(.RES)下來。在編譯應用程序時直接編譯進了可執行程序裏,成爲應用程序的整合體。
這樣作的好處是:1。因爲定位資源比在磁盤中定位文件花費時間少,因此應用程序執行會更快。2。多種資源能夠放在一個文件中,減小了圖標、圖片、光標、聲音等文件數量。不用怕用戶在使用過程當中的不當心而損壞了資源文件導致程序沒法正常運行。
缺點是:由於資源文件的加入從而加大了編譯出的可執行程序的字節數,當資源文件較大時會使應用程序變得看起來雍腫。
使用資源文件的優勢很顯著,其缺點也很突出。因此在實際應用中就要根據狀況權衡利弊、靈活使用,這已不在本文的討論之列。下面僅就Delphi系統編程中對於資源文件的使用方法作一個大體的總結。
2、建立資源文件:
注意事項:建立的資源文件名不要和工程名相同,由於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文件不出錯。若是轉換過程沒有報錯,則成功。
3、引用資源文件
把上一步驟生成的資源文件Sample.RES放到要創建的工程的同一個目錄中來。
爲了存取咱們的資源文件,必須告訴Delphi連接咱們的資源文件到應用程序中。所以要在源代碼中加入一條編譯指令完成上述功能。這條指令必須緊跟在窗口指令後,以下形式:
{$R *.DFM} //Delphi自帶編譯指令
{$R Sample.RES} //新加入的編譯資源文件的指令
不要刪除{$R *.DFM}指令,由於這行代碼告訴Delphi連接下面的資源到窗口的資源中。
4、調用資源文件
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');
5、結束語
位 圖、光標和圖標、AVI動畫、JPEG和Wave文件等能夠放到資源文件中。上面咱們介紹瞭如何將資源加入到資源文件中,並介紹了在Delphi中動態存 取資源文件的方法。Delphi編譯工程會自動建立一個和工程名相同的資源文件(若是沒有其餘的資源,主窗口的圖標會放在這個資源文件中)。可是建議最好 不要改變這個資源文件。
6、參考資料:
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;編程