用户管理  |   用户注册                                                                                    首 页软件下载教程中心办公指南flash动画文档下载办公公文

www.4oa.com - 中科软件园

投递文章 用户管理 投稿指南 资讯通告 :
站内搜索: 您的位置中科软件园 > 教程中心 > 数据库类 > FoxPro > 基础教程 > 教程内容

Foxpro 创建你自己的向导

2005-11-6 19:15:30  来源:本站整理  作者:佚名 【 投递文章
内容提要:RodPaddock和JohnPetersen也在他们的书中也提供了一些使用VFP向导类来建立你自己的向导的细节。这样做的优点是,有人已经建立了所有的"引擎"来管理向导处理,且你的向导将与其它的VFP...

Rod Paddock 和John Petersen 也在他们的书中也提供了一些使用VFP 向导类来建立你自己的向导的细节。这样做的优点是,有人已经建立了所有的"引擎"来管理向导处理,且你的向导将与其它的VFP向导具有相同的感观。

用BuilderD 创建生成器

在查看VFP6中的FoxPro基本类时(FFC),我注意到一件事是它们都具有叫做Builder和BuilderX的自定义属性,并且各个类的BuilderX 是设置为= HOME() + "Wizards\BuilderD,BuilderDForm"。我知道这些属性的作用(他们告诉VFP,这个类的生成器名),但为什么每一个类都要指定相同的生成器呢?更有趣的是,各个类以不同的选项调用类似的生成器表单(图1显示_HyperLinkLabel 类的生成器)。当使用相同的类时将会发生什么情况呢?

图 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中看到,该表单中的文本框用于输入目标类的名字和类名,按钮提供的功能可以调出类浏览器和显示帮助,一个页框、两个页面,但没有用于管理属性值的控件。

图 2. BuilderDForm

以下是该表单在实例化时,如何组合适当的控件:

  • 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" 意思是生成器中的、维护一个目标对象的指定属性的控件。

字段 用途
TYPE 定义记录类型。它包含了两个内容:如果这是一个类记录它是 “ CLASS ” ,如果这是一个属性记录则它是 “ PROPERTY ” 。
ID 记录识别符,通常是类的名字。
LINKS 连接到该记录的其它记录的 ID 值列表 ( 以回车符分隔 ) 。该字段的更多细节在下面描述。
TEXT 如果这是一个 “ CLASS ” 记录,则为生成器表单的标题提示。

如果这是一个 “ PROPERTY ” 记录,则为属性控件的标题提示。

DESC 属性控件的状态条文本。
CLASSNAME 对于 “ CLASS ” 记录,是类的名字。 BuilderDB 搜索该字段中指定的、一个包含目标对象类的记录。

对于 “ PROPERTY ” 记录,是要为属性控件实例的类的名字。若该字段为空,将使用 BUILDERD.VCX 中的默认的类 ( 逻辑属性是 BuilderCheckBox 其它属性是 BuilderTextBox) 。你指定的任何其它类都必须是 BuilderD 类的子类,因为这些类具有被 BuilderDForm 使用的特殊的属性和方法。

CLASSLIB 包含有 CLASSNAME 中指定的类的类库。该属性可以包含一个表达式 ( 例如 HOME() + “ WIZARDS\BUILDERD.VCX ” ) 或一个常量 ; 在这种情况下,在表达式事放上方括号。对于 “ PROPERTY ” 记录,如果该字段为空且指定了 CLASSNAME ,则假定为 BUILDERD.VCX 。对于 “ CLASS ” 记录, BuilderDB 搜索一个包含有与该字段内容值相同的记录 ( 如果必要的话,在求值后 ) 作为目标对象的 ClassLibrary 属性,保留该值为空可建立一个类的生成器而不必担心它是在哪一类库中。
MEMBER 对于 “ CLASS ” 记录,其值为空。对于 “ PROPERTY ” 记录。如果为空, ID 必须包含属性名。
HELPFILE 包括有该类的帮助内容的 CHM 文件名。如果为空,就使用当前帮助文件。
HELPID 帮助主题 ID 。
TOP 属性控件的 Top 设置。如果为 0 , BuilderDForm 将该控件放在先前一个控件的下面 ( 页面上的第一个控件放置在 BuilderDB.nTop 属性中指定的位置 ) 。
LEFT 属性控件的 Left 设置。如果为 0 , BuilderDForm 将该控件放在先前一个控件的左边 ( 在 BuilderDB.nLeft 中指定 ) 。
HEIGHT 属性控件的 Height 设置。如果为 0 ,就使用该控件的默认 Height 值。
WIDTH 属性控件的 Width 设置。如果为 0 ,就使用该控件的默认 Width 值。
ROWSRCTYPE 如果类使用的属性控件 ( 在 CLASSNAME 中指定 ) 是一个 combobox ,该 combobox 的 RowSourceType 设置。
ROWSOURCE 如果属性控件是一个 combobox ,该 combobox 的 RowSource 设置。例如,如果 ROWSRCTYPE 是 1 ( 值 ) , ROWSOURCE 将包含一个用于 combobox 的、以逗号分隔的值的列表。
STYLE 如果属性控件是一个 combobox ,该 combobox 的 Style 设置。
VALIDEXPR 一个用于验证属性值的表达式。
READONLY 如果属性控件中只读的则为 .T. 。
UPDONCHNG 如果属性控件的值写到目标对象的属性后被修改,则为 .T. ( 就是说,交互式方式 ) 。
UPDATED 决定记录最后修改 ( 未被 BuilderD 使用,仅是一个信息 ) 。
COMMENT 关于记录的注释 ( 未被 BuilderD 使用 ) 。
USER 用户信息记录 ( 未被 BuilderD 使用 ) 。

[1] [2] [3] [4]  下一页

(评论内容只代表网友观点,与本站立场无关!)[ 全部评论 ]

网友评论:

    用户名:

    评   分:100分 85分 70分 55分 40分 25分 10分 0分

    内 容:

                 (注“”为必填内容。) 验证码: 验证码,看不清楚?请点击刷新验证码

关于本站 - 网站帮助 - 广告合作 - 下载声明 - 友情连接 - 网站地图 -有事点这里