Регистрация форматов
Два других способа получения данных OLE — через буфер обмена или посредством "перетаскивания" — требуют выполнения предварительных операций.
Для того чтобы форма могла играть роль получателя данных, нужно сделать следующее:
1. Объявить ее как приемник объектов OLE.
2. Связать с ней список форматов буфера обмена, получение которых будет поддерживаться.
Обе этих задачи решает вызов функции:
procedure RegisterFormAsOLEDropTarget(Form: TForm;
const Fmts: array of BOLEFormat);
Здесь Form — регистрируемая форма, Fmts — массив форматов. Каждый элемент массива форматов является записью типа:
Code: |
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;
Заполнить требуемый массив можно, например, так:
Code: |
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) ; |
Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.
ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!