Страница 3 из 42 Создание нового объекта Этот способ применяется, когда вы хотите добавить к приложению данные из уже существующего файла, снабдив их возможностями одного из серверов OLE, который "умеет" с этими данными работать. Данные можно внедрить или связать. Можно также внедрить новый (пустой) объект, в этом случае сразу будет вызван сервер. В основе этого способа лежит вызов функции: function InsertOLEObjectDIg(Form: TForm; HelpContext: THelpContext; var PInitInfo: Pointer): Boolean; Она инициализирует диалог, позволяющий создать новый объект OLE. В случае успешного окончания диалога создается структура типа BOLEInitInfo. Пример этого достаточно прост: procedure TFormI-BitBtnIClick(Sender: Tobject); var Thelnfo : Pointer; begin if InsertOLEObjectDIg(Self, 0, Thelnfo) then begin OLEContainerI.PInitInfo := Thelnfo; ReleaseOLEInitInfо(Thelnfo) ; end; end; Регистрация форматов Два других способа получения данных OLE — через буфер обмена или посредством "перетаскивания" — требуют выполнения предварительных операций. Для того чтобы форма могла играть роль получателя данных, нужно сделать следующее: 1. Объявить ее как приемник объектов OLE. 2. Связать с ней список форматов буфера обмена, получение которых будет поддерживаться. Обе этих задачи решает вызов функции: procedure RegisterFormAsOLEDropTarget(Form: TForm; const Fmts: array of BOLEFormat); Здесь Form — регистрируемая форма, Fmts — массив форматов. Каждый элемент массива форматов является записью типа: BOLEFormat = Record fmtid: Word; fmCName: array [0.. 31] of char; fmtResultName: array[0..31] of char; fmtMedium: BOLEMedium; fmtIsLinkable: Bool; end; Поля записи имеют следующее назначение: fmtid — идентификатор формата буфера обмена. Это может быть как стандартный формат (CF_TEXT, CF_BITMAP и др.), так и специальный формат для объектов OLE. В этом случае он должен быть зарегистрирован при помощи функции RegisterClipboardFormat (см. пример ниже); fmtName — имя, которое появится в списке форматов диалога PasteSpecialDIg; fmtResultName — имя формата, которое появится в комментариях внутри этого диалога. Например, если значение fmtResultName равно "Bitmap", то пользователь получит примерно следующий комментарий: "Inserts the contents of the Clipboard into your document as Bitmap"; fmtIsLinkable — показывает, могут ли данные в этом формате играть роль связанных объектов. fmtMedium — константа, идентифицирующая тип данных в буфере обмена. Связана со значением поля fmtid следующим образом: BOLEMEDSTREAM | Связанные объекты OLE. | BOLEMEDSTORAGE | Внедренные объекты OLE. | BOLEMEDMFPICT | Метафайлы (CF.METAFILEPICT). | BOLEMEDGDI | Графические данные (CF BITMAP, CF SYLK, CF DIP, CF TIFF, CF DIB, CF PALETTE, CF PENDATA, CFJUFF, CFWAVE). | BOLEMEDHGLOBAL | Все прочие данные. | Специально для вычисления значения поля fmtMedium по формату данных предусмотрена функция: function BOLEMediumCalc(frntid: Word): BOLEMedium;
Заполнить требуемый массив можно, например, так: var FEmbedClipFmt, FLinkClipFmt: Word; Fmts: array[0..2] of BOLEFormat; FEmbedClipFmt := RegisterClipboardFormat('Embedded Object'); FLinkClipFmt := RegisterClipboardFormat('Link Source'); Fmts[0].fmtid := FEmbedClipFmt; Fmts[0].fmtMedium := BOLEMediumCalc(FEmbedClipFmt); Fmts[0].fmtIsLinkable := False; StrPCopy (Fmts[0].fmtName, '%s'); StrPCopy (Fmts[0].fmtResultName, '%s'); Fmts[l].fmtid := FLinkClipFmt; Fmts[l].fmtMedium := BOLEMediumCalc(FLinkClipFmt); Fmts[1].fmtIsLinkable := True; StrPCopy (Fmts[1].fmtName, '%s'); StrPCopy (Fmts[1].fmtResultName, '%s'); Fmts[2].fmtid := CF_BITMAP; Fmts[2].fmtMedium := BOLEMediumCalc(CF_BITMAP); Fmts[2].fmtIsLinkable := False; StrPCopy (Fmts[2].fmtName, 'Bitmap'); StrPCopy (Fmts[2].fmtResultName, 'Device-dependent Bitmap'); RegisterFormAsOLEDropTarget(Self, Fmts) ; Для упрощения создания элемента списка форматов есть функция: 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 ее поддерживают. |