Справочник по компонентам Delphi. Часть 3 - "Перетаскивание" объектов OLE
ОГЛАВЛЕНИЕ
"Перетаскивание" объектов OLE
Форма может принимать данные, направляемые серверами OLE при помощи интерфейса Drag&Drop. Обратите внимание, что этот случай представляет собой исключение из общего правила, разрешающего "перетаскивать" объекты только в пределах одной формы.
Возможность работы Drag&Drop с OLE реализована, например, в приложениях из пакета Microsoft Office, однако, далеко не все серверы OLE 2.0 ее поддерживают.
Получение данных путем "перетаскивания"
Для получения данных путем "перетаскивания" нужно, во-первых, зарегистрировать форму при помощи ReisterFormAsOLEDropTarget. Во-вторых, для формы нужно создать обработчик события OnDragDrop (будьте внимательны: именно для формы, а не для контейнера!). При "перетаскивании" данных OLE этот обработчик получает в параметре Source объект специального класса TOLEDropNotify:
TOLEDropNotify = class(TObject)
public
procedure Setlnfo(Form: TForm; Rect: TRect; Info: BOLEInitInfo);
property DropPorm: TForm;
property DropRect: TRect;
property DataPormat: Word;
property DataHandle: THandle;
property PInitInfo: Pointer;
end;
Его свойства приведены в таблице:
property DropForm: TForm; | Определяет форму, в которую перемещены данные. Значение обычно равно Self. |
(Ro) property DropRect: TRect; | Определяет прямоугольник, в который производилось перемещение. Обычно стягивается в точку, где была отпущена кнопка мыши. |
(Ro) property DataFormat: Word; | Определяет формат перемещенных данных. (Ro) property DataHandle: THandle; Содержит дескриптор перемещенных данных. |
(Ro) property pinitinfo: pointer; | Содержит указатель на структуру для инициализации. |
Сброшенные данные могут как представлять объект OLE, так и иметь один из обычных форматов. Логическая взаимосвязь между тремя последними свойствами такая:
- если получен объект OLE, то в параметре DataFormat возвращается значение -1. В этом случает дескриптор DataHandle недействителен, смысл имеет только свойство PInitInfo;
- если получены данные в одном из обычных форматов, то свойство DataFormat содержит идентификатор этого формата, DataHandle — дескриптор соответствующих данных, a PInitInfo имеет значение nil.
Один из примеров обработчиков события OnDragDrop выглядит так:
procedure TFormI.OLEContainerlDragDropfSender, Source: TObject; X, Y: Integer);
begin
if Source is TOLEDropNotify then
with Source as TOLEDropNotify do
begin
if (DataFormat = CF_TEXT) then
begin
Labell.Caption := StrPas(GlobalLock(DataHandle));
GlobalUnlock(DataHandle);
GlobalFree(DataHandle);
end
else if DataFormat = Word(-l) then
OLEContainerI.PInitInfo := TOLEDropNotify(Source).PInitInfo;
end;
end;
Обратите внимание, что в этом примере полученную структуру PInitInfo не нужно освобождать при помощи ReleaseOLEInitInfo.