Вход


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

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


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

  


Использование OLE. Регистрация форматов


Два других способа получения данных OLE ? через буфер обмена или посредством "перетаскивания" ? требуют выполнения предварительных операций.

Для того чтобы форма могла играть роль получателя данных, нужно сделать следующее:

Объявить ее как приемник объектов OLE. Связать с ней список форматов буфера обмена, получение которых будет поддерживаться.

Обе этих задачи решает вызов функции:

procedure RegisterFormAsOLEDropTarget(Form: TForm;
═══════════════const Fmts: array of BOLEFormat);

Здесь Form ? регистрируемая форма, Fmts ? массив форматов.

Каждый элемент массива форматов является записью типа:

BOLEFormat = Record
══════════════════════════════fmtId: Word;
══════════════════════════════fmtName: 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 следующим образом:

BOLE_MED_STREAM Связанные объекты OLE.
BOLE_MED_STORAGE Внедренные объекты OLE.
BOLE_MED_MFPICT Метафайлы (CF_METAFILEPICT).
BOLE_MED_GDI Графические данные (CF_BITMAP, CF_SYLK, CF_DIF, CF_TIFF, CF_DIB, CF_PALETTE, CF_PENDATA, CF_RIFF, CF_WAVE).
BOLE_MED_HGLOBAL Все прочие данные.

 

Специально для вычисления значения поля fmtMedium по формату данных предусмотрена функция:

function BOLEMediumCalc(fmtId: Word): BOLEMedium;

Заполнитъ требуемый массив можно, например, так:

Var
═══════════════FEmbedClipFmt, FLinkClipFmt: Word;
═══════════════Pints: array[0..2] of BOLEFormat;

FEmbedClipFmt := RegisterClipboardFormat('Embedded Obj ect');
FLinkClipEmt := 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 := PLinkClipFmt;
Fmts[1].fmtMedium := BOLEMediumCalc(FLinkClipFmt);
Fmts[1].fmtIsLinkable := True;
StrPCopy (Fmts[l].fmtName, '%s');
StrPCopy (Fmts[1].fmtResultName, '%s');
Fmts[2].fmtId := CF_BITMAP;
Fmts[2].frntMedium := 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 (FEmbedClipFmt, '%s', '%s', FALSE),
═══════════════OLEFormat (FLinkClipFmt, '%s', '%s', TRUE)] ) ;

Для тех случаев, когда регистрацию формы и установку списка возможных форматов нужно произвести раздельно, предусмотрены процедуры:

procedure RegisterFormAsOLEDropTgt(Form: TForm);

procedure SetFormOLEDropFormats(Form: TForm; const Fmts: array of BOLEFormat);

В паре они делают то же, что и RegisterFormAsOLEDropTarget. Для очистки списка форматов можно воспользоваться процедурой:

procedure ClearFormOLEDropFormats(Form: TForm);



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

  


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

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