从一种形式拖放到另一种形式的任何位置

use*_*931 3 delphi drag-and-drop drag delphi-xe2

我有一个带有两个表单的 MDI 表单应用程序。第一个有一个 StringGrid,第二个有很多 Edit 控件和几个按钮。

我需要从网格中拖放到第二个表单上,并使用第一个表单中 StringGrid 中所选单元格的值更新一个 Edit。

如果我事先知道用户将在哪个控件上释放鼠标左键,这很容易做到,因为我可以设置该特定控件的 OnDragDrop 事件。但我不想为第二个窗体上的每个控件编写多个 OnDragDrop 事件。

如何拦截表单范围的消息以拦截任何控件上的删除操作?

NGL*_*GLN 5

设置自定义DragObjectOnStartDrag的StringGrid的事件:

{ TMyDragObject }

type
  TMyDragObject = class(TDragControlObjectEx)
  protected
    DragText: String;
    procedure Finished(Target: TObject; X, Y: Integer; Accepted: Boolean); override;
    function GetDragCursor(Accepted: Boolean; X, Y: Integer): TCursor; override;
  end;

procedure TMyDragObject.Finished(Target: TObject; X, Y: Integer; Accepted: Boolean);
begin
  if Target is TCustomEdit then
    TCustomEdit(Target).SelText := DragText;
  inherited;
end;

function TMyDragObject.GetDragCursor(Accepted: Boolean; X, Y: Integer): TCursor;
begin
  if TObject(DragTarget) is TCustomEdit then
    Result := crDrag
  else
    Result := inherited GetDragCursor(Accepted, X, Y);
end;

{ TForm1 }

procedure TForm1.StringGrid1StartDrag(Sender: TObject; var DragObject: TDragObject);
begin
  DragObject := TMyDragObject.Create(StringGrid1);
  TMyDragObject(DragObject).DragText := StringGrid1.Cells[StringGrid1.Col,
    StringGrid1.Row];
end;
Run Code Online (Sandbox Code Playgroud)