【转】资源文件在Delphi编程中的应用
段东宁 计亚南
(郴州职业技术学院, 湖南 郴州 423000)
摘要: 资源文件是一种能有效地组织、管理和使用资源的文件形式,在软件开发中有着广泛的应用。本文详细介绍了在Delphi编程中资源文件的创建方法和使用技巧。
关键词:Delphi,资源文件,TResourceStream对象,MCISend String 函数
The Application of Resource Files in Delphi Programming
DUAN Dong-Ning
(Department of Chenzhou Vocational Technical College, Chenzhou,423000 China)
0.引言
资源文件是一种特殊的文件,它可以保存各种资源,如图片、声音、动画等,可以把资源编译到应用程序中以丰富程序,资源文件的扩展名一般为res的文件。
在VC中资源文件用得非常普遍,但Delphi在其联机帮助中对资源文件没作什么介绍。
资源文件的生成和修改需要有专门的工具, Delphi附带的ImageEdit,它可以打开和保存图片资源。
Delphi附带了另一个命令行的资源编译工具BRCC32.EXE(一般位于\Delphi\BIN目录下),可以用它做出跟VC一样效果的资源文件来。
资源文件最大的好处是能将一些在必要时才调用的文件跟可执行文件一起编译,生成一个文件,使外部文件免遭破坏。
例如在一条程序中要临时调用一幅图片,一般作法是把图片放在某一路径下(通常是主程序所在路径),但如果用户误删某个图片文件,则可能使程序找不到相应文件而出错崩溃。
另外,如果要使程序界面美观,想用一些自定义光标,也要用到资源文件。
那么,资源文件究竟如何建立,建立后又如何载入Delphi应用程序中去,然后再使用其中的资源呢?
我们将从下面几部分进行详细阐述。
1. 如何建立资源文件
1.1 编写rc脚本文件
首先用记事本或其它文本编辑器创建一个扩展名为.rc的脚本文件。
格式如下:
资源标识符 + 类型关键字 + 实际文件名
① 资源标识符:程序中调用资源时的特殊标号;
② 类型关键字:标识资源文件类型;也可以用户自定义资源类型;
③ 实际文件名:编译的资源文件,比如动画、位图、光标、声音等文件;
例如:
mycur cursor move.cur //加入光标 mypic Bitmap Water.bmp//加入位图 mywav WAVE smile.wav //加入声音 myAVI AVI speed.avi //加入视频 myIco ICON cjt.ico//加入图标 MyJpg JPEG lake.jpg //加入JPEG图片文件,JPEG为自定义资源类型 MyMp3 FILE1 music.mp3 //加入JPEG图片文件,FILE1为自定义资源类型
上面第一行定义了一个名为mycur的光标,类型关键字为cursor,实际文件名称为加入的光标move.cur文件。
将上述内容保存为扩展名为RC的脚本文件。
1.2 将rc文件编译成res资源文件
将脚本文件和实际文件拷到Brcc32.EXE所在目录,执行DOS命令。
格式为:Brcc32 脚本文件(回车),例如有一名为myfirst.rc的脚本文件,则执行Brcc32 myfirst.rc(回车)即可。
如果编译成功,则会生成一个扩展名为.res的文件myfirst.res,这个文件就是我们需要的资源文件。
2. 如何将资源文件用到Delphi应用程序中
2.1在Delphi单元中加入资源文件
将生成的res资源文件拷贝到所编程序的路径下,在单元文件{$R *.DFM}后加上一句{$R FileName.res},FileName.Res为资源文件名,则将res文件加入,编译后资源文件即已包含在可执行文件中了。
若有多个资源文件,也按上法依次加入。
2.2在Delphi程序中调用资源文件
资源文件在Delphi中的关键字为hinstance。下面给出具体用法:
(1)光标的调用
首先在程序中定义一个值大于0的常量,因为默认的光标在数组中索引值是0,所以除非想取代默认光标,最好将定制的光标索引值设为1或以上的值。然后在窗体的OnCreate事件中添加以下代码:
screen.cursor[]:=Loadcursor(hinstance,'mycur');
其中35为大于1的常量,mycur为光标在资源文件中的名字。如果希望在其他控件上使用定制光标,例如Panel控件,只需在程序的适当处加入以下代码:
Panel1.cursor:=;
(2)位图的调用
新建一项工程,添加一TImage控件,在需要显示的地方写以下代码:
var mymap:HBitmap; begin mymap:=LoadBitmap(hinstance,'mypic'); Image1.Picture.Bitmap.Handle:=mymap; end;
mypic为位图在资源文件中的名称。
(3)AVI文件的调用
新建一工程,在Win32选择添加一Animate组件,在需要的地方加入:
Animate1.ResName:='myAVI'; Animate1.Active:=true;
其中myAVI为视频文件在资源文件中的名称。 但Animate组件只能播放无声的小AVI文件,可以应用Windows API 中的MCISendString 函数来播放有声的AVI文件,具体操作可参看下面的MP3文件的调用方法。
(4)调用WAV文件
在uses中加入mmsystm单元,以便在程序中播放WAV文件。播放时在需要的地方加入PlaySound(pchar('mywav'), hinstance, sndsync or snd_resource); 其中mywav为声音文件在资源文件中的名称。
(5)加入图标
将图标放在资源文件中,可以实现动态改变应用程序图标。
Application.Icon.Handle := LoadIcon(hInstance,' myIco ');
myIco为图标文件在资源中的名称。
(6)读取资源文件中的JPEG
如何把JPG图像读出来呢?用资源文件加流方式即可。
先把jpeg单元加入到Interface的uses中,具体方法如下:。
var
   Stream: TStream;
   MJpg: TJpegImage;
begin
  Stream:= TResourceStream.Create(
  HINSTANCE,'MyJpg','JPEG');
  try
    MJpg:=TJpegImage.Create;
    try
      MJpg.LoadfromStream(Stream);
      Image1.Picture.Assign(MJpg);
    finally
      MJpg.Free;
    end;
  finally
    Stream.Free;
  end;
end;
其中MyJpg为Jpg文件在资源文件中的名称。
(7) 调用MP3文件
在uses中加入mmsystm单元, MP3的资源类型是自定义的,在MP3资源文件读取时,需要调用Delphi自带的TResourceStream对象,它提供对Windows 应用程序资源的访问,因此称它为资源流;并应用了Windows API 中的MCISendString 函数。
procedure TForm1.Button1Click(Sender: TObject);
var
  res: TResourceStream;
  filename: String;
begin
  filename:='temp.mp3';
  res:=TResourceStream., 'MyMp3', Pchar('FILE1'));//建立流
  res.SaveToFile(filename);// 建立一个临时文件
  MCISendString(Pchar(,); //打开文件及播放设备
  MCISendString(,);//播放MP3文件
  res.Free ;//释放内存中的数据
  DeleteFile(filename);//删除临时文件
end;
如果要停止播放则使用:
MCISendString(,);
上述程序不仅适合MP3资源文件的读取,本程序还可适应于mid、wma、avi、dat、mpeg等外部媒体文件。
(8)其它文件资源的应用
上面说的是直接在程序本身的调用。其实资源文件还有其它用法。比如说在你的程序中携带其它文件,要用的时候释放出来。
例如: myexe exefile 'ha1.exe' //脚本文件
下面是自定义释放函数ExtractRes,本例中使用如下:
ExtractRes('exefile','myexe','d:\new.exe');
把ha1.exe以new.exe为名字保存到d盘根目录下。
function TForm1.ExtractRes(ResType, ResName, ResNewName: string): boolean;
var  Res: TResourceStream;
begin
  try
    Res := TResourceStream.Create(
    Hinstance, Resname, Pchar(ResType));
    try
      Res.SavetoFile(ResNewName);
      Result := True;
    finally
      Res.Free;
    end;
  except
    Result := false;
  end;
end;
3、字符串资源的定义与使用
3.1 字符串资源的定义
字符串资源是将字符串文件存储于资源文件中,字符串的存储在应用程序中是独立的,应用程序只有在使用资源时载入,使用完之后清除,从而节省内存,同时字符串也可以用于翻译,一些汉化软件都利用了字符串。编辑的字符串放在一个文本文件中,字符串文件的格式如下:
StringTable
begin
1,"book"
2,"apple"
3," computer "
end
其中StringTable为字符串表资源关键字,数字为所对应字符串的编号。
编辑完字符串文件后,保存成扩展名为rc的脚本文件如StrRes.rc,通过brcc32编译成扩展名为res资源文件如StrRes.res,使用该文件即可访问字符串资源。
3.2 字符串资源的使用
在{$R *.DFM}后加入{$R StrRes.res}
通过LoadStr(StringID);来调用资源文件中的字符串,整形变量StringID用来记录显示字符串的编号,通过StringID的值来调用字符串资源文件中编号所对应的字符串,如LoadStr(2);的值为字符串“apple”,LoadStr(3);的值为字符串“computer”。
4.结束语
上面介绍了如何将资源加入到资源文件中,并介绍了在Delphi编程中动态存取资源文件的方法。
掌握了这一些基本方法,并根据软件和用户的实际需求灵活运用,能较好地提高软件质量,减少软件开发和维护工作量,避免用户因删除资源文件而造成应用程序出现错误,提高系统的运行效率,方便了Delphi应用程序的发布。
参 考 文 献
[1] 龙启明,刘斌,程捷等编著. Delphi7高级编程范例[M].北京:清华大学出版社,2004.9.
[2] 刘宇君,曹党生,叶瑶,吕玉良编著. Delphi程序设计[M]. 北京:中国铁道出版社,2005.12
[3] 魏书堤,徐雨明. Delphi中资源文件的创建和使用[J]. 衡阳师范学院学报,2003.6.
[4] 陈经韬. 谈Delphi编程中资源文件的应用[J]. 电脑商情报,2001.
作者简介:
段东宁(1967-),男,湖南郴州人,副教授,研究方向:计算机应用及软件设计
【转】资源文件在Delphi编程中的应用的更多相关文章
- Delphi编程中使用回车键不换行处理方法!!
		
我以前遇到过Delphi编程中使用回车键不换行的问题,一直没有找到正确处理方法,以至于每次都重新安装Delphi,今天在XE8中再次遇到这样问题,万幸找到了正确的解决方法: 可能使用过程中不小心按了i ...
 - android中拷贝assets下的资源文件到SD卡中(可以超过1M)
		
很多手机游戏,在安装APK之后都得需要下载相应的资源包,然后才能进入游戏. 有这样一个需求:就是游戏中需要的资源包打在APK内,随apk一起进行安装到手机中. 这样就不需要,在安装APK之后,去下载资 ...
 - Android -- 拷贝assets下的资源文件到SD卡中(可以超过1M)
		
很多手机游戏,在安装APK之后都得需要下载相应的资源包,然后才能进入游戏. 有这样一个需求:就是游戏中需要的资源包打在APK内,随apk一起进行安装到手机中. 这样就不需要,在安装APK之后,去下载资 ...
 - Java 从资源文件(.properties)中读取数据
		
在Java工程目录src下,创建一个后缀为.properties的文件,例如db.properties 文件中的内容如下(键=值): name=mk age=123 address=China 在程序 ...
 - Delphi编程中动态菜单要点归纳
		
一.创建菜单并添加项目 在设计程序时,有时需要动态创建菜单, 通常使用以下的语句: PopupMenu1 := TPopupMenu.Create(Self); Item := TMenuIte ...
 - windows环境vagrant修改静态资源文件,centos虚拟机中nginx的web环境下不生效
		
最近上手krpano,本地修改了krpano.html文件或者xml文件,在虚拟机环境打开文件是修改过来了,在nginx中就是不生效. 修改nginx.conf中http{}中的 sendfile ...
 - Delphi编程中Http协议应用
		
Http协议的通信遵循一定的约定.例如,请求一个文件的时候先发送Get请求,然后服务器会返回请求的数据.如果需要进行断点传输,那么先发送'HEAD /'请求,其中返回的'Content-Length: ...
 - packr 方便的潜入静态资源文件到golang 二进制文件中
		
类似的工具以前有介绍过statik,今天使用的工具是packr 也是很方便的golang tools 安装 go get -u github.com/gobuffalo/packr/packr 或者我 ...
 - delphi 资源文件详解
		
delphi资源文件详解 一.引子: 现在的Windows应用程序几乎都使用图标.图片.光标.声音等,我们称它们为资源(Resource).最简单的使用资源的办法是把这些资源的源文件打入软件包,以方便 ...
 
随机推荐
- DNS拦截的处理
			
在用webSocket来实现长连接时,我们的链接对象使用了域名.但是再某些省份的网络下,发生了DNS拦截.踹改.导致使用某个域名链接,发生连接不上的现象.[解决方案] 在多次尝试原有域名不能使用的情况 ...
 - 【转】windows和linux间共享互传文件
			
原文:http://blog.guorunmin.cn/2015/09/16/windows%E5%92%8Clinux%E9%97%B4%E5%85%B1%E4%BA%AB%E4%BA%92%E4% ...
 - JavaScript对象的创建之工厂方法
			
通过工厂的方式来创建Person对象,在createPerson中创建一个对象,然后为这个对象设置相应的属性和方法,之后返回这个对象. function createPerson(name, age) ...
 - 转载:Cocos2D-x 游戏接入 Windows 设备所需做的六件事
			
原文地址:http://msopentech.com/zh-hans/blog/2014/05/09/cocos2d-x-%E6%B8%B8%E6%88%8F%E6%8E%A5%E5%85%A5-wi ...
 - [实战经验]Macbook pro 苹果系统换window系统
			
1. Macbook的window软件驱动备份 通过Boot Camp助手进行window支持苹果驱动下载 2. 拆机把SSD固态硬盘放在主盘位置,把苹果的机械盘放在光驱位置 ...
 - Testing and Checking Refined
			
还是James大叔的文章:http://www.satisfice.com/blog/archives/856 本文提出了Testing和checking的定义和他们之间的区别. ========== ...
 - JDK源码分析之集合02ArrayList
			
一.前言 有了前一篇对集合类的概述,我们知道ArrayList是属于Collection类系中的一个具体实现类,其特点是长度可以动态改变,集合内部使用数组保存元素.下面我们对源码进行分析. 二.Arr ...
 - Ceph源码解析:PG peering
			
集群中的设备异常(异常OSD的添加删除操作),会导致PG的各个副本间出现数据的不一致现象,这时就需要进行数据的恢复,让所有的副本都达到一致的状态. 一.OSD的故障和处理办法: 1. OSD的故障种类 ...
 - 【LeetCode】3.Longest Substring Without Repeating Characters 最长无重复子串
			
题目: Given a string, find the length of the longest substring without repeating characters. Examples: ...
 - 对付ring0 inline hook
			
对付ring0 inline hook的基本思路是这样的,自己写一个替换的内核函数,以NtOpenProcess为例,就是MyNtOpenProcess.然后修改SSDT表,让系统服务进入自己的函数M ...