段东宁 计亚南

(郴州职业技术学院, 湖南 郴州  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编程中的应用的更多相关文章

  1. Delphi编程中使用回车键不换行处理方法!!

    我以前遇到过Delphi编程中使用回车键不换行的问题,一直没有找到正确处理方法,以至于每次都重新安装Delphi,今天在XE8中再次遇到这样问题,万幸找到了正确的解决方法: 可能使用过程中不小心按了i ...

  2. android中拷贝assets下的资源文件到SD卡中(可以超过1M)

    很多手机游戏,在安装APK之后都得需要下载相应的资源包,然后才能进入游戏. 有这样一个需求:就是游戏中需要的资源包打在APK内,随apk一起进行安装到手机中. 这样就不需要,在安装APK之后,去下载资 ...

  3. Android -- 拷贝assets下的资源文件到SD卡中(可以超过1M)

    很多手机游戏,在安装APK之后都得需要下载相应的资源包,然后才能进入游戏. 有这样一个需求:就是游戏中需要的资源包打在APK内,随apk一起进行安装到手机中. 这样就不需要,在安装APK之后,去下载资 ...

  4. Java 从资源文件(.properties)中读取数据

    在Java工程目录src下,创建一个后缀为.properties的文件,例如db.properties 文件中的内容如下(键=值): name=mk age=123 address=China 在程序 ...

  5. Delphi编程中动态菜单要点归纳

      一.创建菜单并添加项目 在设计程序时,有时需要动态创建菜单, 通常使用以下的语句: PopupMenu1 := TPopupMenu.Create(Self);  Item := TMenuIte ...

  6. windows环境vagrant修改静态资源文件,centos虚拟机中nginx的web环境下不生效

    最近上手krpano,本地修改了krpano.html文件或者xml文件,在虚拟机环境打开文件是修改过来了,在nginx中就是不生效. 修改nginx.conf中http{}中的 sendfile  ...

  7. Delphi编程中Http协议应用

    Http协议的通信遵循一定的约定.例如,请求一个文件的时候先发送Get请求,然后服务器会返回请求的数据.如果需要进行断点传输,那么先发送'HEAD /'请求,其中返回的'Content-Length: ...

  8. packr 方便的潜入静态资源文件到golang 二进制文件中

    类似的工具以前有介绍过statik,今天使用的工具是packr 也是很方便的golang tools 安装 go get -u github.com/gobuffalo/packr/packr 或者我 ...

  9. delphi 资源文件详解

    delphi资源文件详解 一.引子: 现在的Windows应用程序几乎都使用图标.图片.光标.声音等,我们称它们为资源(Resource).最简单的使用资源的办法是把这些资源的源文件打入软件包,以方便 ...

随机推荐

  1. Oracle逻辑读详解

    1.物理读(physical read) 当数据块第一次读取到,就会缓存到buffer cache 中,而第二次读取和修改该数据块时就在内存buffer cache 了 以下是例子: 1.1  第一次 ...

  2. 打印print

    <script type="text/javascript"> function printpreview() { try { var HKEY_Root, HKEY_ ...

  3. QWizard中运行时默认按钮显示英文问题

    QWizard中运行时默认按钮在编译前设计界面的时候是显示中文的,运行的时候就变成英文了.. 后来是发现国际化的时候有问题,解决办法如下: 在main.cpp里加: QTranslator* tran ...

  4. iOS中常见的设计模式——单例模式\委托模式\观察者模式\MVC模式

    一.单例模式 1. 什么是单例模式? 在iOS应用的生命周期中,某个类只有一个实例. 2. 单例模式解决了什么问题? 想象一下,如果我们要读取文件配置信息,那么每次要读取,我们就要创建一个文件实例,然 ...

  5. 【LeetCode】13. Roman to Integer 罗马数字转整数

    题目: Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range from ...

  6. 从100PV到1亿级PV网站架构演变

    如果你对项目管理.系统架构有兴趣,请加微信订阅号"softjg",加入这个PM.架构师的大家庭 一个网站就像一个人,存在一个从小到大的过程.养一个网站和养一个人一样,不同时期需要不 ...

  7. ctags 文章

    http://blog.csdn.net/wuziqi4/article/details/1709722

  8. python其中一个子线程,则退出全部线程,再退出进程

    import threading, signal is_exit = False def write_login(self): global is_exit write_log('login rsyn ...

  9. oracle数据库中的表设置主键自增

    oracle中没有自增字段,可通过序列+触发器间接实现,cmd中sqlplus登录,直接运行即可.一般要经过一下几步: 1建立数据表 create table Test_Increase(       ...

  10. NULL值比较,两个列的合并,列值按条件替换。

    show create table 表名 -- 显示创建表的sql语句. 为已有的表增加新列.alter table 表名 add 列名 int NULL -- 此行加了一个int 类型 默认可以nu ...