国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Delphi如何使用資源文件

開發 開發工具
統的Windows程序幾乎都至少包含一個對話框和一個圖標。但是,Delphi應用程序有所不同。我們就要講到如何使用資源文件。

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

  典型的Windows程序的資源有:

  加速器(Accelerators)

  位圖(Bitmaps)

  光標(Cursors)

  對話框(Dialog boxes)

  圖標(Icons)

  菜單(Menus)

  數據表(Data tables)

  字串表(String tables)

  版本信息(Version information)

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

  Note

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

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

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

  把資源放到.exe文件中有兩條主要優點:

  存取資源的速度更快。因為在一個可執行文件中查找資源花的事件比從磁盤文件中裝入資源花的時間要少。

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

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

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

  Delphi中的資源(Resources in Delphi)

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

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

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

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

  如果要創建字符串資源、用戶數據資源、波形文件資源或其他專用資源,則可能需要第三方資源編輯器。

  Note

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

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

  編譯資源文件(Compiling Resource Files)

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

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

  添加一個批處理文件工程到工程組。

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

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

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

  brcc32 jjres.rc

  當然,必須保證當前系統目錄為Delphi安裝目錄的Bin目錄下,如果不是,則必須輸入BRCC32.EXE的完整路徑。這個資源編譯器速度非常快,甚至不等察覺,它就把資源腳本文件編譯完成了。

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

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

  (1)創建一個新的應用程序;

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

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

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

  (5)用鼠標右鍵點擊批處理文件節點并選擇Save,將文件保存為test.bat

  (6)用鼠標右鍵再次點擊批處理文件節點并選擇【Edit/Options】,會彈出“Batch File Options”對話框;

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

  del myfile.res

  brcc32 myfile.rc

  (8)點擊OK關閉“Batch File Options”對話框。

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

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

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

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

  {$R myfile.res}

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

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

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

  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有機會顯示位圖}  
  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.   { 當“Stop”按鈕按下時,告訴循環停止}  
  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 '

  此處省略了部分內容,詳細內容請查看示例代碼

  分析:

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

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

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

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

  Note

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

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

  為應用程序創建附加資源不是什么高深的學問,但也不是很簡單的事情。要搞清楚它們如何協調配合要花一定的事件。

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

原文鏈接:http://www.cnblogs.com/pchmonster/archive/2012/01/03/2311361.html

【編輯推薦】

  1. 淺談Delphi 7下VCL組件屬性
  2. 淺談Delphi中窗體的事件
  3. Delphi XE2:這就是我們所期待的Delphi嗎?
  4. Delphi XE2對話框實現源碼分析
  5. Delphi XE2將出 一場技術革命即將打響
責任編輯:彭凡 來源: 博客園
相關推薦

2011-06-20 14:18:27

Qt 資源 文件

2009-12-28 11:23:38

WPF資源文件

2020-08-25 07:16:20

Python資源文件文件

2013-06-17 17:02:15

Windows PhoWP開發資源文件

2009-10-28 11:27:34

VB.NET資源文件

2009-08-21 16:13:27

C#讀取資源文件

2011-08-15 14:47:28

Cocoa嵌入資源文件

2013-07-30 12:30:57

Windows PhoWindows Pho

2009-06-02 14:21:04

eclipse資源文件eclipse中文

2009-08-28 16:08:28

C#利用資源文件

2010-01-04 16:23:42

Silverlight

2009-06-19 16:12:22

Java語言properties

2009-08-12 16:44:13

.NET文件類型

2012-04-17 10:28:00

Cocos2dwophone

2011-04-06 15:25:20

Delphi

2009-06-05 09:40:59

2010-01-15 18:50:25

VB.NET資源文件

2010-03-15 17:26:58

Python字典

2013-04-03 12:57:01

Android開發讀寫assets目錄下

2009-10-29 16:01:54

VB.NET資源文件
點贊
收藏

51CTO技術棧公眾號

日本在线观看不卡| 国产精品白丝av嫩草影院| 成年人三级视频| 久久99国产成人小视频| 日韩精品视频一区二区在线观看| 一区二区av在线| 91精品尤物| 婷婷激情久久| 国产三级三级三级精品8ⅰ区| 日韩国产欧美亚洲| 日韩视频第二页| 欧美黑白配在线| 欧美日韩一级黄| 极品美女扒开粉嫩小泬| 免费黄色一级网站| 国产视频久久久| 国产成人免费视频网站高清观看视频 | xvideos成人免费中文版| 91丝袜国产在线播放| 日本亚洲视频| av天天在线| 91精品在线播放| 欧美日本一区二区在线观看| 肉肉av福利一精品导航| 一区二区电影免费观看| 男人日女人逼逼| 2019亚洲男人天堂| 精品久久久久久久久久国产| 国产精品99免费看| 91白丝在线| 国产情侣av自拍| 国产成人精品免费视频| 91久久一区二区| 久久精品一区二区三区中文字幕 | 国产成人精品电影久久久| 欧美性xxxx极品hd满灌| 久久久精品网| 国产精品亚洲d| 成年人羞羞的网站| 国产精品一级久久久| 日韩美女av在线| 国产精品免费久久| 伊人影院久久| 性欧美freehd18| 免费观看一二区视频网站| 精品1区2区| 俺也去精品视频在线观看| 亚洲动漫第一页| 日本麻豆一区二区三区视频| 日本少妇精品亚洲第一区| 性欧美精品孕妇| 性做爰过程免费播放| 欧美一级片免费在线| 91精品国产综合久久精品性色| 成人高清视频在线| 日韩激情一区| 一区二区三区四区日本视频| 高清孕妇孕交╳╳交| 日韩欧美99| 78m国产成人精品视频| 在线不卡免费av| 久久久久久久综合狠狠综合| 欧美一区在线看| 日本在线一区二区| 欧美少妇另类| 91精品91久久久中77777老牛| 97se亚洲综合在线| www.xxxx精品| 欧美精品一二三四| 中文av一区二区| 日韩福利视频导航| 国产成人精品一区二区免费看京 | 精品国产乱子伦一区| 国产精品你懂的在线| 久久精品九九| 亚洲人成精品久久久| h片在线观看视频免费| 粉嫩tv在线播放| 免费视频爱爱太爽了| 亚洲一区制服诱惑| 欧美另类xxx| 精品欧美一区二区三区精品久久 | 亚洲国产成人精品久久久国产成人一区 | 嫩草影院中文字幕| 99在线热播| 韩国视频理论视频久久| 日韩久久午夜影院| 色88888久久久久久影院按摩 | 亚洲一二三四| jizz在线观看| av一级在线| 你真棒插曲来救救我在线观看| 国产精品一区二| 日本亚洲欧洲色| 社区色欧美激情 | 91精品国产免费| 亚洲综合一二区| 久久奇米777| 国产伦精品一区二区三区在线观看| 欧美午夜影院| 日韩成人精品一区| 国产精品久久久久av蜜臀| 男人最爱成人网| 成人毛片av在线| 九色国产在线观看| 日本粉色视频在线观看| 无码精品国产一区二区三区免费| 亚洲精品高清视频| 精品欧美日韩在线| 亚洲综合一区二区不卡| 日韩免费视频在线观看| 欧美激情xxxx| 久久久国产成人精品| 日韩精品免费观看| 精品国产麻豆免费人成网站| 欧美日韩一区二区三区免费看| 亚洲一区免费观看| 欧美国产97人人爽人人喊| 99r精品视频| 成人免费高清视频在线观看| 久久99热国产| 久久国产福利国产秒拍| 日韩成人精品视频| 亚洲欧洲一区二区天堂久久| 一区二区三区四区在线观看国产日韩 | 国产视频久久网| 精品国产三级a在线观看| 色综合久久久久网| 亚洲一区二区在线播放相泽| 亚洲人成网站在线| 国产精品精品国产色婷婷| 久久婷婷成人综合色| 成人免费毛片高清视频| 国产成人a级片| 不卡视频免费播放| 99久久久精品| 久久久久国产精品麻豆ai换脸| 99久久精品国产麻豆演员表| www国产精品av| 久久亚洲精华国产精华液| 91麻豆国产在线观看| 91在线码无精品| 国产午夜亚洲精品午夜鲁丝片| 久久综合九色综合久久久精品综合| 99riav一区二区三区| 91蝌蚪porny| 国产亚洲精品bt天堂精选| 国产日产欧美一区| 黄色视屏在线免费观看| 天堂午夜影视日韩欧美一区二区| 91福利社在线观看| 羞羞的视频免费| 日本一本中文字幕| av免费观看大全| 欧美老熟妇喷水| 超碰影院在线观看| 国产黄色av免费看| 中文字幕在线视频不卡| 成人欧美一区二区三区视频xxx| 欧美大片免费| 中文字幕精品—区二区四季| 国产一区视频在线| 亚洲精品中文字| 北条麻妃99精品青青久久| 九九视频这里只有精品| 96精品视频在线| 成人在线观看视频网站| 国产综合精品一区二区三区| 亚洲人一区二区| 黄页免费在线观看视频| 99热热99| 在线看片免费人成视久网| 黄色在线免费网站| 免费欧美电影| 亚洲另类春色校园小说| 欧美激情五月| 99精品99久久久久久宅男| 超碰在线中文字幕| 噜噜噜在线观看免费视频日韩| 国产视频资源| 男女视频在线观看| 91麻豆免费在线视频| 97欧美成人| 欧美日韩在线网站| 亚洲中字在线| caoporen国产精品视频| 亚洲综合免费观看高清在线观看| 欧美日高清视频| 日韩亚洲一区二区| 日本不卡免费高清视频| 久久精品国产第一区二区三区最新章节 | 国产成人精品久久二区二区91| 国产66精品久久久久999小说| 中文字幕免费高| av天在线播放| 日韩伦理在线电影| 久久久久久久性潮| 久久综合99| 国产成人aaaa| 色系网站成人免费|