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[35]:=Loadcursor (hinstance,'mycur');
其中35为大于1的常量,mycur为光标在资源文件中的名字。如果希望在其他控件上使用定制光标,例如Panel控件,只需在程序的适当处加入以下代码:
Panel1.cursor:=35;
(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.Create(0, 'MyMp3', Pchar('FILE1'));//建立流
res.SaveToFile(filename);// 建立一个临时文件
MCISendString(Pchar('open '+filename+' type mpegvideo alias ww'), nil,0,0); //打开文件及播放设备
MCISendString('play ww',nil,0,0);//播放MP3文件
res.Free ;//释放内存中的数据
DeleteFile(filename);//删除临时文件
end;
如果要停止播放则使用:
MCISendString('stop ww',nil,0,0);
上述程序不仅适合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.