gpt4 book ai didi

delphi - TAwImageGrid - 如果删除最后一个图像,程序会泄漏内存

转载 作者:行者123 更新时间:2023-12-03 15:56:14 25 4
gpt4 key购买 nike

使用:Delphi XE7 更新 1,TAwImageGrid ,在 Intel Core i7-2820QM 上运行的 Windows 10 Professional。

此代码将图像从数据库加载到网格中:

var
s, w: String;
r: Integer;
ms: TMemoryStream;
bmp: TBitmap;
begin
r := uqProj_Search.RecordCount;

// Load images

for r := imgGrid.Count - 1 downto 0 do
imgGrid.Items.Images[r].Free;

imgGrid.Clear;

ms := TMemoryStream.Create;
try
while not(uqProj_Search.Eof) do
begin
r := uqProj_Search.FieldByName('row_id').AsInteger;

// :proj_id
uqImg_S.ParamByName('proj_id').AsInteger := r;
uqImg_S.Prepared := True;
uqImg_S.Open;

ms.Clear;
uqImg_Simg.SaveToStream(ms);

uqImg_S.Close;

ms.Position := 0;
bmp := TBitmap.Create;
try
bmp.LoadFromStream(ms);

imgGrid.Items.Add(IntToStr(r));
imgGrid.Items.Images[imgGrid.Count - 1] := TBitmap.Create;
imgGrid.Items.Images[imgGrid.Count - 1].Assign(bmp);
finally
bmp.Free;
end;

uqProj_Search.Next;
end;

finally
ms.Free;
end;

end;

我在 KeyDown 事件中包含以下代码(按下 Del 键时调用):

procedure TfmSrchRec.imgGridKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
var
x, p: Integer;
AFormat: Word;
AData: THandle;
APalette: HPalette;
begin
x := imgGrid.ItemIndex;
p := StrToInt(imgGrid.Items.Strings[x]);

if (x = -1) then
Exit;

if (UpCase(Char(Key)) = 'C') and (Shift = [ssCtrl]) then
begin
// Clipboard.Assign(imgGrid.Images[imgGrid.ItemIndex])
TBitmap(imgGrid.Images[x]).Dormant;
TBitmap(imgGrid.Images[x]).SaveToClipboardFormat(AFormat, AData, APalette);
Clipboard.SetAsHandle(AFormat, AData);
end
else if (Key = VK_DELETE) then
begin
imgGrid.Items.Images[x].Free;
imgGrid.Items.Delete(x);
end;
end;

在表单的 OnClose 事件中释放内存:

procedure TfmSrchRec.FormClose(Sender: TObject; var Action: TCloseAction);
var
r: Integer;
begin
for r := imgGrid.Count - 1 downto 0 do
imgGrid.Items.Images[r].Free;
end;

问题是这样的:

从网格中删除图像后,如果该图像是最后剩余的图像,则关闭程序将产生以下错误消息:

---------------------------
Unexpected Memory Leak
---------------------------
An unexpected memory leak has occurred. The unexpected small block leaks are:



61 - 68 bytes: Unknown x 1


---------------------------
OK
---------------------------

如果在应用程序关闭之前网格中存在剩余图像,则不会发生该错误。我在项目启动时(在 DPR 文件中)有 ReportMemoryLeaksOnShutDown := True

我猜测这个错误与组件的代码有关,而不是我使用它的方式。我希望 TAwImageGrid 组件作者 NGLN 能够看看这个问题并提供答案,但也欢迎其他 Delphi 专家。

链接:

  1. TAwImageGrid组件源码官方主页: https://github.com/NGLN/AwImageGrid

  2. StackOverflow 问题很好地介绍了该组件: Looking for a custom image grid

最佳答案

我可以重现您的发现并将其视为一个错误。

在制作组件时,我从 D7 复制了 TStringList 的实现,即使用指向不存在的固定大小数组的指针来存储项目的内部。奇怪的是,我找不到它的缺陷,但 D7 的 TStringList 实现不会产生这个错误。我想它与explained here有关.

我看到XE2中TStringList的实现改为使用动态数组。当我将组件的代码更改为相同的设计时,内存泄漏就消失了。所以我也会改变开源代码,但暂时你可以自己做。

关于delphi - TAwImageGrid - 如果删除最后一个图像,程序会泄漏内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33289354/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com