拖拉后我的内存泄漏错误下降。
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应该放在哪里? 谢谢大家。
答案 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