标签:
delphi教育 |
分类: Delphi(DelphiX) |
Delphi中资源文件的使用
在Delphi中,生成一个Appliction工程时,会默认生成一个与工程同名的资源文件,即使删除也会
再度创建,但是这个资源文件中只有一个图标和一个版本信息。
通常情况下,我们还需要更多的多种多样的资源,虽然可以在IDE中载入并编译到EXE文件中去,但
是有时我们需要将资源与EXE分开,以便生成多语言程序或将程序改为其它语言(如汉化)。
Delphi附带的ImageEdit可以编辑资源文件,但只能编辑位图、图标和光标,无法加入字符串资源,
而且只持256色的图像。为了将更多种类的资源,只有编写资源脚本或者使用其它资源编辑器,如
Visual Stadio 6。不过,Visual Stadio 6编辑的资源文件中包含了C++头文件定义,并且支持的具
体资源类型较多,在Delphi中是无法识别的。
只好选择编写资源脚本了,资源脚本文件扩展名为.RC,可以用纯文本编辑器编写。如下面是两个图
标与两个字符串的脚本:
COMPUTER RCDATA
"computer.ico"
WINDOWSXP RCDATA "XP.ico"
STRINGTABLE
BEGIN
END
将其保存为MyRes.rc,需要注意的是,这里包含了两个图标,注意文件名及路径(这里是与文件同
一目录)。在命令提示符窗口中将目录切换到MyRes.rc所在的路径,运行brcc32 MyRes.rc,其中
brcc32.exe是Delphi附带的资源编译工具。如果想将资源文件生成其中扩展名的文件(如.DLL),
可以增加-fo参数,如:brcc32 MyRes.rc –of MyRes.dll。
中编译到EXE中去;动态引用则是把资源文件当成DLL动态装载。
静态引用资源文件在Delphi中是最简单不过了,只要在工程文件中加入一个编译指令即可,如:
program Multi_Lang;
uses
{$R
MyRes.dll}
{$R
*.res}
begin
end.
引用时,字符串只要LoadStr(Index)即可,而其它资源用TResourceStream读取,只不过资源句柄就
是程序本身,直接用hInstance就可以了。如:
procedure TTestForm.ReadDirect(Index: Integer);
var
begin
// Delphi中只支持RT_RCDATA类型读取
end;
这种引用方式在编译就将资源与EXE文件链接在一起,而编译之后就不再需要资源文件了。
动态引用方式相对更多加灵活,编译时不需要资源文件,而是在运行时动态地入,这样便可以控件
载入不同的资源文件,这也是实现多语言程序的一种方法。
动态引用实际上只是将资源文件静态包含到另一个工程(一般为DLL程序)中,如:
library MyResDll;
uses
{$R
MyRes.dll}
ResourceString
Begin
End.
引用时像普通的DLL引用一样,将其装载后得到一个句柄,再用静态引用的方法,使用
TResourceStream来读取。如:
procedure TTestForm.ReadDynamic(Index: Integer);
var
begin
end;
这种方法似乎有点复杂。^_^。
将上面的方法变一下,将装载字符串的函数声明在DLL文件中,如:
library MyResDll;
uses
{$R MyRes.dll}
ResourceString
const
{ 声明函数获取字符串个数}
function GetStrCount: Integer; stdcall;
begin
end;
{ 声明函数获取指定索引号的字符串 }
function GetResStr(Index: Integer): PChar; stdcall;
begin
end;
exports
begin
end.
引用的方法与一般的函数库引用方法一样。如:
type
procedure TTestForm.ReadSourceDef(Index: Integer);
var
begin
end;
以上代码在Windows XP Professional + Delphi7下测试通过,如需完整的源码请mail我:
fancy105@163.com。

加载中…