之前向大家简单的介绍了Open Tools API,现在我们就要亲自动手编写一个简单的Wizard,来体验Open Tools API的魅力所在。
在Delphi6中,不再推荐大家使用ExptIntf单元中的TIExpert类做为我们自己编写的Wizard的基类,而是改用TInterfacedObject做为其基类,并实现ToolsAPI单元中的一个或我个接口。
编写一个Wizard必须要实现ToolsAPI单元中的IOTAWizard接口和IOTAWizard的父接口INotifier(尽管Delphi不会调用INotifier接口中的任何方法)。如果你想编写一个Menu Wizard,必须实现IOTAWizard、INotifier和IOTAMenuWizard接口中的方法;如果想编写一个Form Wizard或是Project Wizard,必须实现IOTAWizard、INotifier和IOTARepositoryWizard接口中的方法(在ToolsAPI单元中为IOTARepositoryWizard接口另定义了两个别名IOTAFormWizard和IOTAProjectWizard,分别针对Form Wizard和Project Wizard)。
在Delphi6中,Wizard的注册方式做了相应的变化,在Package中实现的Wizard不再是调用ExptIntf单元中的RegisterLibraryExpert方法,而是改为调用RegisterPackgeWizard方法。如果你编写的Wizard是在DLL中实现的,则不需要调用此方法,而是使用ToolsAPI单元中的IOTAWizardServices接口来注册和移除自己编写的Wizard。
interface
uses ToolsAPI, Dialogs;
type
TMSimpleWizard = class (TInterfacedObject, IOTANotifier, IOTAWizard)
public
... { IOTANotifier }
procedure AfterSave;
procedure BeforeSave;
procedure Destroyed;
procedure Modified;
... { IOTAWizard }
function GetIDString: string ;
function GetName: string ;
function GetState: TWizardState;
procedure Execute;
end;
implementation
function TMSimpleWizard.AfterSave;
begin
// Do Nothing
end;
function TMSimpleWizard.BeforeSave;
begin
// Do Nothing
end;
procedure TMSimpleWizard.Destroyed;
begin
// Do Nothing
end;
procedure TMSimpleWizard.Execute;
begin
ShowMessage( ' This Wizard is trying to do something useful. ' );
end;
function TMSimpleWizard.GetIDString: String;
begin
Result : = ' ChirsMao.Simple Wizard ' ;
end;
function TMSimpleWizard.GetName:String;
begin
Result : = ' Simple Wizard ' ;
end;
function TMSimpleWizard.GetState: TWizardState;
begin
Result : = [wsEnabled];
end;
procedure TMSimpleWizard.Modified;
begin
// Do Nothing
end;
在DLL中实现Wizard,必须在Uses从句中第一个引用ShareMem单元。并且要在DLL的Terminate方法中手工移除掉注册到IDE中的Wizard。
uses ShareMem, ToolsAPI, SiampleWizard;
var
Index: Integer = - 1 ; // 全局变量,保存Wizard添加到IDE中的索引号
procedure Terminate;
var
Services: IOTAWizardServices;
begin
Services : = BorlandIDEServices as IOTAWizardServices;
Services.RemoveWizard(Index);
end;
function Initialize( const Services: IBorlandIDEServices; RegisterProc: TWizardRegisterProc; var TerminateProc: TWizardTerminateProc): Boolean; stdcall;
var
WizardServices: IOTAWizardServices;
begin
// 如果你使用了VCL*.BPL,否则需要保存这个接口变量
BorlandIDEServices : = Services;
WizardServices : = BorlandIDEServices as IOTAWizardServices;
WizardServices.AddWizard(TSimpleWizard.Create);
TerminateProc : = Terminate;
Result : = True;
end;
Exports
Initialize as WizardEntryPoint;
end.