Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
26
Добавлен:
02.05.2014
Размер:
384.51 Кб
Скачать

3. Разработка процедуры переноса объектов из Clipboard

Некоторые OLE-серверы позволяют пользователю копировать OLE-объекты в Clipboard. Тогда приложение OLE-контейнер имеет возможность получить из Clipboard-а этот объект.

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

Function PasteSpecialDlg(Form : TForm;

Const Fmt : Array of BOLEFormat;

HelpContext : THelpContext;

Var Format : Word;

Var Handle : THandle;

Var PInitInfo : Pinter) : Boolean;

Где Form - форма, владеющая OLE-контейнером;

Fmt - массив зарегистрированных форматов объектов;

HelpContext - ссылка на раздел контекстной помощи;

Format - выбранный тип формата данных в Clipboard;

Handle - ссылка на данные в Clipboard-е;

PInitInfo - указатель на структуру данных для инициализации OLE-контейнера.

Рассмотрим более подробно массив зарегистрированных форматов OLE-объектов.

Размерность этого массива определяется количеством форматов Clipboard-а, которые должны восприниматься OLE-контейнером. В нашем случае мы планируем, чтобы контейнер воспринимал два формата - связанные объекты и встроенные объекты, поэтому массив форматов, передаваемый функции PasteSpecialDlg, может иметь следующий вид:

Fmts : Array[0..1] Of BOLEFormat.

Тип BOLEFormat имеет следующую структуру:

Type

BOLEFormat = Record

fmtId : Word; идентификатор формата

fmtName : Array[0..31] Of Char; имя типа объекта, которое формирует сервер, например, 'Paintbrush Picture Object' и которое появляется в списке возможных типов объектов в диалоговом окне

fmtResultName : Array[0..31] Of Char; результирующее имя типа объекта, появляющееся в поле результирующего имени в диалоговом окне

fmtIsLinkable : Boolean; true - для связанного объекта; false - для встроенного

fmtMedium : BOLEMeduium; численная константа для определения типа данных объекта, м.б. BOLE_MED_STREAM - для связанного объекта или BOLE_MED_STORAGE - для встроенного объекта. Для вычисления используется функция BOLEMediumCalc

End BOLEFormat;

Эти форматы должны быть зарегистрированы в Clipboard-е. Регистрация форматов состоит в вызове специальной функции, которой передается строка с названием формата, а возвращается идентификатор зарегистрированного формата. Примеры вызова функции регистрации представлены ниже:

FLinkClipFmt := RegisterClipboardFormat('Link Source');

FEmbedClipFmt := RegisterClipboardFormat('Embedded Object');

Где

FLinkClipFmt и FEmbedClipFmt - переменные типа Word, в которые возвращаются идентификаторы форматов после регистрации.

После регистрации необходимо заполнить массив форматов.

Регистрация форматов и заполнение массива форматов должны быть произведены на начальном этапе работы приложения-контейнера. Поэтому эти действия могут быть помещены в процедуру, вызываемую при создании главной формы, например:

procedure TOLEFrameForm.FormCreate(Sender:TObject)

begin

FLinkClipFmt := RegisterClipboardFormat('Link Source');

FEmbedClipFmt := RegisterClipboardFormat('Embedded Object');

Fmts[0].fmtId := FEmbedClipFmt;

Fmts[0].fmtMedium := BOLEMediumCalc(FEmbedClipFmt);

Fmts[0].fmtIsLinkable := False;

StrPCopy(Fmts[0].fmtName,'%s');

StrPCopy(Fmts[0].fmtResultName,'%s');

Fmts[0].fmtId := FLinkClipFmt;

Fmts[0].fmtMedium := BOLEMediumCalc(FLinkClipFmt);

Fmts[0].fmtIsLinkable := True;

StrPCopy(Fmts[0].fmtName,'%s');

StrPCopy(Fmts[0].fmtResultName,'%s');

end;

После регистрации форматов и заполнения массива, описывающего форматы, возможно осуществление вставки объекта из Clipboard. Для этого из пункта меню Edit|Paste можно вызывать следующую процедуру:

procedure TOLEObjectForm.PasteSpecial1Click(Sender: TObject);

var

ClipFmt : Word;

DataHand : THandle;

Inf : Pointer;

begin

if PasteSpecialEnabled(Self,OLEFrameForm.Fmts) then begin

if PasteSpecialDlg(Self,OLEFrameForm.Fmts,0,ClipFmt,DataHand,Info) then begin

InitializeOLEObject(Info);

end;

end;

end;

Здесь функция PasteSpecialEnabled сначала проверяет, есть ли в Clipboard-е один из форматов, определенных в Fmts - массиве, и только в случае наличия такого формата, вызывается функция PasteSpecialDlg, которая также возвращает указатель на структуру данных для инициализации OLE-контейнера.

Соседние файлы в папке Шпоры по СПО