
- •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. Выводы
6.3.5.5.3. Методика создания приложения с ole-контейнером
Методика создания приложения с OLE-контейнером включает в себя следующие этапы.
Создание формы с MDI - многодокументным интерфейсом.
Разработка процедуры вставки объектов.
Разработка процедуры переноса объектов из Clipboard.
Разработка процедуры перетаскивания объектов.
Разработка процедур поддержки хранения объектов в файлах.
1. Создание формы с mdi - многодокументным интерфейсом
Многодокументный интерфейс - это средство, позволяющее в приложении открывать много документов-файлов, каждый с своем окне. Окна, которые добавляются в приложение при открытии каждого документа, называются дочерними.
Создание MDI-приложения - простая задача для Delphi. Достаточно свойству FormStyle главного окна приложения придать значение fsMDIForm, затем добавить новую форму в приложение, свойству FormStyle которой придать значение fsMDIChild.
В дочернюю форму необходимо добавить компонент TOleConteiner.
Дадим следующие имена введенным объектам:
главной форме - OLEFrameForm : TOLEFrameForm;
дочерней форме - OLEObjectForm : TOLEObjectForm;
OLE-контейнеру - OleContainer : TOLEContainer.
Разработка меню приложения
Объектно-ориентированное приложение, начиная с TurboVision DOS, работает следующим образом. Создается меню приложения, к позициям которого "привязываются" процедуры. При выборе необходимой позиции меню вызывается соответствующая процедура.
В нашем случае меню приложения может подвергнуться трансформации путем динамического добавления в него позиций.
Во-первых, оно трансформируется при открытии дочернего окна. Во-вторых, оно трансформируется при активизации сервера, поддерживающего OLE 2.0.
Позиции, в которые внедряются новые элементы меню дочерних окон и сервера, определяются свойством меню GroupIndex. Элементы старого меню могут быть "затерты", а могут быть сдвинуты. Если групповые индексы совпадают, то элементы меню сервера замещают соответствующие элементы меню контейнера. Элементы меню с большими индексами размещаются правее в строке меню.
Меню главного окна: File
New
Open c GroupIndex = 0.
Меню дочерних окон: File Edit Object
New Insert Deactivate
Open Paste
Save с GroupIndex = 0, 1, 2 соответственно.
Реакция на выбор элемента меню File | New описывается следующими методами:
function TOLEFrameForm.CreateChild: TOLEObjectForm;
begin
CreateChild := TOLEObjectForm.Create(Self);
end;
procedure TOLEFrameForm.New1Click(Sender: TObject);
begin
CreateChild
end;
Реакции на выбор других элементов меню - ниже.
2. Разработка процедуры вставки объектов
Вставить объект можно, выбрав пункт меню Edit | Insert. В качестве реакции на выбор создадим следующую процедуру:
procedure TOLEObjectForm.InsertObject1Click(Sender: TObject);
var
Info: Pointer;
begin
if InsertOLEObjectDlg(OLEFrameForm, 0, Info) then begin
InitializeOLEObject(Info);
end;
end;
При вызове этой процедуры выполняется специальная диалоговая функция:
function InsertOLEObjectDlg( Form : TForm;
HelpContext : THelpContext;
Var PInitInfo : Pointer).
Эта функция открывает специальное диалоговое окно, позволяющее выбрать тип OLE-объекта для вставки, например, Audio Recorder, Bitmap Image, Video Clip, Wave Sound и т. д.
Самое важное - это то, что в случае выбора типа объекта, функция создает структуру данных для инициализации OLE-контейнера и возвращает указатель на эту структуру в переменной Info. Эта структура не документирована.
Инициализация OLE-контейнера происходит, когда указатель на описанную структуру передается свойству PInitInfo компонента OLE-контейнера.
В нашем примере это производится с помощью процедуры IntializeOLEObject, которая имеет следующее описание:
procedure TOLEObjectForm.InitializeOLEObject(Info: Pointer);
begin
OLEContainer.PInitInfo := Info;
ReleaseOLEInitInfo(Info); освобождение памяти
end;
При инициализации устанавливаются свойства компонента OLE-контейнера ObjClass, ObjDoc, ObjItem в соответствие с состоянием диалогового окна вставки объекта.
При инициализации OLE-контейнера активизируется OLE-сервер и берет на себя управление, если объект уже существовал, то он передается в сервер. Пользователь теперь может редактировать объект как хочет.
После завершения работы с объектом, его необходимо деактивировать. Деактивация производится сдвигом фокуса к другим объектам приложения. В общем случае для деактивации объекта, необходимо установить свойство Active OLE-контейнера в состояние False. В примере это делает следующая процедура, вызываемая из меню Object|Deactivate:
procedure TOLEObjectForm.Deactivate1Click(Sender: TObject);
begin
OLEContainer.Active := False;
end;