Справочник по компонентам Delphi. Часть 3
Страница 4. Получение данных путем \"перетаскивания\"


Получение данных путем "перетаскивания"

Для получения данных путем "перетаскивания" нужно, во-первых, зарегистрировать форму при помощи 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.

 
« Предыдущая статья   Следующая статья »