|
Сервер
поддерживается
кафедрой информатики и
вычислительной техники ГрГУ
тел. +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
|