Rod Paddock 和John Petersen 也在他们的书中也提供了一些使用VFP 向导类来建立你自己的向导的细节。这样做的优点是,有人已经建立了所有的"引擎"来管理向导处理,且你的向导将与其它的VFP向导具有相同的感观。
用BuilderD 创建生成器
在查看VFP6中的FoxPro基本类时(FFC),我注意到一件事是它们都具有叫做Builder和BuilderX的自定义属性,并且各个类的BuilderX 是设置为= HOME() + "Wizards\BuilderD,BuilderDForm"。我知道这些属性的作用(他们告诉VFP,这个类的生成器名),但为什么每一个类都要指定相同的生成器呢?更有趣的是,各个类以不同的选项调用类似的生成器表单(图1显示_HyperLinkLabel 类的生成器)。当使用相同的类时将会发生什么情况呢?
首先介绍一点背境。可能正象你可能意识到的,VFP 生成器可能以多种方式调用,但最常见的是可能是在对象上右击鼠标并从出现的菜单上选择生成器。这会使BUILDER.APP 被执行。BUILDER.APP 检查是否选定的对象(我们称为"目标对象") 具有 BuilderX 属性,如果有,运行该属性指定的程序或实例化该该属性指定的类(如果生成器是一个类,将指定一个类库,逗号及类名)。如果它没有 BuilderX 属性但有一个 Builder 属性,生成器运行该属性指定的程序或实例化该该属性指定的类(我们将看到为什么会同时用两个属性指定生成器)。如果两个属性都不存在,将使用该对象基类的默认生成器。 你可以在你的类中建立自定义的 Builder 和 BuilderX 属性(甚至在你的基类中) 然后为每一个类填写适当的生成器名字。要使用两个属性的理由是 BuilderX 为该类指定一个自定义生成器 而Builder为一组公共的类(如comboboxe 或 grid)指定一个所需的生成器。正如我们稍后会看到的一样,我们可以在 BuilderX 属性中指定的生成器中,单击一个按钮来调出在 Builder 属性中指定的生成器。 因此,我们可以很容易地在 Builder 和 BuilderX 属性中指定生成器。而不是花很多时间来建立你自己的生成器,特别对于不常使用的类。
BuilderD
你可能意识到了 BuilderB 技术 用来建立生成器是容易的和快速的。BuilderB 是一组你可以派生来建立你自己的生成器的类。你可以为你想用生成器维护的目标对象的各属性添加一个控件到生成器子类。虽然BuilderB 使得建立生成器更容易,但你必须为每一个你想用生成器管理的类建立一个新的生成器子类。对于我们这样的懒人来说,幸运的是,Ken 以数据驱动的方式增强了BuilderB。这种新技术叫做BuilderD ,"D" 的意思是"动态" (Dynamic),可以在Ken 的网站(www.classx.com)找到,也包含在VFP 6 中(在VFP 主目录下的WIZARDS 目录中的BUILDERD.VCX)。 BuilderD 由一系列的类组成,但主要的一个是BuilderDForm; 这是一个数据驱动生成器表单 (注意这是VFP6.0的基本类中指定的BuilderX类)。正如你在图2中看到,该表单中的文本框用于输入目标类的名字和类名,按钮提供的功能可以调出类浏览器和显示帮助,一个页框、两个页面,但没有用于管理属性值的控件。
以下是该表单在实例化时,如何组合适当的控件:
Init 方法调用SetObject 方法,它调用AddObjects 方法(该代码事实上是在BuilderDForm 的父类BuilderBaseForm中)。
AddObjects 方法调用来自BuilderDB类的表单上的oBuilderDB 对象的AddObjects 方法。
BuilderDB.AddObjects 是一个复杂的方法,但其基本操作是打开生成器定义表(默认情况下是在VFP 主目录下的WIZARDS 目录中的BUILDERD.DBF,但可以修改cBuilderTable 属性来指定另一个表),查找目标对象类的记录,查找所有相似的记录,并使用该记录中的信息在页框中的一个或多个页上建立控件。这些控件是基于BUILDERD.VCX中的类的,诸如BuilderCheckBox 和 BuilderTextBox,它们知道如何绑定属性到目标对象。
这些步骤的结果是,一个生成器可以管理目标对象的一个或更多的属性。一个指定的生成器可以事实上做得比这些还要多,例如放置代码到目标对象的方法或对象的容器中,介是目前我们只使用最简单的方法。
BuilderD 表
让我们进一步了解生成器定义表BUILDERD.DBF,因为理解它的结构是建立你自己的生成器的关键。表2 显示了BUILDERD.DBF表的结构; 在该表中,"property control" 意思是生成器中的、维护一个目标对象的指定属性的控件。
字段
|