为什么不调用OnEndDrag事件?

时间:2018-02-06 14:08:07

标签: delphi drag-and-drop

我正试图检测拖拽的结束。使用TControl.OnEndDrag event删除操作。

OnEndDrag事件分配DragObject参数时,似乎永远不会调用OnStartDrag事件。

  TMyForm = class(TForm)
    procedure FormCreate(Sender: TObject);
  public
    MyLabel : TLabel;
    procedure MyOnEndDrag(Sender, Target: TObject; X, Y: Integer);
    procedure MyOnStartDrag(Sender: TObject; var DragObject: TDragObject);
  end;

procedure TMyForm.FormCreate(Sender: TObject);
begin
  MyLabel := TLabel.Create(Self);
  MyLabel.Caption := 'Drag me';
  MyLabel.Left := 50;
  MyLabel.Top := 50;
  MyLabel.OnStartDrag := MyOnStartDrag;
  MyLabel.OnEndDrag := MyOnEndDrag;
  MyLabel.DragMode := dmAutomatic;
  MyLabel.Parent := Self;
end;

procedure  TMyForm.MyOnEndDrag(Sender, Target: TObject; X, Y: Integer);
begin
  ShowMessage('MyOnEndDrag');
end;

procedure  TMyForm.MyOnStartDrag(Sender: TObject; var DragObject: TDragObject);
begin
  DragObject := TDragObjectEx.Create;
end;

我认为问题可能与DragObject的类有关但我不明白我做错了什么。如何确保调用OnEndDrag事件?

1 个答案:

答案 0 :(得分:2)

拖动对象需要知道拖动结束时应该通知哪个控件。 VCL中此类操作的专用类,即可与单个控件关联的拖动对象,为TBaseDragControlObjectTDragControlObject[Ex]是适当的后代,处理掉落而不是处理对接的兄弟TDragDockObject

DragObject := TDragControlObjectEx.Create(MyLabel);