如何正确释放DragObject

时间:2015-05-06 20:36:08

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

拖拉后我的内存泄漏错误下降。

memory leak error

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应该放在哪里? 谢谢大家。

1 个答案:

答案 0 :(得分:2)

释放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