Справочник по компонентам Delphi. Часть 3
Страница 3. Создание нового объекта


 

Создание нового объекта

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

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