Библиотека программиста

«Программирование, как и любовь - это одно слово, за которым скрывается бесчисленное множество занятий»

Главная страница > Технология COM > 63. Управление OLE-объектом, находящимся в контейнере

63. Управление OLE-объектом, находящимся в контейнере

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

Procedure DoVerb(Verb: Integer);

позволяет выполнить любое из этих действий, указав его индекс в списке ObjectVerbs. Обычно это действия «Изменить» и «Открыть», аналогичные темам всплывающего меню сервера, активированного на месте.

Воспользоваться свойством ObjectVerbs и методом DoVerb можно следующим образом.

Разместим на панели компонент ComboBox, установив его свойство Enabled=false, чтобы он был недоступен до тех пор, пока объект не загружен. Добавим обработчик события ComboBox.OnChange:

Procedure TForm1.ComboBoxChange(Sender: TObject);

Begin

OleContainer.DoVerb(ComboBox.ItemIndex);

End;

Для получения списка доступных действий объекта модифицируем метод создания нового объекта:

Procedure TForm1.MNewObjClick(Sender: TObject);

Begin

if OleContainer.InsertObjectDialog then

begin

ComboBox.Items:=OleContainer.ObjectVerbs;

ComboBox.Enabled:=true;

end;

End;

Теперь можно запустить приложение, загрузить какой-либо объект и выбрать действие из списка ComboBox.

Доступ ко всем методам и свойствам, экспонируемым объектом, т.е. его сервером, можно получить через свойство TOleContainer.OleObject:

Property OleObject: Variant;

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

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

var

WD : Variant;

//

OleContainer.DoVerb(ovShow);

WD:=OleContainer.OleObject;

WD.ActiveWindow.Selection.TypeText('Используем контейнер');

WD.ActiveWindow.Selection.TypeParagraph;

WD.SaveAs('MyDoc.doc');

Вот полный текст главного модуля проекта:

unit Main; {Иллюстрация простейшего использование OLE-контейнера для целей

обработки внедренных документов}

interface

uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, Menus, OleCtnrs, ExtCtrls, StdCtrls, ActiveX;

type

TForm1 = class(TForm)

Panel: TPanel;

OleContainer: TOleContainer;

MainMenu: TMainMenu;

MFile: TMenuItem;

MNewObj: TMenuItem;

MExit: TMenuItem;

ObjProp: TMenuItem;

PasteSpecial: TMenuItem;

DestroyObj: TMenuItem;

ComboBox: TComboBox;

procedure MExitClick(Sender: TObject);

procedure MNewObjClick(Sender: TObject);

procedure ObjPropClick(Sender: TObject);

procedure PasteSpecialClick(Sender: TObject);

procedure DestroyObjClick(Sender: TObject);

procedure ComboBoxChange(Sender: TObject);

end;

var

Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.MExitClick(Sender: TObject);

begin

Close;

end;

Procedure TForm1.MNewObjClick(Sender: TObject);

var WD : Variant;

Begin

if OleContainer.InsertObjectDialog then

begin

ComboBox.Items:=OleContainer.ObjectVerbs;

ComboBox.Enabled:=true;

end

else Exit;

if Pos('Word',OleContainer.OleClassName)<>0 then

begin

OleContainer.DoVerb(ovShow);

WD:=OleContainer.OleObject;

WD.ActiveWindow.Selection.TypeText('Используем контейнер');

WD.ActiveWindow.Selection.TypeParagraph;

WD.SaveAs('MyDoc.doc');

end;

End;

Procedure TForm1.ObjPropClick(Sender: TObject);

Begin

if OleContainer.State<>osEmpty then

OleContainer.ObjectPropertiesDialog

else

ShowMessage('Контейнер пуст!');

End;

Procedure TForm1.PasteSpecialClick(Sender: TObject);

Begin

OleContainer.PasteSpecialDialog;

End;

Procedure TForm1.DestroyObjClick(Sender: TObject);

Begin

OleContainer.DestroyObject; ComboBox.Enabled:=false;

End;

Procedure TForm1.ComboBoxChange(Sender: TObject);

Begin

OleContainer.DoVerb(ComboBox.ItemIndex);

// OleContainer.OleObject

End;

END.





<< Предыдущая статья
«62. Создание и отображение OLE-документов в формах»
Следующая статья >>
64. Перетаскивание файлов между приложениями