Delphi的>我可以在我的单元(而不是dfm)中存储位图的数据吗?

时间:2010-11-02 22:03:35

标签: delphi components

我在一个单元中声明了一个类,它需要使用特定的位图。 它在我的测试单元的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 '

2 个答案:

答案 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;