从一个表单拖放到另一个表单的任意位置

Posted

技术标签:

【中文标题】从一个表单拖放到另一个表单的任意位置【英文标题】:Drag and drop from one form to anywhere in another form 【发布时间】:2015-02-01 03:13:25 【问题描述】:

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

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

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

如何拦截表单范围的消息以拦截 ANY 控件上的放置操作?

【问题讨论】:

您无需编写单独的OnDragOver/OnDragDrop 事件。将所有接收控件的OnDragOver/OnDragDrop 事件设置为指向一个公共处理程序。 Sender 参数告诉你哪个控件将要接收丢弃,Source 参数告诉你 - 好吧,来源。 是的,我知道,但我仍然需要手动为每个组件的 onDragDrop 事件分配相同的处理程序。一个可能的解决方案是枚举表单上的所有组件并以编程方式将该处理程序分配给每个组件......但是如果我尝试这样做,我会不断收到无效的类型转换错误 @user1566931 枚举控件,而不是组件 【参考方案1】:

在StringGrid的OnStartDrag事件中设置自定义DragObject:

 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;

【讨论】:

以上是关于从一个表单拖放到另一个表单的任意位置的主要内容,如果未能解决你的问题,请参考以下文章

将值从表单传递到表单

错误:表单响应必须重定向到另一个位置

Layui表单赋值 / 取值与任意位置按钮提交表单

Layui表单赋值 / 取值与任意位置按钮提交表单

Django 使用绑定表单重定向到另一个视图

拖放 - vb.net