- •6. Системное программное обеспечение для коммуникаций
- •6.1. Общая характеристика коммуникаций
- •6.2. Концепции технологии Клиент-Сервер
- •6.3. Внутренние коммуникации между процессами
- •6.3.1. Неименованные каналы
- •6.3.2. Обмен сообщениями
- •1. Подготовка данных для передачи в Clipboard;
- •2. Открытие Clipboard
- •4. Закрытие Clipboard
- •6.3.5.1. Введение
- •6.3.5.2. Понятие документно-ориентированной среды
- •6.3.5.3. Принципы ole
- •6.3.5.4. Характеристика технологии ole 2.0
- •6.3.5.4.4. Дополнительные возможности ole 2.0:
- •6.3.5.4.5. Внутренние механизмы ole 2.0
- •6.3.5.4.6. Перспективы ole
- •6.3.5.4.7. Недостатки ole
- •6.3.5.5. Технология проектирования ole-контейнера
- •6.3.5.5.1. Трехуровневая адресация ole-объекта
- •6.3.5.5.2. Общая характеристика технологии создания ole-клиента
- •6.3.5.5.3. Методика создания приложения с ole-контейнером
- •1. Создание формы с mdi - многодокументным интерфейсом
- •2. Разработка процедуры вставки объектов
- •3. Разработка процедуры переноса объектов из Clipboard
- •4. Разработка процедуры перетаскивания объектов
- •5. Разработка процедур поддержки хранения объектов в файлах
- •6.3.5.5.4. Выводы
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-контейнера.