Интерфейс переноса Drag-and-Drop
Листинг 27.1. Секция implementation модуля главной формы проекта DemoDragDrop.
implementation {$R *.DFM) procedure TMainForm.EditlMouseDown (Sender: TObject; Button: TMouseButton; SHIFT: TSHIFTState; X, У: Integer); begin if Button = mbLeft then TEdit(Sender).BeginDrag(True); end; procedure TMainForm.Edit2DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); begin if Source is TEdit then Accept: = True else Accept:<= False; end; procedure TMainForm.Edit2DragDrop(Sender, Source: TObject; X, Y: Integer); begin TEdit(Sender).Text: = TEdit(Source).Text; TEdit(Sender).SetFocus; TEdit(Sender).SelectAll; end; procedure TMainForm.EditlEndDrag(Sender, Target: TObject; X, Y: Integer); begin if Assigned(Target) then TEdit(Sender).Text: = 'Текст перенесен в ' + TEdit(Target).Name; end; procedure TMainForm.FormDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); begin if Source.ClassName = 'TPanel' then Accept: = True else Accept: = False; end; procedure TMainForm.FormDragDrop(Sender, Source: TObject; X, Y: Integer); begin TPanel(Source).Left: = X; TPanel(Source).Top: = Y; end; end.
Для однострочного редактора Edit1 определены методы-обработчики источника. В методе EditiMouseDown обрабатывается нажатие левой кнопки мыши и включается механизм переноса. Так как свойство DragMode для Edit1 имеет значение dmManual, то компонент без проблем обеспечивает получение фокуса и редактирование текста.
Метод EditiEndDrag обеспечивает отображение информации о выполнении переноса в источнике.
Для компонента Edit2 определены методы-обработчики приемника. Метод Edit2DragOver проверяет класс источника и разрешает или запрещает прием.
Метод Edit2DragDrop осуществляет перенос текста из источника в приемник.
Примечание
Обратите внимание, что оба компонента TEdit одновременно являются источниками и приемниками. Для этого каждый из них использует методы-обработчики другого. А исходный код методов настроен на обработку владельца как экземпляра класса TEdit.
Форма, как приемник Drag-and-Drop, обеспечивает перемещение панели Panel2, которая выступает в роли источника. Метод FormDragOver запрещает прием любых компонентов, кроме панелей. Метод FormDragDrop осуществляет перемещение компонента.
Панель не имеет своих методов-обработчиков, т. к. работает в режиме dmAutomatic и не нуждается в дополнительной обработке завершения переноса.