Для упрощения создания элемента списка форматов есть функция:
function OLEFormat(AFmtId: Word; AName, AResultName: String;
AIsLinkable: Bool): BOLEFormat;
Она заполняет структуру типа BOLEFormat переданными ей параметрами и возвращает указатель на нее. Приведенный выше фрагмент кода можно преобразовать так:
FEmbedClipFmt := RegisterClipboardFormat С Embedded Object');
FLinkClipFmt := RegisterClipboardFormat ('Link Source');
RegisterFormAsOLEDropTarget (Self,
[OLEFormat (PEmbedClipFmt, '%s', '%s', FALSE), OLEFormat (PLinkClipFmt, '%s', '%s', TRUE)]) ;
Для тех случаев, когда регистрацию формы и установку списка возможных форматов нужно произвести раздельно, предусмотрены процедуры:
procedure RegisterFormAsOLEDropTgt(Form: TForm);
procedure SetFormOLEDropFormats(Form: TForm;
const Fmts: array of BOLEFormat) ;
В паре они делают то же, что и RegisterFormAsOLEDropTarget. Для очистки списка форматов можно воспользоваться процедурой:
procedure ClearForrnOLEDropFormats(Form: TForm);
"Перетаскивание" объектов OLE
Форма может принимать данные, направляемые серверами OLE при помощи интерфейса Drag&Drop. Обратите внимание, что этот случай представляет собой исключение из общего правила, разрешающего "перетаскивать" объекты только в пределах одной формы.
Возможность работы Drag&Drop с OLE реализована, например, в приложениях из пакета Microsoft Office, однако, далеко не все серверы OLE 2.0 ее поддерживают.
Для получения данных путем "перетаскивания" нужно, во-первых, зарегистрировать форму при помощи ReisterFormAsOLEDropTarget. Во-вторых, для формы нужно создать обработчик события OnDragDrop (будьте внимательны: именно для формы, а не для контейнера!). При "перетаскивании" данных OLE этот обработчик получает в параметре Source объект специального класса TOLEDropNotify:
Code: |
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.
Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.
ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!