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