ModelMaker初探

  ModelMaker 提供了一个崭新的方法为 Delphi 系列开发类和组件。ModelMaker 是一个面向生产力、重构和 UML 风格的工具。作为一个双向工具,其主要的用途就是产生本地的 Delphi 代码。从一开始 ModelMaker 是被设计为敏捷和高生产率的工具。如今,ModelMaker 已经被用来为实时技术和数据库类型的应用程序创建类,具有完整的反向工程能力。
    ModelMaker 支持画一序列的 UML 图,它的特别之处在于它的实时的模型引擎,存储和维护了类及其它们的成员之间的关系。重命名一个类或者改变它的祖先将立即反映到自动产生的源代码上。它将诸如重载方法、添加事件、属性和访问方法的任务简化为选择和点击操作。

  ModelMaker 提供了一个崭新的方法为 Delphi 系列开发类和组件。ModelMaker 是一个面向生产力、重构和 UML 风格的工具。作为一个双向工具,其主要的用途就是产生本地的 Delphi 代码。从一开始 ModelMaker 是被设计为敏捷和高生产率的工具。如今,ModelMaker 已经被用来为实时技术和数据库类型的应用程序创建类,具有完整的反向工程能力。
    ModelMaker 支持画一序列的 UML 图,它的特别之处在于它的实时的模型引擎,存储和维护了类及其它们的成员之间的关系。重命名一个类或者改变它的祖先将立即反映到自动产生的源代码上。它将诸如重载方法、添加事件、属性和访问方法的任务简化为选择和点击操作。
    使用 ModelMaker,你可以实现如下的目标:
    1。加速开发过程;
    2。产生设计和优秀的代码;
    3。关心设计代码而不是输入代码;
    4。无妥协设计;
    5。可以使你的设计更加接近完美(正确无误);
    6。在短时间内创建和维护更大的模型;
    7。在 UML 风格的图里将你的设计文档化;
    8。通过点击一个按钮在帮助文件里为单元建立文档;
    简而言之:节省时间和金钱,做出更好的软件。当然,这要以你最终设计出来的软件为基础。
 在这里可以看一些例子而不是帮助文档帮助您了解 ModelMaker。笔者也认为如此。为了验证它的作用,我们通过一个比较简单的过程来进行演示。
    调入模型 …\ModelMaker\…\Demos\mm ToolsApi.mpb,它包含组成了 ModelMaker 的 open tools Api 的接口。该 Api 的接口间关系已经被可视化了,类图显示了这个单元的继承关系。要理解 ModelMaker 如何处理类和单元。从工具栏上使用 Import Source File in new Model 命令,这将创建一个新模型并导入一个 Delphi 单元(如窗体单元或者一个 VCL 单元)。模型以单元名称命名;导入 Unit1.pas 将创建模型 Unit1.mpb。

    可视化存在的代码是开始使用 ModelMaker 的最好方法。您可以按照如下步骤实现:
    1。导入包含类的单元以实现可视化:使用主工具条上的 Import source file 按钮或在单元视图中进行拖动(View|Units)。
    2。在图视图中创建或者选择一个新类图(View|Diagrams)。
    3。在图编辑器(View|Diagrams Editor)中从 Wizard 弹出式子菜单中选择 visualization wizard 菜单项。
    4。使用这个向导选择要可视化的类和接口并选择可视化的关系类型(inheritance,uses,supports 等)。
    5。完成向导,将会立即得到一个刚才到如代码所构成的图。
    你可以移动类或者接口(拖动移动)或为类或接口选择不同的显示选项(在符号上双击),或将图作为一个整体设置显示选项(双击空白区域),打开或关闭成员显示,选择接口风格等。

 一个 ModelMaker 模型包含一个代码模型和图表。代码模型包括类、类成员(属性,方法)和单元,分别映射到 delphi 的 object pascal 的相应实体。图用于可视化代码模型或实体,根本就不存在于代码模型中。 Getting started 例子将集中演示代码模型和演示模型创建宽衣个包含新组件类的新单元。
    要在 ModelMaker 中为一个新(组件)类(或者接口)创建代码,您至少需要:
    1。如果您不想添加新类到当前模型中,创建一个新模型,在新模型中防止相关的类。(此操作在 Unit 面板下添加一个新类(Class))
    2。添加一个新类到模型中,定义它的类名和祖先。
    3。添加(重载)属性,方法和事件到类的接口中
    4。实现新方法。
    5。添加一个新类到一个(新)单元中。
    6。产生单元实际创建或更新磁盘上的源文件。
    7。在 delphi 中调试单元,如果单元包含组件,则加到 VCL 中。
    8。在调试时,保持在 ModelMaker 中编辑你的代码,使用ModelMaker 的集成专家在 delphi 和 ModelMaker 间切换。一个可选的方法时导入存在的文件到一个新模型中,在 ModelMaker 中维护这些单元或派生新类,(以后会更加详细说明)。

【创建一个新工程】
    创建一个新工程(或模型)有三个途径:
    • 选择菜单“File|New”,你将得到一个空白的工程,该工程包含一个默认的祖先TObject 和 IUnknown。
    • 选择菜单“File|New from default”,你将从默认模板装载得到一个新工程。 在这种情况下创建的工程将至少包含一个TComponent类,如果你没有修改MM附带的默认工程[installdir]\BIN\DEFAULT.mpb。
    • 选择菜单“File|New from template”,你将选择一个除默认模板以外的模板来创建新工程。

【创建新类】
    我们将使用类视图来创建一个新类。 在类视图中你可以添加一个新类作为模型中另一个类的子类。类视图描述如下:
    祖先类必须总是模型的一部分,因为MM需要它来正确地产生类声明。这暗示着在我们的例子中在添加类TIntLabel之前,它的祖先TLabel必须存在于模型中。这就产生了一个问题,如果你从同样的默认模型开始,或是一个不包含TLabel类的模板模型,你必须首先添加TLabel类。但是,为了正确地添加TLabel类到你的模型中,你现在必须首先添加它的祖先,如此循环下去…救救我!
    因为你不想为TLabel创建代码,而仅仅是使用它作为祖先,那么TLabel就没有必要一定要有正确的祖先。在我们的例子中,TLabel 的祖先可以任意,例如TObject ,一个更合适的祖先当然是TComponent。在我们的例子中,象“TLabel”的类称为占位符类,这与诸如“TIntLabel”的实际类是相对的。 其他占位符类的例子有:“TObject”——Delphi的默认祖先类和“TComponent”。
    我们现在要做的事情就是添加两个类:TLabel(“占位符”),然后添加TIntLabel(“实际”类)。 要做到这些:
    1. 通过选择菜单“View|Classes ”(或按F3)使类视图可见。
    2. 选中TComponent 。
    3. 按下“Ins”键或从弹出式
菜单中选择“Add descendant ”。
    4. 输入TLabel作为类名。你可以双击类并在类编辑器对话框中选中选项“placeholder”,使得类“TLabel”仅仅是实际的Tlabel(包含在单元StdCtrls中)的代替变得清晰起来。
    5. 使用同样的方法添加类TIntLabel,使用TLabel作为它的祖先。当然在这里不要选中“placeholder”选项。
    在类视图中你将看到模型中所有类(和接口)的树型结构或列表结构。使用弹出式菜单在树和列表风格间切换。
    

在鼠标点击处的说明:
  Class tree containingplace holder TLabeland real class TIntLabel

[img]http://www.delphibbs.com/keylife/images/u140725/Untitled-1.jpg[/img]
   在我们的例子中现在需要加入一个新属性和读写访问方法到类TIntLabel的接口,变成象下面这样:
    type
      TIntLabel = class (TLabel)
      protected
        function GetNumValue: Integer;
        procedure SetNumValue(Value: Integer);
      published
        property NumValue: Integer read GetNumValue write SetNumValue;
      end;
    要做到这些,我们将使用类成员视图—位于主窗口的左下。类成员包括域,方法,属性(和事件类型属性),组成了一个类的接口。类成员视图描述如下:
    1. 在这个视图中,当前选择的类的所有成员都显示出来了。你可以设置过滤选项过滤出要显示哪些成元,过滤选项包括按类型过滤(域,方法等),可见性(私有,保护等)和种类等。你通过从弹出式菜单中选择“Reset Filter”菜单项或点击“Show all types”和“Show all visibilities”按钮重置过滤。现在所有的过滤按钮应该是按下状态,除了“Show all..”按钮(仅重置过滤)以外。确信种类过滤显示为<all categories>。成员列表现在还是空的,因为我们还没有创建任何新类成员。注意过滤布局可以使用弹出式菜单“filter layout”或在过滤区域上双击进行切换。
    2. 点击“Add property”按钮。
    3. 属性编辑器对话框将出现。如下面图片所示:
    4. 输入“NumValue”作为属性名称。
    5. 选择可见性为“published”。
    6. 设置属性的数据类型为“Integer”。
    7. 选择读访问为“方法”。这意味着该属性具有读访问方法并使用该方法来访问它,而不是域。
    8. 选择写访问为“方法”。这意味着该属性具有写访问方法并使用该方法来访问它,而不是域。

[img]http://www.delphibbs.com/keylife/images/u140725/Untitled-2.jpg[/img]

  9. 保留其他设置为默认值,点击OK。下面的图片显示了正确的设置。 现在再来看看类成员视图:
    你将不仅会看见一个属性NumValue,同时还会看见两个属性访问方法GetNumValue和 SetNumValue。 这是因为属性自动创建和更新了它们的访问域和方法。这样就节省了时间。
    现在定义了TIntLabel 类的接口,但是方法GetNumValue和SetNumValue还需要实现。

[img]http://www.delphibbs.com/keylife/images/u140725/Untitled-3.jpg[/img]

  在本例中需要给方法GetNumValue 和 SetNumValue添加代码来实现它,代码如下所示:    
    function TIntLabel.GetNumValue: Integer;
    begin
      Result := StrToIntDef(Caption, 0);
    end;
    procedure TIntLabel.SetNumValue(Value: Integer);
    begin
      Caption := IntToStr(Value);
    end;
    要为实现方法添加代码,使用(方法)实现视图:
    1. 在类成员视图中选择你想要实现的方法,在本例中选择方法GetNumValue ;
    2. 选择菜单“View|Implementation”,是方法实现视图可见。

[img]http://www.delphibbs.com/keylife/images/u140725/Untitled-4.jpg[/img]

  上图显示了方法实现视图。这个编辑器的多半元素与其他编辑器中的不同。5个方框从上到下,从左到右分别的说明如下:
    Method declaration (Inplace editable)
    editorMethod One Liner
    Local code explorer Displaying local vars and local procedures
   『sectionSection listLocal
    User owned section, currently activein code editorMethod』
    Code editor
要理解这个编辑器如何工作,你需要一点关于MM如何为方法的实现产生代码的知识。
    让我们再靠近一点来观察GetNumValue方法。这只是一个简单的方法,不包含任何本地变量或本地过程。
    方法实现的主要部分由一序列本地变量,本地过程和代码节(实现begin .. end间的块)组成。一个节(section)可以代替任何数目的代码行。所有的节在一起组成了实现部分。使用节,能够标识主要部分(body)中的代码行。这方面的一个例子是用来自动添加和更新对继承方法的调用,后面将会看到。
    在方法代码编辑器的左边,方法的全部代码被显示出来,虽然可能会折叠(如果需要)。在右边我们可以发现实际的代码编辑器。它用于编辑在代码节列表中选中的代码节的代码,也可用于编辑本地过程代码。
    function TIntLabel.GetNumValue: Integer;
    //ModelMaker will generate the method header as defined in the interface
    begin
      Result := StrToIntDef(Caption, 0);
      //This is a section of code youadd to actually implement themethod.ModelMaker willindent this section for you.
    end;
    //ModelMaker will insert thereserved words begin and end.
    方法实现的主要部分由一序列本地变量,本地过程和代码节(实现begin .. end间的块)组成。一个节(section)可以代替任何数目的代码行。所有的节在一起组成了实现部分。使用节,能够标识主要部分(body)中的代码行。这方面的一个例子是用来自动添加和更新对继承方法的调用,后面将会看到。
    在方法代码编辑器的左边,方法的全部代码被显示出来,虽然可能会折叠(如果需要)。在右边我们可以发现实际的代码编辑器。它用于编辑在代码节列表中选中的代码节的代码,也可用于编辑本地过程代码。
    就象上面图片中所看到的,我们所需要做的唯一的事情是添加一个包含如下语句的节:
    Result := StrToIntDef(Caption, 0);
    要做到这些,首先创建一个新节。如果你不改变代码选项设置(在 “Options|Code options” 中),并且该方法不包含任何节,则一个新节将自动创建。
    1. 如果需要,点击“Add section”按钮添加一个新节。
    2. 在
代码编辑器中输入语句。没有必要缩进代码,因为MM会自动替你完成。
    3. 点击“save code”按钮。事实上这并不一定必须,因为一旦你选择一个新节或一个新方法ModelMaker就会自动保存该节。
    注意刚才创建的节现在已经出现在节列表中了,并用一个绿线标记。绿线是通知你已经创建了这个节,并且是它的拥有者。红线指示该节不为你所拥有,如:被模式插入(仅仅模式才有权更新它)。如果一个节包含的行数超出了当前的“Fold height”(可在环境选项Editor页上调节),节将被折叠起来。被折叠的节在折叠的位置带有二道紫线。更多的东西将在后面阐述。
    现在你应该能通过同样的方法实现方法SetNumValue:在类成员视图中选择该方法,如果需要添加一个节并输入你的代码。
    虽然我们现在已经实现了类TIntLabel,但所有的代码还只是存在于MM模型中,所以下一步是产生真正的source文件。
单元是到磁盘上源文件的通路,通过它把MM项目的所有数据(如类,方法实现等)与Object Pascal风格的单元文件(可被Delphi编译)链接起来。
  在本例中我们需要创建一个单元,它被产生Delphi单元文件后,应该是象下面这样:
    unit IntLabel;
    interface
    uses
      SysUtils, Windows, Messages, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
    type
      TIntLabel = class (TLabel)
      protected
        function GetNumValue: Integer;
        procedure SetNumValue(Value: Integer);
      published
        property NumValue: Integer read GetNumValue write SetNumValue;
      end;
      procedure Register;
    implementation
 
    procedure Register;
    begin
      RegisterComponents(‘MM Demo’, [TIntLabel]);
    end;

    function TIntLabel.GetNumValue: Integer;
    begin
      Result := StrToIntDef(Caption, 0);
    end;

    procedure TIntLabel.SetNumValue(Value: Integer);
    begin
      Caption := IntToStr(Value);
    end;

    end.

    要创建一个新单元,使用Unit List view,描述如下:
    1. 选择菜单“View|Units”使单元列表视图可见。 在单元列表视图中点击“Add unit”按钮,出现单元属性对话框,在对话框中设置:
    1. 让源路径别名<no alias>不变;
    2. 源文件名(完整路径包括驱动器和文件夹),定义路径可以使用源别名,但是现在只通过点击browse按钮来找到目录ModelMaker\6.0\Test,输入文件名:IntLabel.PAS 。
    3. 在“Classes”页将类TIntLabel加到右边的列表中。
    4 在右边的字符串网格中将“VCL page”页从<unregistered>改为“MM Demo”。
    5 点击 OK。
    现在你将看到刚才创建的单元出现在左边的单元列表中。在编辑器中,单元的代码将包含一些文本如下所示:
    unit <!UnitName!>;
    interface
    uses
      SysUtils, Windows, Messages, Classes, Graphics, Controls, Forms, Dialogs;
    type
      MMWIN:STARTINTERFACE
      MMWIN:CLASSINTERFACE TIntLabel; ID=7;
    procedure Register;
    implementation

    procedure Register;
    begin
      MMWIN:CLASSREGISTRATION TIntLabel; ID=7; Page=’MM Demo’;
    end;

    MMWIN:STARTIMPLEMENTATION
    MMWIN:CLASSIMPLEMENTATION TIntLabel; ID=7;

    end.

    现在,你应该能够理解MM使用标记(象MMWIN:CLASSINTERFACE)来插入到接口,注册和类的实现中。标记是你定义的简单的文本。还有一个问题:如果你查看接口的uses 语句,你将看到单元StdCtrls(定义了祖先类TLabel)被丢失了。那是因为我们使用的默认单元模板不包含这个单元。要改变这个模板请参考“定制ModelMaker”。现在,我们必须手工添加StdCtrls 。
    要作到这个:
    1. 在单元代码编辑器中将StdCtrls添加到uses从句中。
    2. 点击编辑器上方工具条中的“Save code”按钮。
   要产生源文件并创建或更新磁盘上的文件:
    1. 确信代码发生器没有锁定。锁将在以后进行解释,现在确信MM工具条上的“unlock code”按钮处于按下状态。
    2. 在单元列表视图中点击“Generate current unit”按钮。
    3. 启动Delphi (如果还没有运行)。
    4. 手动切换到Delphi或者更好的办法是点击主工具条上的“Locate in Delphi”按钮(或直接按Ctrl+F11),这将打开该单元并定位到当前在MM中选择的实体上。
    产生出来的源文件应该如我们想要的一样漂亮。(如果你修改了MM的\BIN文件夹下的DEFUNIT.PAS文件则会产生差异。)
    现在我们准备调试TIntLabel,并将它安装到VCL上。在此之前,首先保存我们的模型是一个好的习惯。保存方法与其他应用程序是一样的,所以这里不作解释。我们可以使用[installdir]\TEST文件夹来保存这个工程。 实践证明在创建源文件后命名模型文件是很方便的。这里把它命名为INTLABEL.mpb看来是再合适不过了。

【调试控件】
    在将你的新控件添加到VCL之前先对它进行调试是一个好习惯。如可以通过将源文件加入到当前的Delphi项目文件中(如可以通过Delphi的项目管理器)并重新编译项目文件来进行调试。这至少可以过滤出所有的语法错误。编译项目文件或者使用“Compile”或者使用“Syntax Check”,因为如果仅仅“Run”项目并不能保证总是会正确地管理文件的日期和修改状态。
【编译错误】
    如果你没有范任何错误,单元应该会顺利编译。如果没有编译成功,则在MM的合适位置改变代码。更确切的说:
    &#8226; 因为在单元的从句中丢失单元:单元代码编辑器;
    &#8226; 因为代码不是类的一部分:单元编辑器;
    &#8226; 因为类名或祖先名错误:类视图;
    &#8226; 因为类的接口声明错误:类成员视图;
    &#8226; 因为方法的实现错误:方法实现视图;
    切换到MM并找到出错代码。使用集成专家的菜单“Jump to ModelMaker”直接从Delphi的代码编辑器跳到MM的相应位置。最后,再一次在单元列表视图中点击&ldquo
;Generate”按钮并重新编译Delphi项目。
【将控件加入到VCL中】
    调试你的新文件后,将它加入到Delphi的VCL中。
    在Delphi 3和更高版本中:你必须安装新控件到一个包中。选择..ModelMaker\6.0\Test文件夹中的称为MMtest的新包。要安装包请参考你的用户指南。
    重新编译VCL后,新的TIntLabel控件应该会出现在你注册的MM Demo面板页上。要测试TIntLabel控件,可以将它放到一个(新)窗体上。
    你现在可以在对象监视器中设置“NumValue”属性同时将会看到它的标题被改变了。但是这个控件还能被改进。

  如果你仔细观察,你就会发现当放置一个TIntLabel到窗口上时,标题初始为“IntLabel1”而不是“0”,而NumValue是0,这是相互矛盾的,显得不够严密。要改进该控件,我们将需要重载构造器(constructor)Create象下面这样:(对于TControl.ControlStyle属性请参考Delphi的在线帮助)。
    constructor TIntLabel.Create(AOwner: TComponent);
    begin
      inherited Create(AOwner);
      { Don’t let the Object Inspector set a caption }
      ControlStyle := ControlStyle – [csSetCaption];
      { Instead pre-set the Caption ourselves }
      NumValue := 0;
    end;
    要达到这个目的,我们需要返回到MM中。
  要重载构造器,我们可以在类成员视图中通过点击“Add method”添加一个方法,命名为“Create”,调整它的其他属性如参数为“AOwner: TComponent”,方法类型为“constructor”等等。但是重载方法可以做的更容易些。唯一要做的事情是:为了要重载一个方法(或属性),要被重载的方法必须存在于模型中。如果你使用随MM带的默认工程模板(该模板包含类TComponent),则虚拟构造器TComponent.Create包含在模型中,可用于重载。
    要做到这些:
    1. 在成员视图工具条中点击“Wizards ”按钮;
    2. 选择“Method override wizard”;
    3. 在“Override Methods”对话框中选择“Create”方法;
    4. 确信复选框“Call inherited method”被选中。这将命令MM加入一个包含调用继承方法的代码节。
    5.点击OK。
    在类成员视图中将会看到一个Create方法加入到列表中。你可以在成员列表中双击它或从弹出式菜单中选择“Edit Member”来查看它的属性。
    注意所有从TComponent.Create拷贝过来的相关属性:
    &#8226; 方法名称是“Create”。
    &#8226; 参数列表是“AOwner: TComponent”。
    &#8226; 方法是“public”。 &#8226; 数据类型是:“void”。
    &#8226; 方法类型是:“constructor”。
    &#8226; 绑定类型是“override” (因为TComponent.Create是虚拟的)。
    &#8226; 选项“Call inherited”被选中,因为我们在运行重载向导是选中了“Call inherited method”复选框。
    &#8226; 选项“Inheritance restricted”被选中。如果这个选项被选中,则祖先类中被重载的方法的任何改变都会被自动继承过来。
    点击“Cancel”保持它的原始状态。
  要实现方法Create,再一次切换到方法实现视图。注意左边的节列表中,已经有一个包含代码的节存在了:
    inherited Create(AOwner);
    这个节被标注为红线,暗示我们不能编辑它的内容。这节被添加是因为方法的选项“Call inherited”被选中。
    要添加其他代码行:
    1. 点击“Add section”按钮添加一个新节;
    2. 在右边的代码编辑器中输入代码;
    3.点击“Save code”按钮。
    实例:
      constructor TIntLabel.Create(AOwner: TComponent);
      begin
        inherited Create(AOwner);
        //Section to callinherited method.automatically addedand updated.
        { Don let the Object Inspector set a caption }
        ControlStyle := ControlStyle – [csSetCaption];
        //Section in which youenter your code.You must createand update thissection yourself.
        { Instead preset the Caption ourselves }
        NumValue := 0;
      end;
  如果我们看一眼编辑器,可以发现源文件还没有被更新。要使它更新我们需要重建该单元,因此再切换到单元列表视图中。
    重建该单元可以通过再点击“Generate”按钮来完成,但是好象演示MM的即时代码生成特点显得更有教育意义。相对每次某些地方一改就必须手动重建源文件说来,它可以做到自动重建单元。 这是一个很好的特点,不仅重建了源文件,而且假如源文件正在打开状态,则通知Delphi重新载入更新后的源文件(请参考与Delphi集成)。
    要观察这个特点:
    1. 确信INTLABEL.PAS单元文件已经被装载,并且位于Delphi代码编辑器的顶部(即使它当前被选中);
    2. 在单元视图工具条中点击“Enable auto generation”按钮;
    3.现在留心Delphi编辑器怎样反映你的文件的最近更改。
    现在让我们返回到MM中再重复一次:
    1. 切换到类成员视图中;
    2. 编辑“Create”方法(双击或点击“Edit”按钮);
    3. 现在去掉“Call inherited”选项并点击OK。
    4. 观察在Delphi中被更新的代码;
    5. 重新选中“Call inherited”选项。
    更仔细地观察方法代码编辑器:
    在“Create”方法的节列表中,你可以拖动节向上或向下,观察Delphi的代码编辑器如何跟随你的改变(你可以发现Delphi的代码的顺序也作了相应的改变)。
    让我们在单元视图里作一次:
    1. 确保单元视图为树显示模式(通过弹出式菜单进行设置);
    2. 选择TIntLabel类;
    3. 按下“Del”键,这将会使该类从单元中移去。该类仍然在代码模型中,你可以从“classes not assigned to units”节点下找到它。检查IDE中的代码,可以发现类的整个接口和声明都被删除了;
    4.拖动该类到IntLabel单元上,这将重新将类添加到单元。
    体验过了即时代码生成特点之后,要确保TIntLabel类还保持为你希望的样子。为了实际看到组件改进后的情况:
 &nbsp
;  1. 在Delphi中重新编译你的VCL:Rebuild your VCL in Delphi. Delphi 3 和更高:重新编译包MMtest.dpk.
    2. 从窗口上删除旧的TIntLabel控件;
    3.加入一个新的TIntLabel到窗体上,注意标题现在设置为“0”了。
  MM不仅支持产生控件源代码,而且也提供高级向导产生控件说明文档。包括:
    &#8226; 为类中的所有成员插入基本的标准化文档的文档向导;
    &#8226; 源文件内文档;
    &#8226; 帮助文件生成工具;
    &#8226; 类图的即时可视化。虽然创建图通常在设计过程中完成,但也可能从存在的代码中创建图。
    为演示这些特点,我们现在来为TIntLabel 控件创建一个帮助文件和类图。
  图中的每一个单元,类,类的所有成员,事件类型和符号都可以用一个简短的描述(成为“One Liner”)和更长的文本(称为文档)来进行文档化。为编辑“One Liner”和文档,我们将使用文档视图。我们也可以使用浮动的文档窗口来进行编辑(在主菜单的“Views ”菜单项上打开)。
    要让这个视图可见:选择菜单: “View|Documentation Editor”。
    使用这个文档编辑器,你可以给每个单元,类和及其成员(方法、属性等等)添加一个“One Liner”和更多描述性的文本。那可能有点工作量,所以MM包含一个文档化向导,可以替你作些累活。这个向导将插入文档片到当前选中的类中。
    要演示这个特点:
    1. 在类或单元视图中选择类TIntLabel;
    2.在文档视图中点击“Documentation Wizard”按钮;
    3.点击“OK”确认创建标准文档;
    4.在编辑类型下拉框中选择“class members”;
    5.在类成员视图中选择“GetNumValue”方法。

    现在你将会在文档编辑器中看到向导插入了如下文本:
    GetNumValue is the read access method for the NumValue property.
    通常这已经足够文档化GetNumValue了,因为你还要文档化属性NumValue的精确意义,所以在这里这么描述就避免了冗余。

    在类成员视图中选择SetNumValue方法使得作用于SetNumValue方法的视图可见:  
    SetNumValue is the write access method of the NumValue property.
    这也可以足够文档化SetNumValue 方法。

    剩下的工作是需要文档化构造器Create和属性NumValue。在这里,向导也插入了一些有用的文本。

    选择构造器的文档,改成下面这样:
    Constructor Create overrides the inherited Create. First inherited Create is called, then the Caption is pre-set to 0, reflecting the initial NumValue state. ControlStyle is modified to exclude csSetCaption.

    现在设置属性NumValue的文档如下:
    Property NumValue is read/write at run time and design time. It reads and writes the Caption proper ty as an Integer.

    要为类TIntLabel编辑文档:
    1. 在类或单元视图中选中类TIntLabel ;
    2.在文档视图中,在编辑类型下拉列表框中选择“classes”。

    输入如下文本:
    TIntLabel is a simple TLabel descendant created with ModelMaker. It adds the property NumValue which reads and writes the Caption property as an Integer.

    要编辑包含TIntLabel类的单元IntLabel的文档:
    1. 在单元视图中选中单元 IntLabel ;
    2.在文档视图中,在编辑类型下拉列表框中选择“units”。

    输入如下文本:
    Unit IntLabel contains a demo component TIntLabel. It was created with ModelMaker to demonstrate the creation of a new component.

    现在单元IntLabel已经完成了文档化。文档化典型的用于创建一个帮助文件或源代码内的文档。第三方的插件也可以使用MM ToolsApi来输出文档为其他格式。
    你可以使用同样的方法添加“One Liners” (简短地,单行描述)。在“Views”菜单上,你可以找到一个“Floating documentation”视图。这个视图也可用来插入One Liners和文档,该视图可以停靠或一直漂浮。视图中的编辑实体类型自动更新以反映MM中的最新选择焦点。
   MM可以从上面的文档中创建一个Borland风格的帮助文件。这包括产生用于Delphi在线上下文敏感帮助的Borland /B关键字。帮助文件从单元中生成。在我们的例子中将为单元INTLABEL创建一个帮助文件。
    MM 让你选择帮助文件的可见性,这些是:
    &#8226; ‘User’ (public, published, automated and default)
    &#8226; ‘Component writer’ (user visibilities plus protected)
    &#8226; ‘Developer’ (all visibilities)
    默认可见性“User”是限制最多的,因为它仅包括类的public、 published 或 automated interface帮助。 使用这个过滤创建一个随你的组件一起分发的帮助文件。选择“Component writer”可见性还将包含“protected”接口的帮助。这种类型的帮助文件典型地用量分发给那些需要从你的组件作继承开发的开发者。最后的选择将进一步的包括所有的“private”细节(代表性的域或属性访问方法等等),你可能用来作为内部文档。
    要为TIntLabel控件创建帮助文件:
    1. 在单元视图中选中IntLabel单元。
    2. 在文档视图中,点击按钮“Create help file”。
    3. 出现“Create help file ”对话框,提示你为该单元的RTF文件输入一个文件名。一个同名的帮助项目文件将会自动创建,扩展名为.HPJ。在我们的例子中输入[installdir]\TEST\INTLABEL.RTF。
    4.在同一对话框中,选择帮助文件的可见性。本例中我们选择“Component writers”可见性。
    5.让“reformat paragraphs”选项选中并点击OK。
    6.打开资源管理器,注意“INTLABEL.RTF”和“INTLABEL.HPJ”文件已经被创建。
    7.运行Delphi帮助编译器编译INTLABEL.HPJ帮助工程文件,要记得使用使用正确版本的编译器: 对Delphi 2, 3或更高:
    使用“Delphi 2(or 3 / 4/5/6).0\HELP\TOOLS\HCW.EXE ”来编译你的工程:在资源管理器中双击“INTLABEL.HPJ”文件应该就足够了。
    帮助文件现在已经被创建了。你也许想看看它们是什么样子,那么就双击最新生成的“INTLABEL.HLP”帮助文件吧。 此外还有一个帮助文件发生器插件可以获得,它可以实现一次为多个单元创建帮助文件等。

 

Share