永发信息网

各位高手,我想问一下,在Delphi中调用资源文件到底怎么做啊???

答案:2  悬赏:20  手机版
解决时间 2021-04-06 23:07
  • 提问者网友:謫仙
  • 2021-04-05 22:17
我看了网上的很多教程,可是自己做的时候怎么也编译不成功!在用brcc32 *.rc的时候老是出现"Error Could not open input file *.rc"这样的错误!你能告诉我详细的步骤吗?一步一步的!比如说我喜爱那个在想、资源文件中加入一个exe程序,具体要怎么操作和代码怎么写??
目前我的悬赏分只有这么多了,拜托了!!!!
最佳答案
  • 五星知识达人网友:等灯
  • 2021-04-05 23:28
需要文件:
brcc32.exe:打包工具
temp.rc:资源文件
批处理文件:Res.bat
khgl.bak:要打包的文件
把上面文件放到同一个目录下。

步骤:
1、编辑temp.rc文件,其内容为:
khgl bak khgl.bak
2、编辑批处理文件,内容为:
brcc32 temp.rc
3、执行批处理,生成打包的资源文件,名称为:temp.res

把 temp.res拷贝到执行程序路径下发布。
发布步骤:
1、增加编译选项:
{$R Temp.RES}

2、提取资源:
//通过对象名称和扩展名,从资源中提取文件保存到SaveFile
procedure Res_Object_Load(ObjectName, ObjectExe,SaveFile: String);
var
ResHandle : THandle;
MemHandle : THandle;
MemStream : TMemoryStream;
ResPtr : PByte;
ResSize : Longint;
begin
ResHandle := FindResource(hInstance, PChar(ObjectName), PChar(ObjectExe));
MemHandle := LoadResource(hInstance, ResHandle);
if MemHandle > 32 then
begin
ResPtr := LockResource(MemHandle);
MemStream := TMemoryStream.Create;
ResSize := SizeOfResource(hInstance, ResHandle);
MemStream.SetSize(ResSize);
MemStream.Write(ResPtr^, ResSize);
FreeResource(MemHandle);
MemStream.Seek(0, 0);
MemStream.SaveToFile(SaveFile);
MemStream.Free;
End;
end;
全部回答
  • 1楼网友:山君与见山
  • 2021-04-06 00:33
我写过一个循环显示位图的例子,mysor.rc文件中是这样的: my1 bitmap 1.bmp my2 bitmap 2.bmp my3 bitmap 3.bmp my4 bitmap 4.bmp 编译产生了mysor.res文件,winxp+delphi7运行正常。你可以看一下: unit unit1; interface uses windows, messages, sysutils, variants, classes, graphics, controls, forms, dialogs, extctrls, stdctrls; type tform1 = class(tform) start: tbutton; image1: timage; timer1: ttimer; stop: tbutton; procedure timer1timer(sender: tobject); procedure startclick(sender: tobject); procedure stopclick(sender: tobject); private { private declarations } public { public declarations } end; var form1: tform1; num:integer; implementation {$r mysor.res} {$r *.dfm} procedure tform1.formcreate(sender: tobject); begin num:=1;//初始值为1,读资源文件中第一个bmp end; procedure tform1.timer1timer(sender: tobject); var mybmp:hbitmap; s:string; begin if num<>4 then begin s:='my'+inttostr(num); mybmp:=loadbitmap(hinstance,pchar(s)); image1.picture.bitmap.handle:=mybmp; num:=num+1; end else begin s:='my'+inttostr(num); mybmp:=loadbitmap(hinstance,pchar(s)); image1.picture.bitmap.handle:=mybmp; num:=1; end; end; procedure tform1.startclick(sender: tobject); begin timer1.enabled:=true;//开始 end; procedure tform1.stopclick(sender: tobject); begin timer1.enabled:=false;//停止 end; end. “尽信书,不如无书”,网上很多例子也不尽然完全正确,偶尔有些地方是不太准确的,需要你自己去修改滴。李维老师的书还得出《勘误》呢,更还况网上是免费的! 全局变量pic中没有必要把你的资源文件名都放进去了,因为image1.picture.bitmap.loadfromresourcename()本身就是从资源文件中load图片,干嘛还要放资源名?肯定会找不到的。 你把你的代码换成下面的: var pic:string; begin if idx<4then idx:=idx+1 else idx:=1; pic:='b'+inttostr(idx); //注意这里的变化 image1.picture.bitmap.loadfromresourcename (hinstance,'pic'); end)
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯