坐落在OnStartDrag
事件的StringGrid的定製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;
你不需要代碼分開'OnDragOver/OnDragDrop'事件。將所有接收控件的OnDragOver/OnDragDrop事件設置爲指向一個公共處理程序。 'Sender'參數告訴你哪個控件即將接收到,而'Source'參數告訴你 - 源代碼。 – 2014-12-03 15:41:08
是的,我知道,但我仍然需要手動將相同的處理程序分配給每個組件的onDragDrop事件。一個可能的解決方案可能是枚舉窗體上的所有組件,並將它們分配給每個組件...但是如果我嘗試這種方法,我會收到無效的類型轉換錯誤 – user1566931 2014-12-03 16:22:19
@ user1566931枚舉控件,而不是組件 – MBo 2014-12-03 17:07:18