2014-12-03 2 views
2

У меня есть приложение формы MDI с двумя формами. Первая имеет StringGrid, вторая форма имеет множество элементов управления Edit Edit и несколько кнопок.Перетаскивание из одной формы в любую другую форму

Мне нужно перетащить из сетки и опустить вторую форму и обновить один Изменить со значением выбранной ячейки в StringGrid в первой форме.

Это довольно легко сделать, если я заранее знаю, на каком контроле пользователь выпустит левую кнопку мыши, поскольку я могу установить событие OnDragDrop этого конкретного элемента управления. Но я не хочу кодировать несколько событий OnDragDrop для каждого элемента управления во второй форме.

Как перехватить сообщение в форме, чтобы перехватить операцию сброса на ЛЮБОЙ элемент управления?

+1

Вам не нужно кодировать отдельные 'OnDragOver/OnDragDrop' события. Установите все события управления событиями OnDragOver/OnDragDrop, чтобы указать на один общий обработчик. Параметр 'Sender' сообщает вам, какой элемент управления собирается получить падение, а параметр' Source' сообщает вам - ну, источник. –

+0

Да, я знаю, но мне все же нужно назначить вручную тот же обработчик события onDragDrop для каждого компонента. Возможное решение может состоять в перечислении всех компонентов в форме и программном назначении этого обработчика каждому компоненту ... но я продолжаю получать недопустимую ошибку при отображении, если я пытаюсь это сделать – user1566931

+0

@ user1566931 Перечислить элементы управления, а не компоненты – MBo

ответ

4

Набор пользовательских DragObject в OnStartDrag случае 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; 
Смежные вопросы