幾乎每一個Windows應用程序都使用圖標、圖片、光標等資源。資源是程序的一部分,可是它是不可執行代碼。下面咱們就詳細介紹資源文件在Delphi中創建和使用方法。數組
1.把資源放到exe文件的優勢 因爲定位資源比在磁盤中定位文件花費時間少,因此應用程序執行會更快。多種資源能夠放在一個文件中,減小了圖標、圖片、光標等文件數量。保存資源文件時不要和工程名相同,由於Delphi建立工程時會自動建立一個和工程名相同的資源文件。而且最好將資源文件保存到和工程文件同一個文件夾中。函數
2.建立資源文件
首先建立一個.Rc的純文本文件。格式以下: 資源標識符 + 關鍵字 + 資源文件名
① 資源標識符:程序中調用資源時的特殊標號;
② 關鍵字:標識資源文件類型;
Wave: 資源文件是聲音文件; RCDATA: JPEG文件; AVI: AVI動畫; ICON: 圖標文件;
BITMAP: 位圖文件; CURSOR: 光標文件;
③ 資源文件名:編譯的資源文件,好比動畫、位圖、光標等;
④ 如:MyWav WAVE "FileName.Wav" // 此時FileName.Wav 與 rc文件在同一文件夾下
使用Borland資源編譯器(BRCC32.EXE)轉化.Rc文件成.Res文件。在DOS命令行下輸入下列命令:
Brcc32 FileName.Rc // Brcc32.Exe在Delphi5\Bin文件下。動畫
3.在工程中引用資源文件
爲了存取咱們的資源文件,必須告訴Delphi連接咱們的資源文件到應用程序中。spa
所以咱們能夠在源代碼中加入一條編譯指令完成上述功能。這條指令必須緊跟在窗口指令後,以下形式: 命令行
{$R *.DFM} //Delphi自帶編譯指令
{$R FileName.Res} //新加入的編譯資源文件的指令。 orm
不要刪除{$R *.DFM}指令,由於這行代碼告訴Delphi連接下面的資源到窗口的資源中。索引
4.調用資源文件
(1)存取資源文件中的位圖(Bitmap)
程序中若是想存取資源,你必須調用一些Windows API函數。保存在資源文件中的位圖、光標和圖標能夠經過調用LoadBitmap、LoadCursor和LoadIcon函數存取。 圖片
本例舉例說明如何存取資源文件中位圖並顯示在Timage控件中。
procedure TfrMain.btnCanvasPic(Sender: TObject);
Image1.Picture.Bitmap.Handle :=LoadBitmap(hInstance, '資源標識符');
end;
注:若是位圖沒有裝載成功,程序仍舊執行,可是Image將再也不顯示圖片。ci
你能夠根據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
procedure TfrMain.LoadIconClick(Sender: TObject);
begin
Animate1.ResName :='MyAvi' ; //資源標識
Animate1.Active :=True ;
End ;
(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;
5.結束語
位圖、光標和圖標、AVI動畫、JPEG和Wave文件等能夠放到資源文件中,上面咱們介紹瞭如何將資源加入到資源文件中,並介紹了在Delphi中動態存取資源文件的方法。Delphi編譯工程會自動建立一個和工程名相同的資源文件(若是沒有其餘的資源,主窗口的圖標會放在這個資源文件中)。可是建議最好不要改變這個資源文件。
若是感受上面的麻煩的話,將 RC 文件直接添加到項目中,在編譯Delphi項目時,會自動編譯該資源文件。
//RC: testBmp bitmap 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; 請注意上面兩種調用方式的不一樣之處。 |