«Если отладка - процесс удаления ошибок, то программирование должно быть процессом их внесения»
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. Перетаскивание файлов между приложениями