日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Delphi如何使用資源文件

每個(gè)Windows應(yīng)用程序都使用資源。資源(Resources)不是可執(zhí)行代碼,但它屬于程序的一部分元素。

公司主營業(yè)務(wù):網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)、移動網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。創(chuàng)新互聯(lián)是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)推出沙市免費(fèi)做網(wǎng)站回饋大家。

  典型的Windows程序的資源有:

  加速器(Accelerators)

  位圖(Bitmaps)

  光標(biāo)(Cursors)

  對話框(Dialog boxes)

  圖標(biāo)(Icons)

  菜單(Menus)

  數(shù)據(jù)表(Data tables)

  字串表(String tables)

  版本信息(Version information)

  用戶定義的專用資源(User-defined specialty resources)如聲音和視頻文件

  Note

  用Project Options對話框的Version Info頁面可輕松地將版本信息加到Delphi工程中。如下圖:

  資源一般包括在擴(kuò)展名為.rc的資源腳本文件中(resource script file),資源文件就是文本文件。資源文件用資源編譯器編譯,并在鏈接時(shí)加到應(yīng)用程序的.exe文件中。

  通常大家認(rèn)為資源要加到可執(zhí)行文件中,但是有些資源,如位圖、字符串表、波形文件,既可以放到外部文件中(.bmp、.txt、.wav),也可加到.exe文件并包含到應(yīng)用程序文件中。

  把資源放到.exe文件中有兩條主要優(yōu)點(diǎn):

  存取資源的速度更快。因?yàn)樵谝粋€(gè)可執(zhí)行文件中查找資源花的事件比從磁盤文件中裝入資源花的時(shí)間要少。

  程序和資源可一起包含到單個(gè)單元(即.exe文件)中,而不需要一大堆的支持文件。

  它的不足之處是:會使.exe文件稍稍增大。其大小不會比外部資源文件加可執(zhí)行文件大。但是增加大小會使加載該程序的時(shí)間加長。

  是把資源存為外部資源文件,還是把資源放到.exe文件中,這得由編程人員自己定。但要記住的是:這兩種方式用哪一種都行(甚至可以在同一個(gè)程序中使用兩種方式)。

  Delphi中的資源(Resources in Delphi)

  傳統(tǒng)的Windows程序幾乎都至少包含一個(gè)對話框和一個(gè)圖標(biāo)。但是,Delphi應(yīng)用程序有所不同。首先,Delphi應(yīng)用程序中沒有真正意義上的對話框,實(shí)質(zhì)上也就是沒有對話框資源(Delphi中存儲的窗體是資源,但它們是RCDATA資源,而不是對話框資源)。

  Delphi應(yīng)用程序有傳統(tǒng)意義的圖標(biāo)資源。創(chuàng)建應(yīng)用程序時(shí),Delphi負(fù)責(zé)創(chuàng)建圖標(biāo)資源文件。類似地,在為Speedbutton、Image組件或BitBtn組件選擇位圖時(shí),Delphi將所選位圖文件包含到窗體資源中(作為窗體資源的一部分)。在建立應(yīng)用程序時(shí),窗體和它的全部資源一起包括到程序文件中。這些都是自動處理的。

  有時(shí)需要在通常的Delphi處理中以外使用資源。例如,要制作動畫,必須有一系列的位圖,將它們裝載進(jìn)來作為可以最快速度執(zhí)行的資源。在這種情況下,就需要知道如何把資源捆綁到Delphi應(yīng)用程序中。

  把資源文件捆綁到可執(zhí)行文件中是件非常容易的事,實(shí)際創(chuàng)建資源卻要困難的多。如果有一個(gè)好的資源編輯器,創(chuàng)建諸如位圖、圖標(biāo)和光標(biāo)之類的基本資源并不困難,但創(chuàng)建具有專業(yè)化品質(zhì)的3D位圖和圖標(biāo)卻是一項(xiàng)藝術(shù)性的工作。我們肯定遇到過很多不錯(cuò)的程序,但它們的位圖按鈕實(shí)在難看。我們可以利用Delphi自帶的Image Editor創(chuàng)建位圖、圖標(biāo)和光標(biāo)。

  如果要?jiǎng)?chuàng)建字符串資源、用戶數(shù)據(jù)資源、波形文件資源或其他專用資源,則可能需要第三方資源編輯器。

  Note

  如果手頭有老版本的Borland Pascal,可使用其中的Resource Workshop編輯器編輯專用資源。創(chuàng)建好資源后,會形成一個(gè).rc文件,Delphi中帶有Borland Resource Compiler,用Borland Resource Compiler(BRCC32.EXE)將它編譯成.res文件。從技術(shù)上講,可以用任何一種文本編輯器創(chuàng)建.rc文件并用資源編譯器編譯它,但使用資源編輯器創(chuàng)建資源要容易的多。

  現(xiàn)在在推薦一個(gè)款比較不錯(cuò)的第三方資源編輯器Resource Builder,該軟件界面簡潔,使用簡單,大家可以百度一下。

  編譯資源文件(Compiling Resource Files)

  資源文件創(chuàng)建好后,要用資源編譯器來編譯它。編譯資源文件的方法有兩種:

  從命令行手工編譯資源文件。

  添加一個(gè)批處理文件工程到工程組。

  用其中任意一個(gè)方法,編譯完后都得到一個(gè).res文件,將它鏈接到應(yīng)用程序中。

  1、 從命令行編譯(Compiling from the Command Line)

  從命令行編譯資源文件,只需打開Windows中的命令提示框,并輸入一行與下面相似的命令:

  brcc32 jjres.rc

  當(dāng)然,必須保證當(dāng)前系統(tǒng)目錄為Delphi安裝目錄的Bin目錄下,如果不是,則必須輸入BRCC32.EXE的完整路徑。這個(gè)資源編譯器速度非??欤踔敛坏炔煊X,它就把資源腳本文件編譯完成了。

  2、 使用批處理文件工程(Using a Batch File Project)

  添加一個(gè)批處理文件到工程組,與從命令行編譯一樣簡單,并且還有一個(gè)好處:保證資源文件總是最新的。要搞清楚批處理文件如何工作,可執(zhí)行下面的步驟:

 ?。?)創(chuàng)建一個(gè)新的應(yīng)用程序;

 ?。?)選擇【View | Project Manager】打開“Project Manager”工程管理器,如下圖:

 ?。?)點(diǎn)擊“Project Manager”工具欄上的“Add New Project”按鈕,顯示Object Repository對象庫,如下:

 ?。?)雙擊Batch File圖標(biāo)來創(chuàng)建文件工程。將該批處理文件工程以Project2的名稱添加到“Project Manager”中,如下:

  (5)用鼠標(biāo)右鍵點(diǎn)擊批處理文件節(jié)點(diǎn)并選擇Save,將文件保存為test.bat;

 ?。?)用鼠標(biāo)右鍵再次點(diǎn)擊批處理文件節(jié)點(diǎn)并選擇【Edit/Options】,會彈出“Batch File Options”對話框;

(7)在Command文本框內(nèi)輸入下列正文:

  del myfile.res

  brcc32 myfile.rc

 ?。?)點(diǎn)擊OK關(guān)閉“Batch File Options”對話框。

  這個(gè)練習(xí)鎖做的就是創(chuàng)建一個(gè)批處理文件,當(dāng)編譯工程組時(shí),它就會執(zhí)行。第(7)步輸入的批處理文件命令刪除一個(gè)名為myfile.res文件,并調(diào)用Delphi資源編譯器編譯myfile.rc文件。用資源編譯器編譯myfile.rc文件會生成一個(gè)名為myfile.res的文件。

  工程組中的下一個(gè)工程可能要使用myfile.res。呵呵,那為什么要先刪除myfile.res文件呢?這是因?yàn)?,刪除該文件后,就能知道資源編譯器是重新建立了這個(gè)文件。如果資源編譯器創(chuàng)建資源失敗,則任何要使用這個(gè)資源文件的工程都將編譯失敗,并報(bào)告編譯錯(cuò)誤,提示編程人員,建立資源文件出錯(cuò)。

  把資源文件鏈接到你的可執(zhí)行文件中(Linking Resource Files to Your Executable)

  編譯好資源文件后,要把編譯后的資源文件鏈接到程序的可執(zhí)行文件中,可使用$R編譯器指令。例如,要鏈接包含在myfile.res文件中的二進(jìn)制資源,可在主窗體單元的開頭處插入下面一行:

  {$R myfile.res}

  就這么簡單!只要指定的文件存在,Delphi就會在鏈接時(shí)把這個(gè)編譯過的資源添加到可執(zhí)行文件中。

  使用資源的樣本程序(A Sample Program Using Resources)

  下面的清單中,列出了Jumping Jack的程序的主窗體單元。這個(gè)程序顯示一個(gè)帶聲音效果的簡單動畫。主窗體上有兩個(gè)按鈕:一個(gè)Image組件和一個(gè)Label組件。Jumping Jack程序說說明了資源在Delphi應(yīng)用程序中的使用。它特別說明了如何加載以資源文件形式存儲的位圖,如何加載并顯示字符串資源,以及如何播放資源文件中的波形音頻。清單后面還列出了部分資源文件。先看看清單,然后再分析程序。

  JJMain.pas清單unit JmpJackU;

 
 
 
 
  1.   interface
  2.   uses
  3.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  4.   Dialogs, StdCtrls, ExtCtrls, MMSystem;
  5.   {$R JJRES.RES}
  6.   const
  7.   IDS_UP = 101;
  8.   IDS_DOWN = 102;
  9.   type
  10.   TMainForm = class(TForm)
  11.   Image: TImage;
  12.   Label1: TLabel;
  13.   Start: TButton;
  14.   Stop: TButton;
  15.   procedure FormCreate(Sender: TObject);
  16.   procedure StartClick(Sender: TObject);
  17.   procedure StopClick(Sender: TObject);
  18.   private
  19.   { Private declarations }
  20.   Done: Boolean;
  21.   procedure DrawImage(var Name: string);
  22.   public
  23.   { Public declarations }
  24.   end;
  25.   var
  26.   MainForm: TMainForm;
  27.   implementation
  28.   {$R *.dfm}
  29.   procedure TMainForm.DrawImage(var Name: string);
  30.   begin
  31.   { 從資源文件中讀取位圖,通過資源名稱}
  32.   Image.Picture.Bitmap.LoadFromResourceName(HInstance, Name);
  33.   { 讓Image有機(jī)會顯示位圖}
  34.   Application.ProcessMessages;
  35.   { 延緩,讓動畫變慢}
  36.   Sleep(20);
  37.   end;
  38.   procedure TMainForm.FormCreate(Sender: TObject);
  39.   begin
  40.   Image.Picture.Bitmap.LoadFromResourceName(HInstance, 'ID_BITMAP1');
  41.   end;
  42.   procedure TMainForm.StartClick(Sender: TObject);
  43.   var
  44.   s: string;
  45.   ResName: string;
  46.   i: Integer;
  47.   Buff: array[0..9] of Char;
  48.   begin
  49.   s := 'ID_BITMAP';
  50.   Done := False;
  51.   while not Done do
  52.   begin
  53.   for i := 1 to 5 do
  54.   begin
  55.   ResName := s + IntToStr(i);
  56.   DrawImage(ResName);
  57.   end;
  58.   LoadString(HInstance, IDS_UP, Buff, SizeOf(Buff));
  59.   Label1.Caption := Buff;
  60.   Label1.Refresh;
  61.   PlaySound('ID_WAVEUP', HInstance, SND_ASYNC or SND_RESOURCE);
  62.   Sleep(200);
  63.   for i := 5 downto 1 do
  64.   begin
  65.   ResName := s + IntToStr(i);
  66.   DrawImage(ResName);
  67.  end;
  68.   PlaySound('ID_WAVEDOWN', HInstance, SND_ASYNC or SND_RESOURCE);
  69.   LoadString(HInstance, IDS_DOWN, Buff, SizeOf(Buff));
  70.   label1.Caption := Buff;
  71.   Label1.Refresh;
  72.   Sleep(200);
  73.   end;
  74.   end;
  75.   procedure TMainForm.StopClick(Sender: TObject);
  76.   begin
  77.   { 當(dāng)“Stop”按鈕按下時(shí),告訴循環(huán)停止}
  78.  Done := True;
  79.   end;
  80.   end.

  JJRec.rc清單STRINGTABLE

  BEGIN

  101, "Up"

  102, "Down"

  END

  ID_WAVEUP WAVE "up.wav"

  ID_WAVEDOWN WAVE "down.wav"

  ID_BITMAP1 BITMAP

  MOVEABLE PURE LOADONCALL DISCARDABLE

  LANGUAGE LANG_NEUTRAL, 0

  BEGIN

  '42 4D 76 02 00 00 00 00 00 00 76 00 00 00 28 00 '

  '00 00 20 00 00 00 20 00 00 00 01 00 04 00 00 00 '

  '00 00 00 02 00 00 00 00 00 00 00 00 00 00 10 00 '

  '00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 80 '

  '00 00 00 80 80 00 80 00 00 00 80 00 80 00 80 80 '

  '00 00 C0 C0 C0 00 80 80 80 00 00 00 FF 00 00 FF '

  '00 00 00 FF FF 00 FF 00 00 00 FF 00 FF 00 FF FF '

  '00 00 FF FF FF 00 BB BB BB BB BB BB BB BB BB BB '

  'BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB '

  'BB BB BB BB BB BB BB BB BB BB BB BB BB B0 B0 BB '

  'BB BB BB BB BB BB BB BB BB BB BB BB BB B0 B0 BB '

  此處省略了部分內(nèi)容,詳細(xì)內(nèi)容請查看示例代碼

  分析:

  主窗體類聲明中聲明了一個(gè)Done的布爾型字段,Done用于確定何時(shí)終止動畫。DrawImage方法用于在Image組件中顯示位圖。

  注意:上列代碼中,使用了兩個(gè)Windows API函數(shù)來加載字符串和波形文件資源。在StartClick方法中,LoadString函數(shù)加載一個(gè)字符串到到一個(gè)字符數(shù)組緩沖區(qū)內(nèi)。然后將該字符數(shù)組分配給窗體上的Label組件的Caption屬性。

  PlaySound函數(shù)用于播放波形文件資源。PlaySound函數(shù)用SND_ASYNC標(biāo)志通知Windows開始播放音頻并立即將控制返回給程序,這使得在播放音頻的同時(shí),動畫能繼續(xù)下去。SND_RESOURCE標(biāo)志通知Windows,聲音是一個(gè)資源,而不是磁盤上的一個(gè)文件。LoadString和PlaySound函數(shù)都使用HInstance全局變量通知Windows到可執(zhí)行文件中去查找資源。裝入位圖資源,使用VCL方法LoadFromResourceName。

  而資源文件JJRec.rc中的前5行說明字符串在資源腳本文件中的格式;使用文本編輯器創(chuàng)建字符串表非常容易。接下去是為兩個(gè)波形文件創(chuàng)建各自的WAVE資源,這兩個(gè)波形文件已存在該工程目錄中。資源編譯器一看到WAVE聲明,它就會讀聲音文件并將它們編譯進(jìn)二進(jìn)制資源文件。

  Note

  從上面的清單中看出,使用文本編輯器來創(chuàng)建某些類型的資源是比較容易的事。如果位圖和波形音頻文件存為了外部文件,可像上面的清單那樣將它們包含到.RC文件中,并用資源編譯器將它們編譯為二進(jìn)制資源文件。其中二進(jìn)制資源文件可鏈接到應(yīng)用程序的可執(zhí)行文件中。

  上面的資源清單只是部分代碼,用傳統(tǒng)的資源編輯器創(chuàng)建的位圖常常以數(shù)字?jǐn)?shù)據(jù)的形式包含到資源文件中,位圖的資源描述可以很長。Jumping Jack位圖資源描述大約有200行,因此未在清單中全部列出。下圖給出了Jumping Jack啟動后的界面。

  為應(yīng)用程序創(chuàng)建附加資源不是什么高深的學(xué)問,但也不是很簡單的事情。要搞清楚它們?nèi)绾螀f(xié)調(diào)配合要花一定的事件。

  以上代碼均在Delphi7中測試通過,


網(wǎng)站題目:Delphi如何使用資源文件
當(dāng)前URL:http://www.5511xx.com/article/dpjieeo.html