Справочник по компонентам 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.