Главная » Delphi » Использование интерфейса API Open Tools

0

Теперь, ознакомившись с интерфейсом API Open Tools,  можно  приступить к соз данию и анализу  работы реальной программы. В настоящем разделе основное внима ние  уделено  процессу  создания мастера с помощью интерфейса API Open Tools.  По строение системы управления версиями не  рассматривается, поскольку  использова ние интереса в этой области довольно ограничено. Примеры разработки компонентов и  редакторов свойств можно  найти в главах 11,  “Разработка компонентов VCL”, и  12, “Создание расширенного компонента VCL”.

Мастер Dumb

Для начала  создадим  очень  простой мастер  по имени “Dumb” (“глухой” или “бесполезный”). Для  этого  достаточно создать  класс,  реализующий интерфейс  IO- TAWizard. Напомним, что  интерфейс IOTAWizard определен в  модуле  ToolsAPI следующим образом:

type

IOTAWizard = interface(IOTANotifier)

[‘{B75C0CE0-EEA6-11D1-9504-00608CCBF153}’]

{ Строки пользовательского интерфейса мастера }

function GetIDString: string;

function GetName: string;

function GetState: TWizardState;

{ Запуск мастера }

procedure Execute;

end;

В основном такой интерфейс состоит из нескольких функций вида GetXXX(), которые подлежат переопределению в производных классах для обеспечения доступа к информа ции,  специфической для каждого  конкретного мастера. Метод  IOTAWizard.Execute() вызывается интегрированной средой разработки при  выборе пользователем определен ного мастера в главном  меню или диалоговом окне  New Items. Поэтому  в данном  методе следует обеспечить создание и вызов соответствующего мастера.

Если провести углубленный анализ, то можно  заметить, что интерфейс IOTAWiz- ard является производным от другого  интерфейса, IOTANotifier. Этот  интерфейс также  определен в модуле  ToolsAPI и содержит методы, используемые  интегриро ванной средой разработки для уведомления мастера о возникновении  различных со бытий. Интерфейс IOTANotifier определен следующим образом:

type

IOTANotifier = interface(IUnknown)

[‘{F17A7BCF-E07D-11D1-AB0B-00C04FB16FB3}’]

{ Данная процедура вызывается сразу же после того, как элемент

будет успешно сохранен. Для интерфейсов IOTAWizard такой

вызов не выполняется. }

procedure AfterSave;

{ Данная процедура вызывается непосредственно передсохранением элемента. Для интерфейсов IOTAWizard такой вызов не выполняется. }

procedure BeforeSave;

{ Начало удаления указанного элемента, поэтому все ссылки на

него следует аннулировать. Исключения игнорируются. }

procedure Destroyed;

{ Эта процедура вызывается при любой модификации указанного

элемента. Для интерфейсов IOTAWizard такой вызов не

выполняется. }

procedure Modified;

end;

Как видно  из комментариев, содержащихся в коде, большинство методов для про стых мастеров IOTAWizard не вызывается. Поэтому  в модуле ToolsAPI имеется класс TNotifierObject, представляющий собой  пустую реализацию методов интерфейса IOTANotifier. Если разрабатываемый мастер  происходит от такого  класса,  то в рас поряжении разработчика сразу окажутся все его методы.

При  создании мастера естественно предположить, что  он будет запускаться. Про ще всего осуществить это с помощью выбора пункта меню.  Если команду запуска мас тера  поместить в главное меню Delphi, то достаточно просто реализовать интерфейс IOTAMenuWizard, определенный в модуле ToolsAPI следующим образом:

type

IOTAMenuWizard = interface(IOTAWizard)

[‘{B75C0CE2-EEA6-11D1-9504-00608CCBF153}’]

function GetMenuText: string;

end;

Нетрудно заметить, что  интерфейс IOTAMenuWizard является потомком интер фейса IOTAWizard, обладающим лишь одним дополнительным методом, который возвращает текстовую строку меню.

Все вышесказанное обобщено в листинге 17.1. В нем приведен код модуля Dumb- Wiz.pas, содержащего класс TDumbWizard.

Листинг 17.1. DumbWiz.pas — реализация простейшего мастера

unit DumbWiz;

interface uses

ShareMem, SysUtils, Windows, ToolsAPI;

type

TDumbWizard = class(TNotifierObject, IOTAWizard, IOTAMenuWizard)

// Методы класса IOTAWizard

function GetIDString: string;

function GetName: string;

function GetState: TWizardState;

procedure Execute;

// Методы класса IOTAMenuWizard

function GetMenuText: string;end;

procedure Register;

implementation uses Dialogs;

function TDumbWizard.GetName: string;

begin

Result := ‘Dumb Wizard';

end;

function TDumbWizard.GetState: TWizardState;

begin

Result := [wsEnabled];

end;

function TDumbWizard.GetIDString: String;

begin

Result := ‘DDG.DumbWizard';

end;

procedure TDumbWizard.Execute;

begin

MessageDlg(‘This is a dumb wizard.’, mtInformation, [mbOk], 0);

end;

function TDumbWizard.GetMenuText: string;

begin

Result := ‘Dumb Wizard';

end;

procedure Register;

begin

RegisterPackageWizard(TDumbWizard.Create);

end;

end.

Функция IOTAWizard.GetName() должна возвращать уникальное имя мастера. Функция   IOTAWizard.GetState() возвращает  сведения  о  состоянии  мастера

wsStandard в главном  меню. Возвращаемое значение этой  функции представляет со бой    множество,   в   котором   могут    содержаться   значения   wsEnabled и/или wsChecked, в зависимости от того,  как элемент меню  будет представляться в интег рированной среде  разработки. Данная функция вызывается для корректного отобра жения  меню при каждом выводе  мастера на экран.

Функция   IOTAWizard.GetIDString() возвращает  глобальный идентификатор мастера, представляющий собой уникальную строку. В соответствии с используемыми соглашениями эта строка должна иметь такой формат:

CompanyName.WizardNameФункция  IOTAWizard.Execute() запускает  мастер. Как видно из листинга 17.1, ме тод  Execute() класса  TDumbWizard не  выполняет никаких действий. Но  далее  в на стоящей главе будут показаны некоторые мастера, выполняющие реальные действия.

Функция  IOTAWizard.GetMenuText() возвращает строку  текста, которая должна появиться в главном  меню. Эта функция вызывается каждый  раз при выборе пункта ме ню Help. Таким образом, при запуске мастера можно динамически изменять текст меню.

Обратите внимание на вызов  функции  RegisterPackageWizard() внутри  про цедуры Register(). Заметим, что такой  вызов очень  напоминает синтаксис вызовов, используемых для регистрации компонентов, редакторов компонентов или  редакто ров свойств при  включении в библиотеку компонентов, как описывалось в главах  11, “Разработка компонентов VCL”, и 12, “Создание расширенного компонента VCL”. Это связано с тем, что данный тип мастеров хранится в пакете, который является частью библиотеки компонентов. Как  будет показано в следующем  примере, мастер  можно сохранить также в отдельной библиотеке DLL.

Мастер  устанавливается точно так же, как и компонент. Выберите в главном  меню Components пункт  Install Component, а затем  добавьте модуль  к новому  или  сущест вующему пакету. После  установки в меню Help появится пункт запуска мастера Dumb (рис. 17.1). Работа  этого мастера показана на рис. 17.2.

Рис. 17.1. Пункт мастера Dumb в главном меню

Источник: Тейксейра, Стив, Пачеко, Ксавье.   Borland Delphi 6. Руководство разработчика. : Пер.  с англ. — М. : Издательский дом “Вильямс”, 2002. —  1120 с. : ил. — Парал. тит. англ.

По теме:

  • Комментарии