我在一个单元中声明了一个类,它需要使用特定的位图。 它在我的测试单元的DFM中声明如下:
object ImgTop: TImage
Left = 208
Top = 568
Width = 777
Height = 41
Picture.Data = {
0A544A504547496D616765A1CF0000FFD8FFE000104A46494600010101025802
[truncated]
};
但在我的最后一个单元中,我不会有dfm。 那么有什么方法可以在我的单位中声明它?
===
谢谢,我现在似乎已经开始工作了,关于位图的大小限制很糟糕:( 这是我做的:
在我的文件夹中是这些文件:
imgleft.bmp
imgtop.bmp
这是我的名为ScanOCRres.rc的资源文件:
1 RT_BITMAP "imgtop.bmp"
2 RT_BITMAP "imgleft.bmp"
我已将其设置为使用C:\ Program Files \ Borland \ Delphi 7 \ bin \ brcc32.exe自动执行
它生成了文件
ScanOCRres.RES
我的单位 实施
{$R *.dfm}
{$R ScanOCRres.RES}
这是我的代码:
var
abmp : TBitmap;
begin
abmp := TBitmap.create;
abmp.LoadFromResourceID(SysInit.HInstance, 1);
abmp.free;
end;
我在LoadFromResourceID行上收到此错误消息:
Project Project1.exe引发异常类EAccessViolation,并在模块'Project1.exe'中显示消息'地址0040A2C8的访问冲突'。 读取地址00000001 '
答案 0 :(得分:7)
你可以将它放在你的代码中,但使用起来不太方便。声明一个字节数组并定义图像的每个字节。祝你好运。要加载它,我将字节数组包装到TMemoryStream
中,然后使用LoadFromStream
。
更好的方法是将图像存储在资源中。编写这样的资源脚本文件:
1 RT_BITMAP "foo.bmp"
将 .rc 文件添加到您的Delphi项目中,它将自动链接到您的程序。在运行时,使用TBitmap.LoadFromResourceId
加载图像:
var
b: TBitmap;
begin
b := TBitmap.Create;
b.LoadFromResourceId(SysInit.HInstance, 1);
答案 1 :(得分:0)
我做到了这一点。它很粗但很有效。将组件的图片转换为picture.data作为字符串。
Procedure ImgToText(Com : TComponent; var str : AnsiString);
var i,c : integer;
s : tmemorystream;
b : byte;
t : array[0..3] of char;
ch : char;
begin
s := tmemorystream.Create;
s.WriteComponent(com);
s.Position := 0;
c := 0;
repeat
s.Read(ch,1);
if ch = '.' then
begin
s.Read(t,4);
if t = 'Data' then
c := s.Position+5;
end;
until c <> 0;
s.Position := c;
str := '';
i := c;
c := 0;
repeat
s.ReadBuffer(b,1);
str := str+inttohex(b,2);
c := c+2;
if c >= 64 then
begin
str := str+#13+#10;
c := 0;
end;
i := i+1;
until i = s.Size-2;
s.Free;
end;