Delphi 资源文件( .res)
一. 现在的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编译工程会自动创建一个和工程名相同的资源文件(如果没有其他的资源,主窗口的图标会放在这个资源文件中)。但是建议最好不要改变这个资源文件。
Delphi 资源文件( .res)的更多相关文章
- delphi 资源文件详解
delphi资源文件详解 一.引子: 现在的Windows应用程序几乎都使用图标.图片.光标.声音等,我们称它们为资源(Resource).最简单的使用资源的办法是把这些资源的源文件打入软件包,以方便 ...
- 教程-Delphi资源文件(全面分析于使用)
Delphi资源文件(全面分析之位图.光标.图标.AVI.JPEG.Wave) 几乎每个Windows应用程序都使用图标.图片.光标等资源.资源是程序的一部分,但是它是不可执行代码.下面我们就详细 ...
- delphi资源文件的使用
delphi资源文件的使用 资源文件(*.res)通过编译指令 $R 关联, 譬如工程文件 Project1 中的 {$R *.res} 就是关联 Project1.res 资源文件, 我们直接写作 ...
- delphi资源文件制作及使用详解
一.引子:现在的Windows应用程序几乎都使用图标.图片.光标.声音等,我们称它们为资源(Resource).最简单的使用资源的办法是把这些资源的源文件打入软件包,以方便程序需要的时候调用.资源是程 ...
- 34.Android之资源文件res里drawable学习
我们经常看到android工程资源文件res下drawable如ldpi.mdpi.hdpi.xhdpi.xxhdpi文件,今天我们学习了解下. (1)drawable-hdpi里面存放高分辨率的图片 ...
- Delphi资源文件(全面分析之位图、光标、图标、AVI、JPEG、Wave)
几乎每个Windows应用程序都使用图标.图片.光标等资源.资源是程序的一部分,但是它是不可执行代码.下面我们就详细介绍资 源文件在Delphi5中建立和使用方法. 1.把资源放到Exe文件的优点 ...
- android—资源文件(res)的引用
android项目中res目录下的文件含义各不相同主要有两种方式引用它们 例子:在string.xml中定义一个<string name="hello">Hello W ...
- 资源文件(.RES)的应用
资源档有什麽用处呢?最重要的有两个地方1.国际发行:我们将Application中所有的文字从Resource用读取,那麽,只要更动 Resource档的内容,就可以用不同语言的 ...
- delphi关于文件操作集锦
关于文件操作集锦 取得该快捷方式的指向EXE关键词:快捷方式 LNK unit Unit1; interface usesWindows, Messages, SysUtils, Varian ...
随机推荐
- django 类列表实例化
一. 创建类 from rest_framework.views import APIView class Group(APIView): def get(self,request): pass cl ...
- Sql 中取小数点后面两位小数
,),round(UnTaxAmount,))as UnTaxAmount from View_SaleVoice ,)) as UnTaxAmount from View_SaleVoice
- Jquery当div超出页面时就固定到顶部否则跟随页面滚动
$.fn.smartFloat = function () { var position = function (element) { var top = element.position().top ...
- hdu5798
官方题解: 考虑去掉abs符号,发现只有相邻两个数的最高位被影响了才会影响abs的符号,所以可以按照最高位不一样的位置分类,之后考虑朴素枚举x从0到2^20,每次的复杂度是O(400),无法通过,考虑 ...
- [Bootstrap]modal弹出框
写在前面 在实际开发中,为了友好,更需要一种美观的弹出框,js原生的alert,很难满足需求.这里推荐一个bootstrap的弹出框. 一个例子 先看效果吧 代码: <!DOCTYPE html ...
- NodeJs中使用jQuery?
在NodeJs中使用jQuery? 有时候在项目中需要使用jq在node中,但是使用起来却不是那么友好,那么现在该怎么做?改写JQ插件?将JQ插件打包成npm包,再在项目中进行引用?显然这些相比较于难 ...
- OSError: libgfortran.so.3: cannot open shared object file: No such file or directory
运行程序遇到下面问题 OSError: libgfortran.so.3: cannot open shared object file: No such file or directory 安装yu ...
- ZOJ 1610.Count the Colors-线段树(区间染色、区间更新、单点查询)-有点小坑(染色片段)
ZOJ Problem Set - 1610 Count the Colors Time Limit: 2 Seconds Memory Limit: 65536 KB Painting s ...
- 关于phonegap的白名单机制
今天在项目中发现了一个问题,使用phonegap开发的APP默认情况下可以将外部网页加载进入手机APP当中,这是相当危险的,同时也会给人一种APP非native的感觉. 可能遇见的一种情况是有些WiF ...
- 【带权并查集】【离散化】vijos P1112 小胖的奇偶
每个区间拆成r和l-1两个端点,若之内有偶数个1,则这两个端点对应的前缀的奇偶性必须相同,否则必须相反. 于是可以用带权并查集维护,每个结点储存其与其父节点的奇偶性是否相同,并且在路径压缩以及Unio ...