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资源文件(全面分析之位图.光标.图标.AVI.JPEG.Wave) 几乎每个Windows应用程序都使用图标.图片.光标等资源.资源是程序的一部分,但是它是不可执行代码.下面我们就详细 ...
- Delphi资源文件的应用(转)
(一)初级应用篇: 资源文件一般为扩展名为res的文件.在VC中资源文件用得非常普遍,但Delphi在其联机帮助中对资源文件没作什么介绍,其实利用其自带的资源编译工具BRCC32.EXE(一般位于\D ...
- DELPHI资源文件使用
一 ) 初级应用篇 : 资源文件一般为扩展名为 res 的文件 . 在 VC 中资源文件用得非常普遍 , 但 Delphi 在其联机帮助中对资源文件没作什么介绍 , 其实利用其自带的资源编译工具 ...
- android—资源文件(res)的引用
android项目中res目录下的文件含义各不相同主要有两种方式引用它们 例子:在string.xml中定义一个<string name="hello">Hello W ...
- 资源文件(.RES)的应用
资源档有什麽用处呢?最重要的有两个地方 1.国际发行:我们将Application中所有的文字从Resource用读取,那麽,只要更动 Resource档的内容,就可以用不同语 ...
- 从jar包中读取资源文件
:[解惑]深入jar包:从jar包中读取资源文件 精华帖 (3) :: 良好帖 (15) :: 新手帖 (9) :: 隐藏帖 (0) 作者 正文 Heart.X.Raid 等级: 性别: 文章: 72 ...
- [Java基础] 深入jar包:从jar包中读取资源文件
转载: http://hxraid.iteye.com/blog/483115?page=3#comments 我们常常在代码中读取一些资源文件(比如图片,音乐,文本等等).在单独运行的时候这些简单的 ...
- 深入jar包:从jar包中读取资源文件
我们常常在代码中读取一些资源文件(比如图片,音乐,文本等等).在单独运行的时候这些简单的处理当然不会有问题.但是,如果我们把代码打成一个jar包以后,即使将资源文件一并打包,这些东西也找不出来了.看看 ...
- java jar包资源文件_深入jar包:从jar包中读取资源文件
我们常常在代码中读取一些资源文件(比如图片,音乐,文本等等).在单独运行的时候这些简单的处理当然不会有问题.但是,如果我们把代码打成一个jar包以后,即使将资源文件一并打包,这些东西也找不出来了.看看 ...
最新文章
- sftp shell 批量上传文件_Shell自动上传下载文件到SFTP服务器
- 网页服务器知识,HTML网页服务器的知识点
- android Arrays.fill()的使用
- ##API(二)————包装类
- linux下c/c++实例之十socket简单应用
- ADO.NET常用对象详解之:DataAdapter对象
- 小米MIX 4无线反向充电安排上了?MIUI测试版固件中暗藏玄机
- JavaScript就这么回事 (JS基础知识整理)
- Oracle前10条记录
- centos7上mycat安装_Mysql+Mycat实现数据库主从同步与读写分离
- 利用jira-python及selenium完成jira的统计报表及日报的填写
- 游戏帧数对比测试监控软件,8款游戏帧数对比实测 5800X多数超越11900K
- 不用找,你想要的建筑园林3d模型素材都在这里
- 4.3-python爬虫之图形验证码识别
- 安卓虚拟摄像头_谷歌AR新推强大功能:虚拟对象无缝嵌入,可与现实环境交互...
- Google的设计原则
- QT 如何计算中英文字符串的长度
- 注册免费使用腾讯云企业邮箱
- 在这个大数据时代,如何保护好自己的隐私?
- <华为VRP系统>ENSP模拟器安装:
热门文章
- 苹果手机如何实现微信多开分身 苹果微信多开分身教程
- 简述面向对象的三大特征
- ROG支持安装linux系统吗,华硕ROG安装ubuntu18.4+CUDA10.0+CUDNN7.4
- Dart语言dynamic类型的使用技巧
- 黑马点评-优惠券秒杀
- js判断变量是数组还是对象方法
- HP电脑耳机和音响同时响的解决方法
- 《Java EE Web组件开发》实验二
- Javacript中parentElement和parentNode的简单用法[0303]
- KeyValuePair 和 Dictionary 的关系