我有一个带有两个表单的MDI表单应用程序。第一个有一个StringGrid,第二个有很多Edit控件和几个按钮。
我需要从网格中拖动并放在第二个表单上,并使用第一个表单中StringGrid中所选单元格的值更新一个Edit。
如果我事先知道用户将释放鼠标左键的控件,这很容易做到,因为我可以设置该特定控件的OnDragDrop事件。但我不想为第二个表单上的每个控件编写多个OnDragDrop事件。
如何截取表格范围的消息以拦截任何控件上的放置操作?
答案 0 :(得分:4)
在StringGrid的DragObject事件中设置自定义OnStartDrag
:
{ 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;