好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

附录A使用OPENTOOLSAPI的D扩展示例(1).docx

32页
  • 卖家[上传人]:新**
  • 文档编号:465734993
  • 上传时间:2022-12-16
  • 文档格式:DOCX
  • 文档大小:107.18KB
  • / 32 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 附录A 使用OPENTOOLS API的Delphi扩展示例附录A与第11章的内容前后承继阅读第11章之后,您已经了解了创建定制组件的大部分知识附录A也很重要,它示范了如何创建组件编辑器以及使用OpenTools API对Delphi自身进行扩展二者分属不同的主题:一个与组件相关,另一个则是要扩展Delphi之所以将二者放到附录中,是因为它们没有其他技术那样常用但要用到二者的时候,它们都是很有用的定制组件编辑器可以定义设计时对话框,编辑器在Object Inspector不够用时,使得用户能够可视化地修改特定于该组件的每个方面一个很好的例子就是TChart组件,由Dave Berneda开发另外,在设计时您还可以从组件的上下文菜单中运行该组件所包含的代码假定您使用Delphi已经有一段时间了,而您认为Delphi缺乏某些必要的特征我三年前在一个工程上工作时,就发生了这样的情况当时正在对Rational Rose所定义的系统结构模型进行编码,我们已经厌烦了手工定义类并编写函数体实在是太烦了创建一个类来读取类的声明并编写函数体,这看来是个不错的主意使用OpenTools API,有时候再借助一下Ray Lischner的书《Hidden Paths of Delphi 3: Experts, Wizards, and the Open Tools API》,我们最终向Delphi添加了一个能够调用类生成器的菜单项。

      结果终于摆脱了这本来可以自动完成的、烦人的任务(可惜的是我们没有一本语法分析方面的好书,我有点离题了)这准确地描述了Inprise公司在决定向Delphi专业版和企业版用户提供OpenTools API时的想法当需要Delphi具有某些功能时,添加上去就行了Delphi现在还具有“Complete class at cursor”的代码生成功能,因此我们可以创建一个尚不存在的专家:可以生成专家的专家当您阅读本章后,可以了解到如何创建组件编辑器以及怎样使用专家对Delphi进行定制有一个工具可用于开发定制专家,这使得创建专家与创建组件一样容易A.1 OpenTools API介绍OpenTools API原来定义为抽象虚类,即它使用了Delphi接口,而我们可以继承它以便向Delphi添加扩展原来的那些单元仍然存在于你安装的Delphi的Source\ToolsAPI子目录下,但在大多数情况下它们已经让位于ToolsAPI.pas单元中定义的COM接口注意:ToolsAPI单元与Delphi专业版和企业版一同发布您也可以对Delphi标准版进行定制,只是包含相应接口的单元在Delphi标准版中是没有的。

      如果您对Delphi抽象接口比较熟悉,那么比从零开始要好一些不管怎样,您都应该学习COM接口,这正是我们在本章中要做的A.1.1 OpenTools接口大多数情况下,OpenTools接口都是位于Source\ToolsAPI\ToolsAPI.pas单元中的COM接口为提高后向兼容性,该目录下也定义了风格较老的Delphi接口表A.1完整地列出了ToolsAPI中的所有单元带有星号的单元包含了风格较老的Delphi接口,通常应该避免在较新的代码中使用警告:很差的是,这些单元在帮助文件中并没有很好的文档首先要参考单元中的代码;代码中的注释很有帮助,但默认某些知识;而经过仔细查找,我们发现几乎完全没有集成化的帮助这真是个不幸,如果要进行扩展,您必须阅读许多代码并进行实验表A.1 Delphi ToolsAPI单元列表通过实现ToolsAPI.pas单元中定义的COM接口,可以访问Delphi的大部分功能单元描述toolsapi.pas包含了新的COM接口,它替换了在其他单元中可以找到的风格较老的接口(本章中将广泛地使用该单元的接口)vcsintf.pas包含了与版本控制系统进行链接的COM接口dsgnintf.pas包含了特性编辑器、组件编辑器以及注册过程所需的接口(例如,RegisterComponentEditor)editintf.pas*风格较老的Delphi抽象接口,用于访问编辑器缓存,例如单元的文本exptintf.pas*风格较老的单元,其中包括了用于定义专家的抽象虚类TIExpert;新代码应使用ToolsAPI单元中的COM接口fileintf.pas*风格较老的单元,其中包括了用于访问文件系统功能的抽象虚接口istreams.pas*包含了流、内存流、文件流的接口toolintf.pas*与Delphi菜单和ToolServices相关的接口;在新代码中应使用ToolsAPI单元中的BorlandIDEServices COM对象以及IOTAMenuWizardvirtinft.pas*包含了TInterface的定义,以及Delphi对基本的COM接口IUnknown的实现注意:本章中可能会交替使用向导和专家这两个词。

      它们都是指Delphi中的专家之所以使用两个词,是因为Inprise也并未确定使用单个词注册过程使用向导这个词,而COM接口也包含了向导这个词在Delphi中进行讨论时,对这两个词进行区分是没有意义的现在已经无需了解进一步的细节了,我们来创建一个Delphi专家A.1.2 创建向导对Delphi向导进行扩展的最为直接的途径就是实现IOTAWizard和IOTAMenuWizard接口这两个接口都定义在ToolsAPI单元中,而且您可以看到,它们非常容易实现注意:首字母缩略词前缀IOTA指的是Interface for OpenTools API(我是这样认为的!),它也可能是指一幕希腊剧,意思是指非常小的数量(因为只有很少量的代码需要实现)实现IOTAWizard和IOTAMenuWizard最容易实现的向导是非常基本的IOTAWizard接口,它使用IOTAMenuWizard类来实现IOTAWizard接口需要实现四个方法,而IOTAMenuWizard则把一个菜单项放置到Help菜单上由于刚刚起步,我们将以向导的形式实现一个Hello World例子为使读者不至于失望,将在下一节实现一个较为有用的向导。

      下面的代码定义IOTAWizard和IOTAMenuWizard实现基本的向导并显示在Help菜单上,需要实现IOTAWizard接口的四个方法:GetIDString、GetName、GetState和Execute由于IOTAWizard继承了IOTANotifier接口,您还需要实现IOTANotifier接口可以使用TNotifierObject存根类作为IOTANotifier接口的实现IOTANotifier接口引入了AfterSave、BeforeSave、Destroyed和Modified方法,以便对事件进行响应对这个练习而言,该存根类就足够了IOTAMenuWizard继承了IOTAWizard接口在IOTAMenuWizard类中,惟一需要实现的方法是GetMenuText,该方法返回在Help菜单上显示的文本IOTAWizard = interface(IOTANotifier)['{B75C0CE0-EEA6-11D1-9504-00608CCBF153}']{ Expert UI strings }function GetIDString: string;function GetName: string;function GetState: TWizardState;{ Launch the AddIn }procedure Execute;end;IOTAMenuWizard = interface(IOTAWizard)['{B75C0CE2-EEA6-11D1-9504-00608CCBF153}']function GetMenuText: string;end;这个没有实际功能的向导定义为TDummyWizard类,该类是TNotifierObject、IOTAWizard以及IOTAMenuWizard的子类。

      它实现了上面代码所列出的接口中的五个方法完整的实现代码如下unit UDummyWizard;// UDummyWizard.pas - Demonstrates basic wizard interface// Copyright (c) 2000. All Rights Reserved.// By Software Conceptions, Inc. Written by Paul Kimmel. Okemos, MI USAinterfaceusesWindows, ToolsAPI;typeTDummyWizard = class(TNotifierObject, IOTAWizard,IOTAMenuWizard)publicfunction GetIDString : String;function GetName : String;function GetState : TWizardState;procedure Execute;function GetMenuText : String;end;procedure Register;implementationusesDialogs;procedure Register;beginRegisterPackageWizard(TDummyWizard.Create);end;{ TDummyWizard }procedure TDummyWizard.Execute;beginMessageDlg( 'Building Delphi 6 Applications', mtInformation,[mbOk], 0 );end;function TDummyWizard.GetIDString: String;beginresult := 'SoftConcepts.DummyWizard';end;function TDummyWizard.GetMenuText: String;beginresult := 'Dummy Wizard';end;function TDummyWizard.GetName: String;beginresult := 'Dummy Wizard';end;function TDummyWizard.GetState: TWizardState;beginresult := [wsEnabled];end;end.Register过程以TDummyWizard的一个实例为参数调用了RegisterPackageWizard。

      您可以像安装组件一样把专家安装到包中,如上例实际上,进行安装最容易的方法就是使用Delphi中的Component | Install Component菜单项当用户单击添加的菜单项时,即可调用这个非常基本的向导当单击菜单项时,将调用向导实现的Execute方法来响应TDummyWizard在一个TMessageDlg对话框中显示本书的标题当然,如果您确定的话,可以在Execute方法中加入几乎任何级别的复杂行为GetIDString方法返回向导的字符串标识符按照惯例,该ID的前。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.