版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、附录A 使用OPPENTOOOLS API的的Delpphi扩展展示例附录A与第第11章的的内容前后后承继。阅阅读第111章之后,您您已经了解解了创建定定制组件的的大部分知知识。附录录A也很重重要,它示示范了如何何创建组件件编辑器以以及使用OOpenTToolss APII对Dellphi自自身进行扩扩展。二者者分属不同同的主题:一个与组组件相关,另另一个则是是要扩展DDelphhi。之所所以将二者者放到附录录中,是因因为它们没没有其他技技术那样常常用。但要要用到二者者的时候,它它们都是很很有用的。定制组件编编辑器可以以定义设计计时对话框框,编辑器器在Objject Insppectoor不够
2、用用时,使得得用户能够够可视化地地修改特定定于该组件件的每个方方面。一个个很好的例例子就是TTCharrt组件,由由Davee Berrnedaa开发。另另外,在设设计时您还还可以从组组件的上下下文菜单中中运行该组组件所包含含的代码。假定您使用用Delpphi已经经有一段时时间了,而而您认为DDelphhi缺乏某某些必要的的特征。我我三年前在在一个工程程上工作时时,就发生生了这样的的情况。当当时正在对对Ratiionall Rosse所定义义的系统结结构模型进进行编码,我我们已经厌厌烦了手工工定义类并并编写函数数体。实在在是太烦了了。创建一一个类来读读取类的声声明并编写写函数体,这这看来是个个
3、不错的主主意。使用用OpennToolls APPI,有时时候再借助助一下Raay Liischnner的书书Hiddden Pathhs off Dellphi 3: EExperrts, Wizaards, andd thee Opeen Toools API,我们最最终向Deelphii添加了一一个能够调调用类生成成器的菜单单项。结果果终于摆脱脱了这本来来可以自动动完成的、烦人的任任务(可惜惜的是我们们没有一本本语法分析析方面的好好书,我有有点离题了了)。这准确地描描述了Innprisse公司在在决定向DDelphhi专业版版和企业版版用户提供供OpennToolls APPI时的想想法
4、。当需需要Dellphi具具有某些功功能时,添添加上去就就行了。DDelphhi现在还还具有“Comppletee claass aat cuursorr”的代码生生成功能,因因此我们可可以创建一一个尚不存存在的专家家:可以生生成专家的的专家。当您阅读本本章后,可可以了解到到如何创建建组件编辑辑器以及怎怎样使用专专家对Deelphii进行定制制。有一个个工具可用用于开发定定制专家,这这使得创建建专家与创创建组件一一样容易。A.1 OpennToolls APPI介绍OpenTToolss APII原来定义义为抽象虚虚类,即它它使用了DDelphhi接口,而而我们可以以继承它以以便向Deelph
5、ii添加扩展展。原来的的那些单元元仍然存在在于你安装装的Dellphi的的SourrceTToolssAPI子子目录下,但但在大多数数情况下它它们已经让让位于TooolsAAPI.ppas单元元中定义的的COM接接口。注意:TooolsAAPI单元元与Dellphi专专业版和企企业版一同同发布。您您也可以对对Delpphi标准准版进行定定制,只是是包含相应应接口的单单元在Deelphii标准版中中是没有的的。如果您对DDelphhi抽象接接口比较熟熟悉,那么么比从零开开始要好一一些。不管管怎样,您您都应该学学习COMM接口,这这正是我们们在本章中中要做的。A.1.11 OppenToools接
6、接口大多数情况况下,OppenToools接接口都是位位于SouurceToollsAPIITooolsAPPI.paas单元中中的COMM接口。为为提高后向向兼容性,该该目录下也也定义了风风格较老的的Delpphi接口口。表A.1完整地地列出了TToolssAPI中中的所有单单元。带有有星号的单单元包含了了风格较老老的Dellphi接接口,通常常应该避免免在较新的的代码中使使用。警告:很差差的是,这这些单元在在帮助文件件中并没有有很好的文文档。首先先要参考单单元中的代代码;代码码中的注释释很有帮助助,但默认认某些知识识;而经过过仔细查找找,我们发发现几乎完完全没有集集成化的帮帮助。这真真是个
7、不幸幸,如果要要进行扩展展,您必须须阅读许多多代码并进进行实验。表A.1 Dellphi ToollsAPII单元列表表。通过实实现TooolsAPPI.paas单元中中定义的COOM接口,可可以访问DDelphhi的大部部分功能单元描述toolssapi.pas包含了新的的COM接接口,它替替换了在其其他单元中中可以找到到的风格较较老的接口口(本章中中将广泛地地使用该单单元的接口口)vcsinntf.ppas包含了与版版本控制系系统进行链链接的COOM接口dsgniintf.pas包含了特性性编辑器、组件编辑辑器以及注注册过程所所需的接口口(例如,RRegissterCCompoonentt
8、Edittor)editiintf.pas*风格较老的的Delpphi抽象象接口,用用于访问编编辑器缓存存,例如单单元的文本本exptiintf.pas*风格较老的的单元,其其中包括了了用于定义义专家的抽抽象虚类TTIExppert;新代码应应使用TooolsAAPI单元元中的COOM接口fileiintf.pas*风格较老的的单元,其其中包括了了用于访问问文件系统统功能的抽抽象虚接口口istreeams.pas*包含了流、内存流、文件流的的接口tooliintf.pas*与Delpphi菜单单和TooolSerrvicees相关的的接口;在在新代码中中应使用TToolssAPI单单元中的BB
9、orlaandIDDESerrvicees COOM对象以以及IOTTAMennuWizzardvirtiinft.pas*包含了TIInterrfacee的定义,以以及Dellphi对对基本的CCOM接口口IUnkknownn的实现注意:本章章中可能会会交替使用用向导和专专家这两个个词。它们们都是指DDelphhi中的专专家。之所所以使用两两个词,是是因为Innprisse也并未未确定使用用单个词。注册过程程使用向导导这个词,而而COM接接口也包含含了向导这这个词。在在Delpphi中进进行讨论时时,对这两两个词进行行区分是没没有意义的的。现在已经无无需了解进进一步的细细节了,我我们来创建建
10、一个Deelphii专家。A.1.22 创建建向导对Delpphi向导导进行扩展展的最为直直接的途径径就是实现现IOTAAWizaard和IIOTAMMenuWWizarrd接口。这两个接接口都定义义在TooolsAPPI单元中中,而且您您可以看到到,它们非非常容易实实现。注意:首字字母缩略词词前缀IOOTA指的的是Intterfaace ffor OOpenTToolss APII(我是这这样认为的的!),它它也可能是是指一幕希希腊剧,意意思是指非非常小的数数量(因为为只有很少少量的代码码需要实现现)。实现IOTTAWizzard和和IOTAAMenuuWizaard最容易实现现的向导是是非
11、常基本本的IOTTAWizzard接接口,它使使用IOTTAMennuWizzard类类来实现。IOTAAWizaard接口口需要实现现四个方法法,而IOOTAMeenuWiizardd则把一个个菜单项放放置到Heelp菜单单上。由于于刚刚起步步,我们将将以向导的的形式实现现一个Heello Worlld例子。为使读者者不至于失失望,将在在下一节实实现一个较较为有用的的向导。下面的代码码定义IOOTAWiizardd和IOTTAMennuWizzard。实现基本本的向导并并显示在HHelp菜菜单上,需需要实现IIOTAWWizarrd接口的的四个方法法:GettIDSttringg、GettN
12、amee、GettStatte和Exxecutte。由于于IOTAAWizaard继承承了IOTTANottifieer接口,您您还需要实实现IOTTANottifieer接口。可以使用用TNottifieerObjject存存根类作为为IOTAANotiifierr接口的实实现。IOOTANootifiier接口口引入了AAfterrSavee、BefforeSavve、Deestrooyed和和Modiifiedd方法,以以便对事件件进行响应应。对这个个练习而言言,该存根根类就足够够了。IOOTAMeenuWiizardd继承了IIOTAWWizarrd接口。在IOTTAMennuWizz
13、ard类类中,惟一一需要实现现的方法是是GetMMenuTText,该该方法返回回在Hellp菜单上上显示的文文本。IOTAWWizarrd = inteerfacce(IOOTANootifiier)B775C0CCE0-EEEA6-11D11-95004-000608CCCBF1153 Exppert UI sstrinngs functtion GetIIDStrring: strring;functtion GetNName: strring;functtion GetSStatee: TWWizarrdStaate; Lauunch the AddIIn proceeduree Ex
14、eecutee;end;IOTAMMenuWWizarrd = inteerfacce(IOOTAWiizardd)B775C0CCE2-EEEA6-11D11-95004-000608CCCBF1153functtion GetMMenuTText: strring;end;这个没有实实际功能的的向导定义义为TDuummyWWizarrd类,该该类是TNNotiffierOObjecct、IOOTAWiizardd以及IOOTAMeenuWiizardd的子类。它实现了了上面代码码所列出的的接口中的的五个方法法。完整的的实现代码码如下。unit UDummmyWiizardd;/ UDDum
15、myyWizaard.ppas - Demmonsttratees baasic wizaard iinterrfacee/ Coopyriight (c) 20000. Alll Riightss Resserveed./ Byy Sofftwarre Cooncepptionns, IInc. httpp:/ Wrritteen byy Pauul Kiimmell. Okkemoss, MI USAinterrfaceeusesWindoows, ToollsAPII;typeTDummmyWizzard = cllass(TNottifieerObjject, IOTTAWizzard
16、,IOTAMMenuWWizarrd)publiicfuncttion GetIIDStrring : Sttringg;functtion GetNName : Sttringg;functtion GetSStatee : TTWizaardSttate;proceeduree Exeecutee;functtion GetMMenuTText : Sttringg;end;proceeduree Reggisteer;impleementtatioonusesDialoogs;proceeduree Reggisteer;beginnRegissterPPackaageWiizardd(
17、TDuummyWWizarrd.Crreatee);end; TDuummyWWizarrd proceeduree TDuummyWWizarrd.Exxecutte;beginnMessaageDllg( Builldingg Dellphi 6 Apppliccatioons, mtIInforrmatiion,mbOkk, 00 );end;functtion TDummmyWiizardd.GettIDSttringg: Sttringg;beginnresullt := SooftCoonceppts.DDummyyWizaard;end;functtion TDummmyWiiz
18、ardd.GettMenuuTextt: Sttringg;beginnresullt := Duummy Wizaard;end;functtion TDummmyWiizardd.GettNamee: Sttringg;beginnresullt := Duummy Wizaard;end;functtion TDummmyWiizardd.GettStatte: TTWizaardSttate;beginnresullt := wssEnabbled;end;end.Regisster过过程以TDDummyyWizaard的一一个实例为为参数调用用了ReggisteerPacckagee
19、Wizaard。您您可以像安安装组件一一样把专家家安装到包包中,如上上例。实际际上,进行行安装最容容易的方法法就是使用用Delpphi中的的Compponennt | Insttall Compponennt菜单项项。当用户户单击添加加的菜单项项时,即可可调用这个个非常基本本的向导。当单击菜菜单项时,将将调用向导导实现的EExecuute方法法来响应。TDummmyWiizardd在一个TTMesssageDDlg对话话框中显示示本书的标标题。当然然,如果您您确定的话话,可以在在Execcute方方法中加入入几乎任何何级别的复复杂行为。GetIIDStrring方方法返回向向导的字符符串标识符
20、符。按照惯惯例,该IID的前缀缀是您公司司的名字,这这里使用了了Softtwaree Connceptts, IInc公司司的注册商商标SofftConnceptts,并将将其通过圆圆点连接到到向导的名名字。GetMeenuTeext的实实现代码中中包含了显显示在帮助助菜单上的的菜单项文文本。当每每次单击DDelphhi的Heelp菜单单上相应菜菜单项时,都都会调用该该方法。GGetNaame方法法返回向导导的名字,而而GetSStatee方法则返返回TWiizarddStatte类型值值。该类型型定义如下下:TWizaardSttate = seet off wssEnabbled, wsC
21、Checkked;wsEnaable表表示该向导导是否是活活动的,而而wsChheckeed值则在在菜单项上上放置一个个检查标记记。从代码码可以看到到,基本的的Helpp菜单向导导所需的代代码非常少少。当安装装向导后,DDelphhi的帮助助菜单上出出现了一个个新的菜单单项Dummmy WWizarrd。当用用户单击向向导时,将将调用Exxecutte方法,从从而在TMMessaageDllg对话框框上显示文文本“Builldingg Dellphi 6 Apppliccatioons”。关于相相应的菜单单项和单击击后的反应应,可以参参见图A.1和A.2。图A.1 Dummmy WWizarr
22、d添加到到Delpphi的HHelp菜菜单图A.2 当单击击Dummmy Wiizardd菜单项时时,将显示示TMesssageeDlg对话框,其其代码可以以参见Exxecutte方法注册向导把向导添加加到包,并并像组件一一样对其进进行安装,即即可扩展DDelphhi。当把把包编译为为BPL库库之后,将将调用上一一节的Reegistter过程程来进行安安装。如上上一小节的的代码所示示,ReggisteerPacckageeWizaard需要要向导的一一个实例作作为参数。RegiisterrPackkageWWizarrd定义在在ToollsAPII.pass单元中,其其参数为IIOTAWWiz
23、arrd类型的的常量引用用,该过程程声明如下下:proceeduree ReggisteerPacckageeWizaard(cconstt Wizzard: IOTTAWizzard);要安装向导导,可以按按照下列步步骤进行。在Delpphi中,单单击Commponeent | Insstalll Commponeent菜单单项。在Insttall Compponennt对话框框中,如果果单元尚未未显示在UUnit filee namme域中,则则单击Brrowsee按钮找到到相应的单单元。如果要在当当前包中安安装专家,单单击OK。否则单击击Intoo neww pacckagee属性页(见
24、见图A.33),并给给出包的名名字及描述述。图A.3 图中为IInstaall CCompoonentt向导,用用于将向 导安安装到包。所需步骤骤与安装组组件时相同同当单击OKK后,给出出的包将在在包编辑器器中打开(见见图A.44)。单击击Comppile按按钮(见图图A.4)。对包进行编编译之后,IInstaall已经经可用,单单击该按钮钮。要记住,包包在本质上上是动态链链接库,也也是一种应应用程序。因此,可可以而且应应该像其他他程序一样样对选项进进行设置。要加入路路径和版本本消息,并并记得设置置对所处的的开发阶段段可用的编编译器选项项。可以参参考前面的的第18章章,在测试试时使用运运行时错
25、误误和调试选选项,而在在测试结束束后、应用用程序打包包之前去掉掉这些选项项。图A.4 包编辑辑器用于编编译并安装装包A.2 创建定制制向导像New Compponennt Wiizardd这样有用用的向导,可可以减少编编写代码的的数量,使使得不必手手工编写一一些可以自自动完成的的代码;而而且有助于于开发者在在越过障碍碍之后发现现Delpphi的一一些新的功功能。为保保持向导的的这种功能能,本节给给出了一个个New Expeert专家家;正如同同New Compponennt对话框框跳过了开开始组件单单元的步骤骤一样,NNew EExperrt的作用用也是类似似的。A.2.11 定义义New E
26、xpeert WWizarrdNew EExperrt的功能能是,它可可以生成一一些与本章章开头的DDummyy Wizzard类类似的专家家。而Neew Exxpertt本身将安安装在Coomponnent菜菜单上Neew Coomponnent菜菜单项之后后。要建立立该向导并并将其安装装到Commponeent菜单单上,我们们需要实现现IOTAACreaator和和IOTAAModuuleCrreatee,而且还还需要查询询BorllandIIDESeervicces以获获得INTTASerrvicees40。INTAAServvicess40对象象定义了向向特定的DDelphhi菜单添添
27、加菜单项项的行为。向导的类是是TNewwExpeertWiizardd。当单击击Compponennt | New Expeert菜单单项(见图图A.5)时时,它生成成一个与TTDummmyWizzard几几乎相同的的类。将特特定的行为为添加到生生成的Exxecutte方法,然然后就可以以了。完整整的代码列列表如下,对对相关部分分的描述分分为小节,以以便使您能能够清楚地地了解其作作用。图A.5 将Neww Exppert向向导添加到到INTAAServvicess40对象象之后unit UNewwExpeertWiizardd;/ UNNewExxperttWizaard.ppas - An
28、exammple of aa wizzard thatt gennerattesthe ccode for a wiizardd/ Coopyriight (c) 20000. Alll Riightss Resserveed./ Byy Sofftwarre Cooncepptionns, IInc. httpp:/ Wrritteen byy Pauul Kiimmell. Okkemoss, MI USAinterrfaceeusesWindoows, Conttrolss, TooolsAAPI, Formms, MMenuss, Cllassees, SSysUttils;typeT
29、NewEExperrtWizzard = cllass(TNottifieerObjject, IOTTAWizzard,IOTACCreattor,IOTAMModulleCreeatorr)privaateFNewCClasssNamee : sstrinng;FMenuuTextt : sstrinng;FExpeertIDDStriing : strring;FExpeertNaame : strring;FUnittNamee : SStrinng;FWizaardSttate : TWWizarrdStaate;FMenuuItemm : TTMenuuItemm;proceedu
30、ree AdddMenuuItemm;proceeduree OnCClickk( Seenderr : TTObjeect );proceeduree GenneratteCodde;publiicconsttructtor CCreatte; vvirtuual;destrructoor Deestrooy; ooverrride; IOTTAWizzard functtion GetIIDStrring : Sttringg;functtion GetNName : Sttringg;functtion GetSStatee : TTWizaardSttate;proceeduree E
31、xeecutee; IOTTACreeatorr functtion GetCCreattorTyype : strring;functtion GetEExistting : Boooleaan;functtion GetFFileSSysteem : striing;functtion GetOOwnerr : IIOTAMModulle;functtion GetUUnnammed : Boooleann; IOTTAModduleCCreattor functtion GetAAncesstorNName : sttringg;functtion GetIImplFFileNName
32、: sttringg;functtion GetIIntfFFileNName : sttringg;functtion GetFFormNName : sttringg;functtion GetMMainFForm : Boooleaan;functtion GetSShowFForm : Boooleaan;functtion GetSShowSSourcce : Boollean;functtion NewFFormFFile( connst FFormIIdentt, AnncesttorIddent : sttringg) : IIOTAFFile;functtion NewIIm
33、plSSourcce( cconstt ModduleIIdentt, FoormIddent,AncesstorIIdentt : sstrinng ) : IOOTAFiile;functtion NewIIntfSSourcce( cconstt ModduleIIDentt, FoormIddent,AncesstorIIdentt : sstrinng ) : IOOTAFiile;proceeduree ForrmCreeatedd( coonst FormmEdittor : IOTTAForrmEdiitor );end;proceeduree Reggisteer;imple
34、ementtatioonuses UForrmMaiin, DDialoogs, UExppertUUnit;$R *.RESSproceeduree Reggisteer;beginnRegissterPPackaageWiizardd(TNeewExppertWWizarrd.Crreatee);end; TNeewExppertWWizarrd consttructtor TTNewEExperrtWizzard.Creaate;beginninherritedd;AddMeenuIttem;end;destrructoor TNNewExxperttWizaard.DDestrroy;
35、beginnif( AAssiggned(FMennuIteem) thennFMenuuItemm.Freee;inherritedd;end;proceeduree TNeewExppertWWizarrd.OnnClicck( SSendeer : TObjject );beginnExecuute;end;proceeduree TNeewExppertWWizarrd.AdddMennuIteem;varNTASeervicces400 : IINTASServiices440;CompoonenttMenuuItemm : TTMenuuItemm;beginnNTASeervic
36、ces400 := BorllandIIDESeervicces AAs INNTASeervicces400;if( NNot AAssiggned(NTASServiices440) thenn exiit;CompoonenttMenuuItemm :=NTASeervicces400.MaiinMennu.Ittems.Findd(&CCompoonentt);if( NNot AAssiggned( CommponeentMeenuIttem) theen Exxit;FMenuuItemm := TMennuIteem.Crreatee( CoomponnentMMenuIItem
37、 );tryFMenuuItemm.Capptionn := Neww &Exxpertt.;FMenuuItemm.OnCClickk := OnCllick;CompoonenttMenuuItemm.Inssert( 1, FMennuIteem );excepptFreeAAndNiil(FMMenuIItem);end;end;proceeduree TNeewExppertWWizarrd.Exxecutte;varForm : TFFormMMain;beginnForm := TTFormmMainn.Creeate(Appllicattion);tryif( FForm.Sh
38、owwModaal = mrOKK ) tthenbeginnFNewCClasssNamee := Formm.NewwClasssNamme;FMenuuTextt := Formm.MennuTexxt;FExpeertIDDStriing := Foorm.EExperrtIDSStrinng;FExpeertNaame := Foorm.EExperrtNamme;FUnittNamee := Formm.UniitNamme;FWizaardSttate := FForm.WizaardSttate;GenerrateCCode;end;finalllyForm.Freee;end
39、;end;functtion TNewwExpeertWiizardd.GettIDSttringg: Sttringg;beginnresullt := SooftCoonceppts.NNewExxperttWizaard;end;functtion TNewwExpeertWiizardd.GettNamee: Sttringg;beginnresullt := Exxpertt;end;functtion TNewwExpeertWiizardd.GettStatte: TTWizaardSttate;beginnresullt := wssEnabbled;end;functtion
40、 TNewwExpeertWiizardd.NewwImpllSourrce(cconstt ModduleIIdentt,FormIIdentt,AncesstorIIdentt: sttringg): IIOTAFFile;beginnresullt := TExxperttUnitt.Creeate( FNeewClaassNaame, FMennuTexxt,FExpeertIDDStriing,FExpeertNaame, FUniitNamme, FFWizaardSttate );end;proceeduree TNeewExppertWWizarrd.GeeneraateCoo
41、de;beginn(BorllandIIDESeervicces aas IOOTAMooduleeServvicess).CrreateeModuule(SSelf);end;proceeduree TNeewExppertWWizarrd.FoormCrreateed(coonst FormmEdittor:IOTAFFormEEditoor);beginn/ Inntenttionaally leftt blaankend;functtion TNewwExpeertWiizardd.GettAnceestorrNamee: sttringg;beginnresullt := ;end;
42、functtion TNewwExpeertWiizardd.GettFormmNamee: sttringg;beginnresullt := ;end;functtion TNewwExpeertWiizardd.GettImpllFileeNamee: sttringg;beginnresullt := FUnnitNaame;end;functtion TNewwExpeertWiizardd.GettIntffFileeNamee: sttringg;beginnresullt := ;end;functtion TNewwExpeertWiizardd.GettMainnFormm
43、: Boooleaan;beginnresullt := Fallse;end;functtion TNewwExpeertWiizardd.GettShowwFormm: Boooleaan;beginnresullt := Fallse;end;functtion TNewwExpeertWiizardd.GettShowwSourrce: Boollean;beginnresullt := Truue;end;functtion TNewwExpeertWiizardd.NewwFormmFilee(connst FFormIIdentt,AncesstorIIdentt: sttrin
44、gg): IIOTAFFile;beginnresullt := Nill;end;functtion TNewwExpeertWiizardd.NewwIntffSourrce(cconstt ModduleIIDentt,FormIIdentt,AncesstorIIdentt: sttringg): IIOTAFFile;beginnresullt := Nill;end;functtion TNewwExpeertWiizardd.GettCreaatorTType: strring;beginnresullt := sUnnit;end;functtion TNewwExpeertW
45、iizardd.GettExisstingg: Boooleaan;beginnresullt := Fallse;end;functtion TNewwExpeertWiizardd.GettFileeSysttem: striing;beginnresullt := ;end;functtion TNewwExpeertWiizardd.GettOwneer: IIOTAMModulle;beginnresullt := nill;end;functtion TNewwExpeertWiizardd.GettUnnaamed: Boooleann;beginnresullt := Fall
46、se;end;end.New EExperrt的类定定义TNewEExperrtWizzard类类继承了TTNotiifierrObjeect存根根类,以及及IOTAAWizaard、IIOTACCreattor和IIOTAMModulleCreeatorr接口。IIOTAWWizarrd是基本本的向导接接口,而TTNotiifierrObjeect则对对该接口中中某些基本本的事件处处理程序实实现了一个个存根。要要创建一个个基本的向向导,您得得实现IOOTAWiizardd接口。IIOTACCreattor和IIOTAMModulleCreeatorr用于与DDelphhi的文件件视图协同同工
47、作,它它们也包含含了创建窗窗体和单元元的能力。过一会儿儿我们继续续讨论各个个接口的实实现。向导类的私私有部分包包含了几个个字段,用用于正确地地创建单元元。FNeewClaassNaame存储储将要生成成的向导的的类名。而而FMennuTexxt则存储储要生成的的向导的菜菜单文本。FExppertIIDStrring包包含了专家家的ID字字符串。FFExpeertNaame字段段包含了专专家名。FFUnittNamee是生成的的.PASS单元的名名字,而FFWizaardSttate包包含了wssEnabbled和和wsChheckeed值。上上述的每个个特性都用用于生成对对接口的IIOTAWW
48、izarrd部分的的基本响应应。例如,IIOTAMMenuWWizarrd需要用用所显示的的菜单文本本来响应。代码生成成器将从IIOTAMMenuWWizarrd.GeetMennuTexxt得到FFMenuuTextt的值。私私有部分还还有FMeenuIttem,该该字段用于于维护对向向导所添加加菜单的引引用。菜单单项是通过过构造函数数中调用的的AddMMenuIItem过过程添加到到Delpphi的。OnCllick事事件处理程程序包含了了当用户单单击Neww Exppert菜菜单项时(见见图A.66)的响应应代码。当用户填写写好如图AA.6所示示的Neww Exppert对对话框之后后,
49、将调用用私有方法法GeneerateeCodee。对话框框中询问了了一些用于于完成专家家的必要的的问题。专专家类的名名字是什么么?用于触触发Exeecutee方法的菜菜单项的文文本是什么么?创建的的ID字符符串是什么么?专家的的名字是什什么?专家家所对应的的单元名是是什么?WWizarrd Sttate中中的复选框框用于生成成GetSStatee的实现代代码。类的公有部部分包括一一些方法的的声明,这这些方法是是必须实现现的,以履履行接口继继承所形成成的契约。另外,除除了从接口口继承的方方法之外,还还包括构造造函数和析析构函数。构造函数数将Neww Exppert菜菜单项添加加到Dellphi,
50、而而析构函数数负责释放放相应的内内存。图A.6 用于生生成Dellphi专专家的Neew Exxpertt对话框实现IOTTAWizzard IOTTAWizzard接接口需要实实现GettIDSttringg、GettNamee、GettStatte以及EExecuute方法法。GettIDSttringg方法返回回SofttConcceptss.NewwExpeertWiizardd。按照惯惯例,IDD字符串包包括公司名名和向导名名,用圆点点连接。GGetNaame返回回Expeert,这是该该向导所显显示的名字字。GettStatte返回包包含wsEEnablled的TTWizaardS
51、ttate集集合,确保保Compponennt菜单上上的向导是是可用的。IOTAWWizarrd接口中中惟一较为为困难的方方法是Exxecutte。当单单击Neww Exppert菜菜单项时(见见图A.55),将调调用Exeecutee方法。EExecuute方法法显示一个个对话框,如如图A.66所示。填填写Neww Exppert对对话框的所所有域,然然后单击OOK。由NNew EExperrt对话框框得到的数数据存储在在相关的私私有字段中中,然后调调用GenneratteCodde方法。GeneerateeCodee调用IOOTAMooduleeServvicess.CreeateMMod
52、ulle方法。由于TNNewExxperttWizaard继承承了IOTTACreeatorr,因此它它可用作CCreatteModdule的的参数。接接着,CrreateeModuule调用用IOTAAModuuleCrreatoor的方法法,包括用用于生成代代码的NeewImpplSouurce方方法(参考考“向Dellphi的的菜单添加加菜单项”一节,那那里提供了了关于如何何从COMM对象BoorlanndIDEEServvicess查询TooolsAAPI服务务的简要讨讨论)。实现IOTTACreeatorr IOOTACrreatoor定义了了用于与DDelphhi的文件件系统视图图
53、协同工作作的接口。IOTAACreaator用用于为生成成代码提供供方便。对对于IOTTACreeatorr,我们实实现了GeetCreeatorrTypee、GettExisstingg、GettFileeSysttem、GGetOwwner以以及GettUnnaamed方方法。从本节开头头列出的代代码可用看看出,这些些方法相对对较为直观观。GettCreaatorTType返返回TooolsAPPI.paas中定义义的sUnnit。常常量sUnnit包含含了值Unitt,表示将将创建单元元。GettExisstingg返回Faalse,因因为我们正正在创建新新的单元;如果引用用已有的单单元
54、,那么么该方法将将返回Trrue。GGetFiileSyystemm返回TFFileSSysteem对象的的ID字符符串,向导导将使用该该对象来读读写文件。它并不是是必须的,因因此该方法法返回了空空字符串。GetOwwner返返回对拥有有模块的引引用。例如如要将该模模块添加到到一个已有有的工程,我我们需要查查询BorrlanddIDESServiices以以获得已有有的工程或或包。我们们将使用包包编辑器来来将新的专专家添加到到某个特定定的包。GGetOwwner方方法可以返返回Nill。最后是是GetUUnnammed方法法,如果我我们返回未未命名的单单元,该方方法将返回回Truee。如果GG
55、etUnnnameed返回TTrue,DDelphhi将在第第一次保存存单元时提提示用户输输入文件名名。如图AA.6的NNew EExperrt对话框框所示,我我们已经提提供了单元元名。要自动生成成模块并添添加到打开开的包,您您可以修改改GetOOwnerr方法,查查找活动工工程组并将将其作为GGetOwwner的的结果返回回。下面的的代码就足足够了。functtion TNewwExpeertWiizardd.GettOwneer: IIOTAMModulle;varModulleSerrvicees : IOTAAModuuleSeervicces;ProjeectGrroup : IOO
56、TAPrrojecctGrooup;I : IIntegger;beginnresullt := Nill;ModulleSerrvicees := BorrlanddIDESServiices As IIOTAMModulleSerrvicees;for II := 0 too ModduleSServiices.ModuuleCoount - 1 dobeginnwith ModuuleSeervicces.MModullesII dooif( PPos( .bppg, FileeNamee ) 0 ) theenif( QQueryyInteerfacce( IIOTAPProjeect
57、Grroup, ProojecttGrouup ) =S_OK )thenbeginnresullt := ProojecttGrouup.GeetActtivePProjeect;exit;end;end;end;ModulleSerrvicees对象是是由BorrlanddIDESServiices对对象返回的的。将查找找所有的模模块,以找找到包含.bpgg包扩展名名的模块。当找到一一个包以后后,QueeryInnterfface会会测试该模模块是否实实现了IOOTAPrrojecctGrooup接口口。如果已已经实现了了该接口,那那么将把AActivveProojectt作为函数数结果返
58、回回。实现IOTTAModduleCCreattor 在这个练练习中,IIOTAMModulleCreeatorr包含的方方法数目是是最多的。为与IOOTA前缀缀的来源相相一致,这这些方法也也都相对直直观而易于于实现。表表A.2包包含了用于于实现IOOTAMooudleeCreaator接接口的方法法。虽然该该表较小,但但也够用了了,因为描描述都相对对较短。表A.2 为IOOTAMooduleeCreaator接接口所实现现的方法。对Neww Exppert向向导最重要的是是NewIImplSSourcce方法,该该方法返回回生成的源源代码接口方法描述GetAnncesttorNaame返回模
59、块所所继承的祖祖先名;我我们使用了了空字符串串GetFoormNaame该函数返回回窗体名;由于并不不生成窗体体,所以我我们也返回回空字符串串GetImmplFiileNaame返回由Neew Exxpertt对话框读读取的、存存储在FUUnitNName中中的单元名名(续表)接口方法描述GetInntfFiileNaameCPP头文文件名,这这里返回空空字符串,要要记得Deelphii与C+ Buiilderr共享VCCL代码GetMaainFoorm由于本模块块并非主窗窗体,所以以GetMMainFForm返返回FallseGetShhowFoorm由于该向导导并不与窗窗体相关联联,所以仍
60、仍然返回FFalseeGetShhowSoourcee由于我们需需要完成生生成的专家家向导中的的Execcute行行为,因此此返回Trrue以显显示新的单单元NewFoormFiile返回IOTTAFille对象,表表示窗体文文件的实例例;如果生生成的专家家不需要窗窗体,则返返回NillNewImmplSoourcee这是个关键键性的方法法:该方法法返回IOOTAFiile的子子类,包含含了生成的的专家的源源代码。从从代码可以以看到,该该方法返回回了TExxperttUnitt类的实例例(在“建立代码码生成器”一节中,我我们将继续续讨论TEExperrtUniit单元)NewInntFSoou
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 在五四青年节表彰大会上的发言稿
- 2026秋沪科版物理九上13.1 《测量:温度》学科素养同步分层练习设计(培优版)
- 人教九上(新)历史与社会 1-2-2武昌起义与中华民国的创建教学设计
- 危险化学品储存运输风险管理
- 机场航站楼给排水管道施工规范
- 2026拥军优抚业务完整试题及答案
- 企业仓库耗材成本管控手册
- 《老旧小区基础设施改造设计规范》
- 写作·口语交际·综合性学习 古诗苑漫步教学设计初中信息科技陕科版2024七年级下册-青岛版2017
- 粤教版高一信息技术必修一教案:第一章信息与信息技术本章概述
- 2026内蒙古恒正实业集团招聘65人笔试历年难易错考点试卷带答案解析
- 2025至2030中国美容仪行业现状及未来发展前景预测报告
- 项目验收不合格整改预案
- 新专业申报相关调研问卷
- 道路运输和交通设施企业安全风险分级管控和隐患排查治理双重预防机制建设指南
- 2026届广西壮族自治区桂林市十二县高三年级上册12月月考历史试题(含答案)
- 关于某某企业级固态硬盘采购与质保合同
- 2026年河北省机关事业单位技术工人图书仓储员考试选择题
- 2025年陶瓷地砖行业技术专利分析报告
- 风行股海课件
- 树立消防员正确的消费观
评论
0/150
提交评论