Вход


Главная страница >> Учебный процесс >> Конспекты >> Delphi. Библиотека визуальных компонентов VCL >> Описание компонентов VCL >> Интерфейс OLE. >> Использование OLE. Перетаскивание объектов
Переход на главную страницу

Сервер поддерживается
кафедрой информатики и вычислительной техники ГрГУ
тел. +375-(0)152-445-101
E-mail :
kadan@grsu.grodno.by


[Назад]    [Содержание ]    [Вперед]

  


Использование 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 DropForm: TForm;
═══════════════property DropRect: TRect;
═══════════════property DataFormat: Word;
═══════════════property DataHandle: THandle;
═══════════════property PInitInfo: Pointer;
end;

Его свойства приведены в таблице:

(Rо) 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 TForm1.OLEContainer1DragDrop(Sender, Source: TObject; X, Y: Integer) ;
begin
═════if Source is TOLEDropNotify then
═════with Source as TOLEDropNotify do
══════════begin
═══════════════if (DataFormat = CF_TEXT) then
════════════════════begin
═════════════════════════Label1.Caption := StrPas(GlobalLock(DataHandle));
═════════════════════════GlobalUnlock(DataHandle);
═════════════════════════GlobalFree(DataHandle) ;
════════════════════end
═══════════════else if DataFormat = Word(-1) then
══════════════════════════════OLEContainerl.PInitInfo :=TOLEDropNotify(Source).PInitInfo;
══════════end;
end;

Обратите внимание, что в этом примере полученную структуру PInitInfo не нужно освобождать при помощи ReleaseOLEInitInfo.



[Назад]    [Содержание ]    [Вперед]

  


Для комментария : kadan@grsu.grodno.by

  
За содержание страницы отвечает Гончарова М.Н.
©
Кафедра СПиКБ, 2002-2017