Шаг 23.
Использование OLE-документов в приложениях. Управление объектом внутри OLE-контейнера

    На этом шаге мы рассмотрим способы управления объектом внутри контейнера.

    Как управлять объектом, помещенным в компонент TOleContainer?

    После того как объект помещен в OLE-контейнер, с ним можно выполнить некоторый ограниченный набор действий с помощью свойства ObjectVerbs. Метод DoVerb позволяет выполнить одно из этих действий, ссылаясь на его порядковый помер в списке, а целочисленное свойство PrimaryVerb содержит номер действия из этого списка, выполняющегося при активизации OLE-объекта. Как правило, этих действий два - одно для отображения объекта, другое - для инициирования процесса его редактирования с помощью сервера (обычно в отдельном окне).

    В качестве иллюстрации применения этого свойства на панель с компонентом TOleContainer поместим компонент TComboBox и установим его свойство Enabled ранным False (рисунок 1).


Рис.1. Пример использования свойств компонента TOleContainer

    Изменим обработчики событий:

procedure TForm1.NewObject1Click(Sender: TObject);
begin
  OleContainer1.InsertObjectDialog;
  ComboBox1.Items:=OleContainer1.ObjectVerbs;
  ComboBox1.Enabled:=True;
end;

procedure TForm1.NewExcelWorksheet1Click(Sender: TObject);
begin
  OleContainer1.CreateObject('Excel.Sheet', False);
  ComboBox1.Items:=OleContainer1.ObjectVerbs;
  ComboBox1.Enabled:=True;
end;

procedure TForm1.ComboBox1Change(Sender: TObject);
begin
  if OleContainer1.State <> osEmpty then
    OleContainer1.DoVerb(ComboBox1.ItemIndex);
end;
Текст этого приложения можно взять здесь (6,2 Кб).

    Теперь после помещения объекта в OLE-коптейпер мы можем выбрать одно из действий, доступных в комбинированном списке. Например, создадим в OLE-коитейиере растровый рисупок (объект Paintbrush) и выберем действие Открыть. Это приведет к открытию приложения -сервера в отдельном окне, при этом в процессе редактирования изображения будет происходить синхронное изменение объекта в OLE-коитейпере (рисунок 2).


Рис.2. Пример использования свойства ObjectVerbs компонента TOleContainer

    Выбор же действия Изменить приведет к редактированию объекта непосредственно в самом OLE-контейнере.

    Отметим, что если объект в OLE-коптейпере экспонирует какие-либо свойства и методы, доступ к ним может быть осуществлен с помощью свойства OleObject компонента TOleContainer. Используя это свойство, мы можем реализовать действия, доступные контроллерам автоматизации того же самого сервера, за исключением, естественно, его удаленного запуска.

    Для иллюстрации этих возможностей поместим в OLE-коитейиер лист Microsoft Excel и создадим в нем сводную таблицу, для чего воспользуемся базой данных Борей, входящей в комплект поставки Microsoft Office. Добавим к меню Action нашего приложения еще один пункт - Create Pivot Table - и создадим обработчик события, связанного с выбором этого пункта меню:

var
  Form1: TForm1;
  WB,PC,PT:Variant;
const
  //Константы Excel. 
  xlExternal = $00000002;
  xlCmdSql = $00000002;
  xlColumnField = $00000002;
  xlDataField = $00000004;
  xlPageField = $00000003;
  xlRowField = $00000001;
 .    .    .    .
procedure TForm1.CreatePivotTable1Click(Sender: TObject);
begin
 OleContainer1.CreateObject('Excel.Sheet',False);
 WB := OleContainer1.OleObject;
 //Создаем кэш.
 PC := WB.PivotCaches.Add(xlExternal);
 //Выбираем источник данных и текст запроса.
 PC.Connection  := 'OLEDB;Provider=Microsoft.Jet.OLEDB.4.0;
      Data Source=C:\Program Files\Microsoft Office\Office10\Samples\Борей.mdb';
 PC.CommandType := xlCmdSql;
 PC.CommandText := 'SELECT СтранаПолучателя, ГородПолучателя, '+
             ' НазваниеПолучателя, СтоимостьДоставки FROM Заказы  ';
 //Cоздаем сводную таблицу.
 PC.CreatePivotTable(WB.Worksheets[1].Cells[1,1],'PivotTable1');
 PT := WB.Worksheets[1].PivotTables('PivotTable1');
 //Указываем расположение осей и суммируемые данные.
 PT.PivotFields('СтранаПолучателя').Orientation := xlRowField;
 PT.PivotFields('СтранаПолучателя').Position := 1;
 PT.PivotFields('ГородПолучателя').Orientation := xlRowField;
 PT.PivotFields('ГородПолучателя').Position := 2;
 PT.PivotFields('НазваниеПолучателя').Orientation   := xlColumnField;
 PT.PivotFields('СтоимостьДоставки').Orientation := xlDataField;
 WB.Worksheets[1].Columns[2].ColumnWidth := 15;
 WB.Worksheets[1].Columns[1].ColumnWidth := 20;
end;
Текст этого приложения можно взять здесь (7,9 Кб).

    В приведенном выше фрагменте кода мы создаем кэш для храпения данных, требующихся для построения сводной таблицы, затем описываем его свойства, такие как его имя, свойства источника данных (OLE DB Connection String), текст SQL-запроса, затем создаем сводную таблицу и, наконец, размещаем ноля набора данных, являющегося результатом запроса, на ее осях.

    Результат выполнения указанного выше фрагмента кода представлен на рисунке 3.


Рис.3. Результат обращения к методам объекта в OLE-контейнере

    При необходимости можно выполнить с данными объекта, содержащегося в OLE-коптейпере, любые манипуляции, доступные методам соответствующего сервера OLE-документов. Можно также минимизировать возможное вмешательство пользователя в этот процесс, запретив активацию объекта путем установки значения свойства AutoActivate равным aaManual, а значения свойства AutoVerbMenu равным False. В этом случае у пользователя не будет возможности вносить изменения в объект, если только он заранее не запустил соответствующий сервер OLE-документов, пользовательский интерфейс которого можно применить для редактирования данных этого объекта.

    На следующем шаге мы рассмотрим хранение OLE-объектов в базах данных.




Предыдущий шаг Содержание Следующий шаг