На этом шаге мы рассмотрим правила использования компонента OleContainer.
OLE-документы - это, но существу, внедренные или связанные объекты, созданные приложениями, выступающими в качестве СОМ-серверов. Правила создания контейнеров для таких объектов (называемых иногда OLE-контейнерами) описывает соответствующая спецификация СОМ, и одно из основных требований этой спецификации - так называемая активация по месту (in-place activation), то есть реализация возможности редактирования объекта, находящегося в OLE-контейнере, за счет автоматического запуска для этой цели приложения-сервера.
Для создания и использования OLE-документов в приложениях, разрабатываемых в Delphi, предназначен компонент TOleContainer, находящийся на странице System палитры компонентов. Этот компонент инкапсулирует все интерфейсы, необходимые для создания клиентов OLE-документов.
Компонент TOleContainer позволяет поместить OLE-документ на поверхность формы. Наиболее часто используемыми свойствами этого компонента являются:
Наиболее часто используются следующие методы этого компонента:
Создадим простейшее приложение, иллюстрирующее использование компонента TOleContainer. С этой целью поместим на форму компонент TPanel со свойством Align, равным alClient, на него - компонент TOleContainer и главное меню (можно создать в нем пункты New object и Exit). Панель и меню нужны для отображения панелей инструментов и меню OLE-серверов, обслуживающих отображаемые в компоненте TOleContainer объекты. Если на форме, содержащей компонент TOleContainеr, имеется меню, то меню сервера будет присоединено к меню приложения согласно правилам слияния меню, принятым в Windows. Если компонент TOleContainer помещен на компонент TPanel, последний будет отображать панель инструментов сервера (рисунок 1).
Рис.1. Исходная форма
Создадим обработчик события, связанный с выбором пункта меню New Object:
procedure TForm1.NewObject1Click(Sender: TObject); begin OleContainer1.InsertObjectDialog; end;
Запустив приложение и щелкнув по этому пункту меню, получим диалоговое окно Insert Object (Вставка объекта) (рисунок 2).
Рис.2. Диалоговое окно вставки объекта
В списке, представленном в этом диалоговом окне, перечислены все серверы OLE-документов, зарегистрированные на данном компьютере. Можно выбрать один из них (например, Лист Microsoft Excel). Теперь после двойного щелчка на компоненте TOleContainer компонент TPanel будет содержать панель инструментов Microsoft Excel и главное меню этого приложения, а сам OLE-контейнер - новую рабочую книгу Excel (рисунок 3).
Рис.3. Активный объект в OLE-контейнере
Если тип объекта, отображаемого в OLE-контейнере, известен заранее, можно использовать метод CreateObject компонента TOleContainer:
procedure TForm1.NewExcelworksheet1Click(Sender: TObject); begin OleContainer1.CreateObject('Excel.Sheet', False); end;
Второй параметр этого метода указывает, отображать ли в виде значка объект внутри OLE-коитейиера.
Модифицируем приложение, добавив еще несколько пунктов меню (рисунок 4).
Рис.4. Меню
Создадим соответствующие обработчики событий:
procedure TForm1.ShowProrerties1Click(Sender: TObject); begin if OleContainer1.OleObjectInterface <> nil then OleContainer1.ObjectPropertiesDialog else ShowMessage ('OleContainer is empty'); end; procedure TForm1.Pastespecial1Click(Sender: TObject); begin OleContainer1.PasteSpecialDialog; end;
Скомпилируем приложение и на этапе выполнения добавим какой-нибудь объект в OLE-коитейпер. Выбрав команду Action | Show Properties нашего приложения, получим стандартное диалоговое окно с описанием свойств OLE-объекта (рисунок 5).
Рис.5. Диалоговое окно с описанием свойств объекта
Поместив какие-либо данные в буфер обмена, выберем команду Action | PasteSpecial нашего приложения и получим диалоговое окно специальной вставки объекта из буфера обмена Paste Special (Специальная вставка) (рисунок 6).
Рис.6. Диалоговое окно специальной вставки
Выбрав тип вставляемого объекта в предложенном списке, мы можем поместить его в OLE-коитейиер (рисунок 7).
Рис.7. Результат вставки
Текст этого приложения можно взять здесь (5,4 Кб).
На следующем шаге мы рассмотрим управление объектом внутри контейнера.