高手快来看看啊,,送分啊

pinecrane 2002-08-04 11:25:58
俺是初学Delphi的菜鸟,近来被一问题困扰:
如何把一个.jpg 或者.bmp图象文件做为一个资源加入到一个项目里,从而使生成的可执行文件包含(?)这个资源。

比如:可以用:Timage1.Picture.LoadFromResource(Hinstance, ResourceName);
有一位高手的回复我不太清楚的:

回复人: chechy(我爱洁洁);:
New一个文本文件,然后写上:
YOUR_RES_NAME RCDATA Your.Jpeg
可以写若干行。
将写好的文件改名为your.rc。然后再DOS窗口上,敲如下命令:
brcc32 your.rc
在Delphi的代码中加上
{$R Your.RES}
这就可以了。

我照着上面的方法做了,.res文件到是生成了,可是就是加不到我的EXE里面啊,
我的代码如下:

Image1.Picture.Bitmap.LoadFromResource(Hinstance, 'My.RES');

代码能通过编译的,可是当我用一个按钮的OnClick事件来显示图象也就是用上面的代码的时候,出现了一个异常:EResNotFound. "Res File My.RES not Found."
但是我的路径根本没错的。RES文件在当前路径下啊。。。这为什么啊
急盼高手解释啊: 那个 {$R My.RES} 是加入到哪啊,是 Unit.pas 中,还是
project 的代码里呢???

...全文
20 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
pinecrane 2002-08-04
  • 打赏
  • 举报
回复
哦,,楼上的可真是一位高手啊。

在次表示我对你的谢宜 啊。。。。!!
谢谢。
FlyingQQ 2002-08-04
  • 打赏
  • 举报
回复
解铃还须系铃人,洁洁的事,让洁洁来解决吧,我就不插手了
chechy 2002-08-04
  • 打赏
  • 举报
回复
需要使用下面的函数:
LoadStreamFormResource(Hinstance, YourStream, 'YOUR_RES_NAME');
image1.Picture.Bitmap.Assign(YourStream);
另外,{$R My.RES}随便你放在哪里,但是只能放一次。

procedure LoadStreamFromResource(const HInst: Longword;
const AStream: TStream; const AResourceName: string);
var
ResHandle: THandle;
MemHandle: THandle;
HRes: HRSRC;
ResPtr: PByte;
ResSize: Longint;
begin
ResHandle := FindResourceHInstance(HInst);
HRes := FindResource(ResHandle, PChar(AResourceName), RT_RCDATA);
MemHandle := LoadResource(ResHandle, HRes);
ResPtr := LockResource(MemHandle);
ResSize := SizeOfResource(ResHandle, HRes);
AStream.Size := ResSize;
AStream.Seek(0, 0);
AStream.Write(ResPtr^, ResSize);
FreeResource(MemHandle);
end;
johnmack 2002-08-04
  • 打赏
  • 举报
回复
洁洁的爱人是个高手
byc6352 2002-08-04
  • 打赏
  • 举报
回复
Up
chechy 2002-08-04
  • 打赏
  • 举报
回复
有几件事情必须弄清楚:
1、'YOUR_RES_NAME'是在RC文件中写的,请务必注意,你好像总是用文件名,这是错误的。
2、MyStream有没有初始化?(MyStream := TMemoryStream.Create;)
3、由于读出的是JPEG,需要用TJpegImage读取,然后传给BMP(这里是我疏忽了),代码如下:
var
MyJpeg: TJpegImage;
begin
MyJpeg:= TJpegImage.Create;
myjpeg.LoadFromStream(MyStream);
image1.Picture.Bitmap.Assign(MyJpeg);
MyJpeg.Free;
end;
madyak 2002-08-04
  • 打赏
  • 举报
回复
参考我的贴子:
http://www.csdn.net/expert/topic/923/923334.xml?temp=.9558985
pinecrane 2002-08-04
  • 打赏
  • 举报
回复
这位高手:我又遇到麻烦了:
你给我的函数我用了还不可以的。。我的代码如下:

在Form的OnCreate事件里加入你给我的第一个过程:

Procedure LoadStreamFromResource(Hinstance, YourStream, 'YOUR_RES_NAME');
在这里我用下面的代码调用它:

LoadStreamFromResource(Hinstance, MyStream, 'My.RES');

其中的MyStream 是我在这个单元的implementation部分定义的一个本地全局变量
var MyStream: TStream;
My.RES 是在当前工作目录下的自定义的资源文件。(含一个.jpg)。

我把整个的函数体放在了 implementation 部分:

procedure LoadStreamFromResource(const HInst: Longword;
const AStream: TStream; const AResourceName: string);
var
ResHandle: THandle;
MemHandle: THandle;
HRes: HRSRC;
ResPtr: PByte;
ResSize: Longint;
begin
ResHandle := FindResourceHInstance(HInst);
HRes := FindResource(ResHandle, PChar(AResourceName), RT_RCDATA);
MemHandle := LoadResource(ResHandle, HRes);
ResPtr := LockResource(MemHandle);
ResSize := SizeOfResource(ResHandle, HRes);
AStream.Size := ResSize;
AStream.Seek(0, 0); //运行到这里出现异常:非法访问某块内存。
AStream.Write(ResPtr^, ResSize);
FreeResource(MemHandle);
end;

以上都是你给我的代码的,可是我遇到了2个问题:
1.image1.Picture.Bitmap.Assign(YourStream);
在Delphi中这个参数是TPersistent类型,在这里我想转换,可是出错,
编译不了,总说类型不匹配:Incompatabile Type.
我改用这样的函数:
Image1.Picture.Bitmap.LoadFromStream(MyStream);
编译后能通过了。但是又在Run的时候遇到了下面的问题:
2。
出现了一个异常:
EAsscssViolation
"Read address xxxxxx at Modle Project1.exe, Read at address xxxxxx,
大致就是非法访问了一块内存。 这样就完蛋了,程序运行不了。

俺急死了,您有何高招啊,快给我指点。谢了。

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧