在运行时创建并填充ImageList

时间:2017-05-05 11:33:23

标签: delphi runtime imagelist

来自C#和Visual Studio到Delphi 10.1柏林对我来说非常难,但是一些性能至关重要,而且我已经很久没有使用Delphi(超过10年)了,所以我&#39 ; m被阻止。

我需要在运行时创建一个ImageList并将其存储在单个对象中,但由于读取内存时出现异常,我无法做到这一点。

以下是我的代码摘录:

ImagesRessource = class
private
  _owner: TComponent;   
  _imageList: TimageList;
  _man24: TPngImage;
  constructor Create;
  function GetBmpOf(png: TPngImage): TBitmap;
public
  procedure  Initialize(own: TComponent);   
end;

implementation

constructor ImagesRessource.Create;
begin
  ;
end;

procedure ImagesRessource.Initialize(owner: TComponent);
var
  bmp: TBitmap;
  RS  : TResourceStream;
begin
  try
    _man24 := TPngImage.Create;
    RS := TResourceStream.Create(hInstance, 'man_24', RT_RCDATA);
    _man24.LoadFromStream(RS);
    bmp := GetBmpOf(_man24);
    _imageList := TimageList.Create(owner);
    _imageList.Width := 24;
    _imageList.Height := 24;
    _imageList.AddMasked(Bmp, Bmp.TransparentColor); // exception read memory here
  except
    raise;
  end;
end;

function ImagesRessource.GetBmpOf(png: TPngImage): TBitmap;
var
  bmp: TBitmap;
begin
  bmp := TBitmap.Create;
  bmp.Width := png.Width;
  bmp.Height := png.Height;
  png.Draw(bmp.Canvas, bmp.Canvas.ClipRect);
end;

这里有什么问题?

1 个答案:

答案 0 :(得分:1)

你不能从GetBmpOf返回任何内容。您必须分配到Result变量。)

function ImagesRessource.GetBmpOf(png: TPngImage): TBitmap;
begin
  Result := TBitmap.Create;
  Result.Width := png.Width;
  Result.Height := png.Height;
  png.Draw(Result.Canvas, Result.Canvas.ClipRect);
end;

您还泄漏了PNG图像_man24,它在任何情况下都应该是局部变量。你在某些地方硬编码大小为24而不是其他地方。你尝试除了块是没有意义的。