【问题标题】:How to correctly free a DragObject如何正确释放 DragObject
【发布时间】:2015-07-17 04:44:06
【问题描述】:

拖放后出现内存泄漏错误。

TMyDragObject = class(TDragObject)
public
    MyInfo : string;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  System.ReportMemoryLeaksOnShutdown := True;
  Button1.DragMode := dmAutomatic;
end;

procedure TForm1.Button1StartDrag(Sender: TObject; var DragObject: TDragObject);
begin
  DragObject := TMyDragObject.Create;
  TMyDragObject(DragObject).MyInfo := 'hi!';
end;

DragObject 应该在哪里被释放? 谢谢大家。

【问题讨论】:

  • 既然您在OnStartDrag 中创建它,那么在OnEndDrag 中释放它不是一个合乎逻辑的地方吗?
  • 当然,但它从未被解雇。有什么遗漏吗?
  • 您的OnDragDropOnDragOver 的代码在哪里用于接受拖动操作的控件?
  • 它们不相关,不接受拖放操作也会发生内存泄漏。
  • TDragObjectEx继承你的TMyDragObject,这样它会在拖动操作结束时自动释放。

标签: delphi memory-management memory-leaks drag-and-drop drag


【解决方案1】:

释放OnDragDrop 处理程序中的对象以供接受放置的控件使用。这是 TMemo 的活动:

procedure TForm4.Memo1DragDrop(Sender, Source: TObject; X, Y: Integer);
begin
  if IsDragObject(Source) then
  begin
    Memo1.Lines.Add(TMyDragObject(Source).MyInfo);
    Source.Free;
  end;
end;

这是一个更完整(并且非常简单)的示例。在表单上放置一个 TButton 和 TMemo,将 Button1.DragMode 设置为 dmAutomatic,将变量 Ctr: Integer 添加到表单的 private 部分,并连接事件处理程序;它允许您将按钮拖到备忘录中,将文本 Item + Ctr 的当前值添加到备忘录的行中。

type
  TMyDragObject=class(TDragObject)
    Info: string;
  end;

procedure TForm4.Button1StartDrag(Sender: TObject; var DragObject: TDragObject);
begin
  Inc(Ctr);
  DragObject := TMyDragObject.Create;
  TMyDragObject(DragObject).Info := 'Item ' + IntToStr(Ctr);
end;

procedure TForm4.Memo1DragDrop(Sender, Source: TObject; X, Y: Integer);
begin
  if IsDragObject(Source) then
  begin
    Memo1.Lines.Add(TMyDragObject(Source).Info);
    Source.Free;
  end;
end;

procedure TForm4.Memo1DragOver(Sender, Source: TObject; X, Y: Integer;
  State: TDragState; var Accept: Boolean);
begin
  Accept := IsDragObject(Source);
end;

作为替代方案,从TDragObjectEx 继承,根据documentation,它会在删除操作结束时自动释放。

注意:TDragObject 不会在拖动结束时自动释放 手术。使用在结束时释放的拖动对象 拖拽操作,改用TDragObjectEx

【讨论】:

  • DragObject 在不接受拖放时也会创建,这可能会导致内存泄漏。从 TDragObjectEx 继承似乎是唯一的解决方案...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-23
  • 2020-08-24
  • 1970-01-01
  • 2018-03-14
  • 2016-02-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多