三国志姜维传的意义:VFP 高级教程:VFP 开发技巧
来源:百度文库 编辑:偶看新闻 时间:2024/04/30 01:10:05
本章说明
本章共分十一节。阐述了与VFP工作环境有关的细节问题,其中一至七节为一般描述适用于一般使用者,第八、九两节适用于中、高级开发者,第十节是四个具体的实例,可用于任何应用程序,第十一节是"选项"对话框的说明性表格,是手册性质的资料。
第一节 概述
工作环境规定了 VFP 工作时的某些行为。配置工作环境意味着您可以通过某些方法使 VFP 的行为满足自己的需要 - 必须的或者是某些个人偏好的。
与任何完善的开发工具一样,VFP 也是一个复杂的系统,复杂的一个方面就表现在它具有极大的灵活性 - 同一种工作,由于"环境"的不同,可能会产生不同的效果。
工作环境是个整体的概念,我们使用"环境参数"一词来描述构成工作环境的个体。那么就可以说,工作环境就是由一组环境参数来决定的,配置工作环境就是设置这组环境参数,以满足不同的需求。这显然有两方面的任务,第一、您要知道有那些环境参数,第二、明确怎样配置这些参数。
工作环境涉及到很多方面,例如输入输出、数据处理、开发、调试等等。可以通过分类对所有环境参数进行描述。所有的环境参数都有一个原始的默认值,一般的环境配置工作,事实上只需要修改少量的环境参数即可。
有一个问题需要明确,"VFP 的工作环境"是指 Visual FoxPro 工具的开发环境。另外一种情况,使用 VFP 开发的应用程序,在编译成执行文件后,工作在 VFP 运行时的工作环境下。这两者是有区别的,显而易见的区别是,运行时环境涉及的问题比开发环境少得多,例如开发、调试方面的问题。一般来讲,运行时的环境是开发环境的一个子集,但严格说来这是不对的,二者仍存在一些差别,不仅在环境参数的类别与数量方面,也存在于配置方法上。本文的叙述主要针对开发环境而进行,对二者存在的差别也将被提及。
[dvnews_page=VFP 高级教程:VFP 开发技巧]
第二节 默认的工作环境
VFP 安装完成后,其"内部"保存着对所有环境参数的设置,这些参数可以称做是原始设置。您永远也不能够去修改这些原始设置。但 VFP 提供一种机制允许您每次启动时用自己的设置去覆盖这组原始设置。方法是是使用 Windows注册表及配置文件。
启动时,VFP 首先会检查 Windows注册表中的有关设置,然后据此修改环境参数。然后还会查找一个配置文件,该文件默认的名字为 config.fpw,其中也存放着一些环境配置信息。VFP 将读取这些信息,并再次修改环境参数。如果 VFP 在Windows 注册表中没有找到配置信息或者没有找到配置文件,这没有关系,VFP 将以原始配置进行工作。您甚至可以主动让 VFP 在启动时放弃读取注册表及配置文件。
VFP 不会主动把环境参数写进 Windows注册表中,但它提供了一种方法使您方面地将环境参数写进注册表,写入不仅针对修改过的参数,而是所有参数,您没有去修改的参数值将以原始值写入。配置文件则不同,它只保存您写入的参数,某种意义上,它相当是一份注册表中的环境参数表的勘误。
保存在 Windows注册表中的环境参数以及配置文件中的设置称做"默认工作环境"
第三节 配置文件
先读取注册表再查找配置文件的方法似乎有点复杂,但有些时候需要这样做,例如工作在运行时环境的应用程序,启动时不去读取注册表,这使得配置文件成为必须。另外,配置文件创建于 FoxPro 的早期版本,兼容性使它必须被保留。VFP6 以前的版本在安装时将自动建立一个这样的文件(在安装目录下),而到了 VFP6,系统不再自动建立该文件,需要时由用户自行建立。该文件是一个文本文件,可以使用任何文本编辑器来建立它。
VFP 启动时将按照下列路径查找该文件: 当前工作目录 安装 Visual FoxPro 的目录 DOS 路径中列出的目录 配置文件有默认的名字(config.fpw),"默认"意味着你可以去改变它。这有利于您同时拥有多个配置文件,以便满足不同的需要。指定另外不同于config.fpw名字的配置文件的方法是在启动 VFP 时增加命令行开关项,例如 VFP6.EXE -Cc:\myprg\myconfig.fpw
配置文件中不仅仅存放环境配置信息,例如可以在配置文件中设置 VFP 启动后立即去执行一个程序文件。这使得您可以在配置环境方面使用一种技巧,即将环境设置命令保存在一个程序文件中,然后让 VFP 启动时去执行它。
启动过程也可以通过使用命令行参数来定制,通过定制启动过程,可以得到不同的环境默认设置,以下是对环境配置有影响的一些情况:
开关 描述
-A 忽略默认配置文件以及 Windows注册表设置。
-C 放弃使用配置文件。
-c<文件> 指定默认配置文件 (Config.fpw) 之外的配置文件(必要时包含路径)。
[dvnews_page=VFP 高级教程:VFP 开发技巧]
第四节 更改默认设置
VFP 启动完成后,工作环境被设置成默认状态。您可以即时地更改环境参数,这有几种方法,各种方法可能适合于不同的情况。
交互式修改
在命令窗口输入环境设置命令,执行后该修改会立即生效。绝大部分的环境参数是通过 SET 命令设置的,另外还有一些通过系统变量存储以及极少数的函数设置。在早期的XBASE 工具中,例如dBASEII中,仅有 20 几条 SET 命令,而今天,VFP 中已经有 120 多个 SET 命令了。交互式的修改方法是枯燥的,因此只用于临时性的修改,例如调试等。
程序化执行修改
可以将一组环境设置命令组织成一个程序文件,运行该程序,就相当于在命令窗口一一输入执行了这组命令,有些情况下是需要这样做的,例如在开发环境下同时调试多于一个项目的时候。可以将该环境设置程序存为一个过程或直接写在项目的主文件中。事实上,对于应用程序,因为最终要脱离开发环境运行,所以大部分都是这样做的。
用命令方式读取Windows注册表中的设置
让 Visual FoxPro 再次读取自己的注册表设置,并且使用当前的注册表设置更新自己。 语法为: SYS(3056 [,1]) 说明:包含1选项可以只根据注册表设置进行更新,不包括 SET 命令和文件位置。Visual FoxPro 在 Windows 注册表的选项对话框中保存设置。当Visual FoxPro 启动时,读取这些设置,并利用这些设置进行配置。SYS(3056)可更新包含有文件名和路径的系统变量,而系统变量由SET命令和注册表设置。当您选择设置为默认值时,选项对话框指定的设置写入注册表。其中一些影响Visual FoxPro环境的设置含有SET 命令,例如SET BELL,SET LOCK等。注意 SYS(3056)不更新来自Config.fpw(即 Visual FoxPro 配置文件)的设置。
有关环境设置的命令
有很多环境设置的命令,在本文的附表中,以"选项"对话框中的分类列出了相应的环境设置命令,还有一些命令没有包含在"选项"对话框中,但它们也是关于环境的设置命令,本文仅将它们列出来,具体的意义及语法可参见随机文档。
SET ALTERNATE SET ASSERTS SET AUTOSAVE
SET COLOR OF SCHEME ET COLORS SET SET CONSOLE
SET COVERAGE SET CPCOMPILE SET CURSOR
SET DEBUG SET DEBUGOUT SET DEVICE
SET DISPLAY SET EVENTLIST SET EVENTTRACKING
SET FIXED SET FULLPATH SET FUNCTION
SET MACKEY SET MEMOWIDTH SET NULL
SET NULLDISPLAY SET OLEOBJECT SET PRINTER
SET READBORDER SET SPACE SET STATUS
SET SYSMENU SET TEXTMERGE SET TEXTMERGE DELIMITERS
SET TYPEAHEAD
无论是交互式还是程序化执行命令,其修改都是临时的,只对当前工作有效,VFP 系统关闭后,这种修改不能被保存,下一次运行,如果需要同样的设置,您不得不再一次输入该命令或执行该程序。要想使修改成为永久,必须将修改保存在 Windows注册表中或构建配置文件。
修改注册表
有两种方法:直接修改 Windows注册表或使用 VFP 开发环境提供的"选项卡"对话框。对于直接修改 Windwos 注册表的方法,没有人会建议您这样做,除非您首先对 Windwos 注册表的结构非常熟悉,其次对 VFP 在 Windows 注册表中的各种参数的意义比较了解,第三有某些特殊需要以至于不能使用常规的方法完成。常规的方法,是使用 VFP 的"选项卡"对话框来完成环境配置。
直接修改注册表
VFP 环境设置信息在 Windows注册表的目录如下: HKEY_CURRENT_USER\Software\Microsoft\VisualFoxPro\6.0\Options 主键名称在本文附表中有详细介绍。
使用"选项"对话框
使用"选项卡"对话框来进行系统的配置比直接修改 Windows注册表的方法至少有两个好处,第一,很多配置参数在"选项卡"上是以一种"易于理解的方式"表达的,您只需在某些"问题"前打勾或者在很多答案中选择一个,这就象您填一份表格一样来得轻松。第二,在"选项卡"上进行的配置,一旦完成后,立即生效,而直接修改 Windows 注册表的方法却不是这样,只能是在下一次运行 VFP 时生效。
在开发环境下,执行"工具"菜单中的"选项"菜单项,会出现"选项"对话框。对话框上有12个卡页,分12个方面对环境进行配置。本文附表中详细描述了其中的每一项设置。事实上,真正需要修改的并不多,很多项设置,原始值应该能满足要求。现在的问题是,当你修改完成后,可有两种选择,按"确定"按钮退出对话框,您的修改只会保存在当前环境中,随着系统的关闭而失效;按"设置为默认值"按钮退出对话框,当前的设置将会被写进 Windows注册表从而成为新的默认值。
[dvnews_page=VFP 高级教程:VFP 开发技巧]
第六节 ON命令
ON ERROR 命令
设计得再好的程序,在运行时也不可避免地会发生错误,这些错误可能是程序自身的错误,也可能是系统环境引起的或是用户错误地操作(如错误地移动/删除文件等)引起的等。
因此,程序员有责任编写出可以捕捉错误的程序并尽可能地处理这些错误。要捕捉程序中发生的错误使用 ON ERROR 命令。你可以在 ON ERROR 命令后跟随一个错误处理程序的名字:ON ERROR DO ERRORHANDLER,或者在 ON ERROR 命令后跟随一条赋值语句:ON ERROR glError = .T.。
注意,在程序中全程使用类似于ON ERROR glError = .T.的命令是极不负责任的和令人憎恶的,这有可能会使用程序陷入死循环而使用用户不得不强行退出系统(强行关断电源等),这样做极有可能破坏用户的数据文件。
ON ESCAPE 命令
指定在程序或命令运行过程中,按下 ESC 键时所执行的命令。
语法为:ON ESCAPE [Command]
ON SHUTDOWN 命令
指定当试图退出 Visual FoxPro 时所要执行的命令。
语法为:ON SHUTDOWN [Command]
第七节 一些重要的设置
以下是几乎每一个应用程序都要进行的设置:
_VFP 系统变量
指向当前运行的Visual FoxPro应用程序对象。
语法
_VFP.PropertyName[=eValue]
-或-
_VFP.Method
参数描述
PropertyName 指定应用程序对象的属性。
eValue 指定属性的值。Method指定应用程序对象的方法。
说明
通过_VFP,您可以访问对象集合(Objects collection)。
可设置的属性有:
ActiveForm Application AutoYield
Caption DefaultFilePath Forms
Full NameHeight Left
Name OLERequestPendingTimeout OLEServerBusyRaiseError
OLEServerBusyTimeout Parent StartMode
StatusBar Top Version
Visible Width
SET SAFETY
决定改写已有文件之前是否显示对话框,或者决定当用表设计器或用 ALTER TABLE 命令对表结构进行修改后,是否重新计算表或字段规则、默认值以及错误信息。 语法为:SET SAFETY ON | OFF
SET PROCEDURE TO
设置运行时的命令文件
SET CLASSLIB TO
设置运行时的类库文件
SET MEMOWIDTH TO
指定备注字段和字符表达式的显示宽度。
语法为:SET MEMOWIDTH TO nColumns
SET MULTILOCKS ON
决定能否使用 LOCK ()或 RLOCK () 锁定多个记录。
语法为:SET MULTILOCKS ON | OFF
若要在程序中使用表缓存必须设置SET MULTILOCKS 为 ON。
SET HELP TO
激活或废止 Visual FoxPro 联机帮助或指定的帮助文件。
语法为
SET HELP ON | OFF
- 或者 -
SET HELP TO [FileName]
SET DELETED
指定 Visual FoxPro 是否处理标有删除标记的记录,以及其他命令是否可以操作它们。
语法为:SET DELETED ON | OFF
SET EXCLUSIVE
指定 Visual FoxPro 在网络上以独占方式还是共享方式打开表文件。
语法为:SET EXCLUSIVE ON | OFF
SET NOTIFY
确定是否显示某种系统信息。
语法为:SET NOTIFY ON | OFF
SET BELL
关掉或打开计算机铃声,并设置铃声属性。
语法为:
SET BELL ON | OFF
- 或者 -
SET BELL TO [nFrequency, nDuration | cWAVFileName, nDuration]
SET NEAR
FIND 或 SEEK 查找记录不成功时,确定记录指针停留的位置。
语法为:SET NEAR ON | OFF
SET EXACT
指定比较不同长度两个字符串时,Visual FoxPro 使用的规则。
语法为:SET EXACT ON | OFF
SET CONFIRM
指定是否可以用在文本框中键入最后一个字符的方法退出文本框。
SET ESCAPE
决定是否可以通过按 ESC 键中断程序和命令的运行。
语法为:SET ESCAPE ON | OFF
SET DATE
设置日期格式
语法为:SET DATE [TO] AMERICAN | ANSI | BRITISH | FRENCH | GERMAN | ITALIAN | JAPAN | USA | MDY | DMY | YMD
SET CENTURY
设置是否在日期的年中显示世纪值
语法为:SET CENTURY ON | OFF
ON SHUTDOWN DO
指定当试图退出 Visual FoxPro 时所要执行的命令。
语法为:ON SHUTDOWN [Command]
[dvnews_page=VFP 高级教程:VFP 开发技巧]
第八节 进一步订制VFP的向导和生成器
作为最好的数据库管理系统,VFP 给我们提供了高度的可自定义的交互式的开发环境(interactive development environment IDE)。你可以修改菜单,安装新的生成器和向导,实现开发工具条,修改项目管理器的行为,以及很多其它事来使你的IDE 更高效。这些定制甚至比我们所知道的和喜欢的VFP语言更好,连相对不熟炼的VFP 开发者都可以按他们自己的方法定制开发环境。
本节将配合实际程序示例,向你展示如何建立简单的工具增加你和你的开发组的效率。我们将着眼于修改VFP 的向导和生成器来提供额外的或自定义功能,并使用VFP 6中的BuilderD 技术创建你自己的生成器。
修改VFP 的向导和生成器
如果你象我一样,你可能不常用VFP 的生成器和向导,因为它们不完全能满足你的需要。可能它们不具备足够的灵活性或可能你只是不喜欢他们的工作方式。直到VFP 6以前,没有办法改变生成器和向导的行为,因为Microsoft 没有提供源代码。但是,现在我们不但获得了生成器和向导的源代码,也获得了类浏览器,组件管理器的源代码。
生成器和向导的源代码可以在VFP主目录下的TOOLS\XSOURCE目录中的XSOURCE.ZIP 文件中找到。当你解压该文件时,它建立一个VFPSOURCE 目录,其中包含了所有的源代码。向导的源代码 可以在WIZARDS 目录下找到,生成器的在BUILDERS目录下 (虽然一些WIZARDS目录中的公共文件也被生成器使用)。
因此,现在我们有了源代码,我们可个按我们的需要来修改生成器和向导,对吗? 好了,一个较好的办法是建立新的生成器和向导时,使用源代码中的大多数类和程序,但以派生子类并复制和修改PRGs 或建立封装PRGs的方法来忽略他们原有的行为。本文将详细说明如何对各生成器和向导这样做。
一但你建立了你自己的生成器和向导,怎样告诉VFP 使用你的而不是原来的吗? 生成器是注册在BUILDER.DBF 且向导是在WIZARD.DBF中,两个表都在VFP主目录下的WIZARDS 子目录中。这些表具有相同的结构,如下表所示。
字段 描述
NAME 生成器或向导描述名。
DESCRIPT 生成器或向导的说明。
BITMAP 未使用。
TYPE 生成器或向导是对哪一对象类型的。在BUILDER.DBF情况下,它一般是一个对象的基类(虽然已有以MULTISELECT,AUTOFORMAT和RI 字段)。对于WIZARDS.DBF,它可能是FORM,REPORT,和 QUERY。
PROGRAM 包含生成器和向导的APP 文件名。
CLASSLIB APP文件中要实例的类。
CLASSNAME APP文件中的主要类的类库。
PARMS 传递到生成器或向导的参数。
表 1. BUILDER.DBF 和 WIZARD.DBF的结构
当你调用一个生成器时,VFP 调用_BUILDER 系统变量中指定的程序 (默认是BUILDER.APP)。BUILDER.APP 查看它所在的环境 (例如,生成器是被那一个对象调用),在BUILDER.DBF 表中查找与环境匹配的记录 (例如,在TYPE 字段中查找对象的基类),并调用注册后的生成器。除系统变量_WIZARD外,向导也是以相同的方法处理,_WIZARD是用于指向可在WIZARD.DBF找到的WIZARD.APP。
要告诉VFP 使用一个不同的生成器或向导,插入一条说明如何运行你的生成器或向导的新记录到BUILDER.DBF或 WIZARD.DBF表中。如果你想在运行新的向导或生成器的同时也可以选择运行原有的生成器或向导,在WIZARD.DBF表中保留原有的生成器或向导记录。如果你想替换原有的,简单的修改它的TYPE值为另外的值(我使用一个"X"前缀,如 "XGRID"),而不是删除该记录;
使用该方法,你可以简单的以恢复TYPE 的值来恢复使用原来的生成器或向导。 我们将考查创建一个Grid 生成器的替代物,参照完整性生成器,Upsizing 向导,和WWW 搜索页向导。
创建更有用的Grid 生成器
VFP Grid 生成器提供了一种快速方法来整合grid 的列并建立你所希望的视觉外观。但是,关于该生成器,有我所不喜欢的一些东西: 它不会自动调整列的宽度。必须自己调整列的宽度以适应数据宽度的需要。 在生成器的外观页面中的控件类型组合框只列出了已存在于列中的VFP 基类和类; 没有办法添加你自己的类到该列表中。 它创建的列和列头是VFP 的基类。你也许想用你自己的类替代它(必须是以编程的方式定义的),例如,单击一个列头而按该列排序。
要建立一个VFP Grid 生成器的替代物,首先建立了SFGRIDBLDR 项目(它在你解压该文档所附的示例程序时建立的GRID 子目录中) 并添加以下文件: BUILDER.VCX (在VFP 向导源目录中的BUILDERS\BUILDERS 子目录中),GRIDBLDR.VCX (在 BUILDERS\GRIDBLDR 目录中),THERM.VCX,WIZCTRL.VCX,WIZMOVER.VCX (所有都在WIZARDS\WZCOMMON目录中),DUMMY.PRG,和 WBGRID.PRG (在BUILDERS目录中)。我如何知道要添加那些文件到项目中呢? 这很简单:只需要查看GRIDBLDR 项目的内容。
其次,派生GridBuilder 类到SFGridBuilder (在 SFGRIDBLDR.VCX类库中) 并复盖ResetColumns 方法,该方法用于调整选定列的宽度到适当的大小 (我只实现了该想法,未实现上述列表中的其它两个)。该方法的代码在下面列出。这里要注意两个有趣的东西。首先,我希望写很多复杂的代码,根据字段宽度、字体和字号来计算出列的宽度,等等。有趣的是,它放弃了生成器中已存在的任务的方法 (SetColWidth),而只是传递字段宽度到该方法中,生成器传给它一个不同的值。其它事情是分配到loColumn。Width 的计算宽度被注释了。理由是我还没有调试好,改变列宽后,当生成器关闭时,会造成问题,所以我把列宽设置为,列宽是保存在wbaCols中。(如果你需要,wbaCols 是一个公共数组。我没有创建生成器,因此不要责怪我采用这种方式)
因此,效果是当一个字段添加网格中时,它没有立即获得适当的列宽,但是一但你执行了一些其它操作 (添加另一个字段,转到生成器的另一个页面中,关闭生成器等等。)它就会取得适当的列宽。
local lnRows, ;
lnI, ;
lcField, ;
loColumn, ;
lcHeader, ;
loHeader
dodefault()
lnRows = alen(wbaCols, 1)
for lnI = 1 to lnRows
lcField = wbaCols[lnI, 2]
if not empty(lcField)
loColumn = evaluate('wbaControl[1].' + ;
wbaCols[lnI, 7])
wbaCols[lnI, 1] = This.SetColWidth(fsize(lcField), ;
loColumn)
* loColumn.Width = wbaCols[lnI, 1]
endif not empty(lcField)
next lnI
最后我为我的生成器建立了GRIDMAIN.PRG (使用了BUILDERS\GRIDBLDR 中的GRIDMAIN.PRG 的办法) 并使它成为项目的主文件。该程序用SET CLASSLIB命令添加SFGRIDBLDR.VCX 到打开的类库中,这样它可以找到我们的SFGridBuilder 类。GRIDMAIN 也自动注册它自己到VFP BUILDER 表中(如果是直接运行该APP 文件)。
要查看该生成器的行为,建立并运行SFGRIDBLDR.APP 来作为grids生成器注册它。如果你在运行该APP后,观察观查BUILDER.DBF,你会发现它是"未注册的" ,原始的grid 生成器的 TYPE 字段由"GRID" 改成了"XGRID" 并在它后面为它自己添加了一条TYPE 字段为"GRID"的新记录。下一步,新建一个表单,拖动grid 到表单中,并调用生成器。新的生成器看起来与原来的没有任何区别,但是当你添加字段到表格时,你会发现字段宽度自动调整到了适当大小。
创建一个更好的参照完整性生成器
我有一小点关于VFP自身的参照完整性(RI)生成器的问题: 当你单击确认按钮来保存修改后的RI 时,它两次(而不是一次)让你确认。不是我太自信,但是我相信取消按钮的用途是允许我们返回; 我单击确认按钮因为它是确认,因此我不需要一条 "你真的,真的确认你要这样做吗" 的确认对话框。 在你压缩数据库前,你不能运行RI 生成器。 我确实砂需要它备份我的当前的储存过程为一个叫做RISP.OLD的我总是要自己删除它的文件。 生成的代码中至少有一处BUG ,应该用正确的功能来防止它。关于该BUG的细节,参见"VFP中的错误处理一文"。 它生成的代码既多又缺少注释。要试着理解这些代码是做什么的是一个艰苦的过程,而且如果是在一个复杂的数据库中,RI 代码可能超过VFP 编译后的代码的64K 限制。如果你看过Jim Booth 和 Steve Sawyer写的 "Visual FoxPro 6.0应用程序开发的有效技术" 一书,你会有一个较好的快速,简洁的子程序来维护RI。Steve的 NEWRI 子程序是数据驱动的,因此它是在运行时而不是在生成时检查哪些规则需要强制执行。结果是清楚的,紧密而不是VFP RI生成器生成的大实用的代码。 它所支持的规则仅是忽略、级联和限制。你所需要的其它选项又怎样呢,例如无效(设置子表的外部关键字为.NULL.) 或指定一个新值 (设置外部关键字为的默认值)?
修正这些项相对容易些,因为我们有RI 生成器的源代码。我建立了SFRIBUILDR.APP,一个 VFP RIBUILDR.APP的替换物。我没有实现附加的规则 (上面提及的最后一项) 但是我处理了其它的所有项。我首先建立了SFRIBUILDR 项目(它在解压后的程序的主目录下的RI 目录中) 并添加了VFP的RIBUILDR.VCX(在VFP向导源程序所在目录下的BUILDERS\RIBUILDR 目录中)。
接着,我派生VFP RI生成器类到 SFRIBUILDR.VCX 类库中的SFRIBuildr。我忽视(overrode)了Load 方法以便在数据库中有被删除的记录时不会发生错误 (你可以参见我注释的已存在的代码)。我忽视了确认按钮的Click 方法,以便不出现确认对话框和不复制当前的储存过程到RISP.OLD中,并修复了生成的代码中的错误。同时,如果它检查到NEWRI.PRG 存在于你的系统中 (与SFRIBUILR.APP在同一目录),它会把该代码放入数据库的储存代码中而不会生成其它代码。这个修改需要一个新的方法 RIMakeNewTr用一个不同的名字建立触发器(__RI_Handler) 而不是原来的RI 生成器的生成的(__RI__,如__RI_Delete_Customer)。因为这些方法中有大量的代码,在这里就不写出来了; 但是,如果你查看提供的源代码,你会看见我确实只注释了很少的代码行,并添加了很少的代码。,因为名字在在 SQL Server中是不重要的。 可用的表的列表框滑有排序; 表出现的顺序是它们在DBC中的顺序。在一个拥有上百个表的DBC中,要找到一个特定的表是件痛苦的事。Jim 设置了SuperMover 对象的SortLeft 属性(用于指明左边的列表框是否需要排序) 为 .T. 向导可以为DBC中的每一个表,用相同和定义建立一个远程视图。但是,但是它命名视图与原表同名,并重命名表为一个唯一名。由于有些人喜欢对视图使用命名约定(例如,在原表名前加上一个"V"),Jim 修改了向导中的这一点。 Jim 修复了一个问题:向导有时会重新排列字段复合索引的顺序。 VFP 数值型字段类型升迁为浮点型,即使 SQL Server 中有数值型数据类型也一样。这致使VFP中多于两位小数的数值型字段被截短,并且 VFP 数值字段没有小数点的会升迁为两位小数。
本章共分十一节。阐述了与VFP工作环境有关的细节问题,其中一至七节为一般描述适用于一般使用者,第八、九两节适用于中、高级开发者,第十节是四个具体的实例,可用于任何应用程序,第十一节是"选项"对话框的说明性表格,是手册性质的资料。
第一节 概述
工作环境规定了 VFP 工作时的某些行为。配置工作环境意味着您可以通过某些方法使 VFP 的行为满足自己的需要 - 必须的或者是某些个人偏好的。
与任何完善的开发工具一样,VFP 也是一个复杂的系统,复杂的一个方面就表现在它具有极大的灵活性 - 同一种工作,由于"环境"的不同,可能会产生不同的效果。
工作环境是个整体的概念,我们使用"环境参数"一词来描述构成工作环境的个体。那么就可以说,工作环境就是由一组环境参数来决定的,配置工作环境就是设置这组环境参数,以满足不同的需求。这显然有两方面的任务,第一、您要知道有那些环境参数,第二、明确怎样配置这些参数。
工作环境涉及到很多方面,例如输入输出、数据处理、开发、调试等等。可以通过分类对所有环境参数进行描述。所有的环境参数都有一个原始的默认值,一般的环境配置工作,事实上只需要修改少量的环境参数即可。
有一个问题需要明确,"VFP 的工作环境"是指 Visual FoxPro 工具的开发环境。另外一种情况,使用 VFP 开发的应用程序,在编译成执行文件后,工作在 VFP 运行时的工作环境下。这两者是有区别的,显而易见的区别是,运行时环境涉及的问题比开发环境少得多,例如开发、调试方面的问题。一般来讲,运行时的环境是开发环境的一个子集,但严格说来这是不对的,二者仍存在一些差别,不仅在环境参数的类别与数量方面,也存在于配置方法上。本文的叙述主要针对开发环境而进行,对二者存在的差别也将被提及。
[dvnews_page=VFP 高级教程:VFP 开发技巧]
第二节 默认的工作环境
VFP 安装完成后,其"内部"保存着对所有环境参数的设置,这些参数可以称做是原始设置。您永远也不能够去修改这些原始设置。但 VFP 提供一种机制允许您每次启动时用自己的设置去覆盖这组原始设置。方法是是使用 Windows注册表及配置文件。
启动时,VFP 首先会检查 Windows注册表中的有关设置,然后据此修改环境参数。然后还会查找一个配置文件,该文件默认的名字为 config.fpw,其中也存放着一些环境配置信息。VFP 将读取这些信息,并再次修改环境参数。如果 VFP 在Windows 注册表中没有找到配置信息或者没有找到配置文件,这没有关系,VFP 将以原始配置进行工作。您甚至可以主动让 VFP 在启动时放弃读取注册表及配置文件。
VFP 不会主动把环境参数写进 Windows注册表中,但它提供了一种方法使您方面地将环境参数写进注册表,写入不仅针对修改过的参数,而是所有参数,您没有去修改的参数值将以原始值写入。配置文件则不同,它只保存您写入的参数,某种意义上,它相当是一份注册表中的环境参数表的勘误。
保存在 Windows注册表中的环境参数以及配置文件中的设置称做"默认工作环境"
第三节 配置文件
先读取注册表再查找配置文件的方法似乎有点复杂,但有些时候需要这样做,例如工作在运行时环境的应用程序,启动时不去读取注册表,这使得配置文件成为必须。另外,配置文件创建于 FoxPro 的早期版本,兼容性使它必须被保留。VFP6 以前的版本在安装时将自动建立一个这样的文件(在安装目录下),而到了 VFP6,系统不再自动建立该文件,需要时由用户自行建立。该文件是一个文本文件,可以使用任何文本编辑器来建立它。
VFP 启动时将按照下列路径查找该文件: 当前工作目录 安装 Visual FoxPro 的目录 DOS 路径中列出的目录 配置文件有默认的名字(config.fpw),"默认"意味着你可以去改变它。这有利于您同时拥有多个配置文件,以便满足不同的需要。指定另外不同于config.fpw名字的配置文件的方法是在启动 VFP 时增加命令行开关项,例如 VFP6.EXE -Cc:\myprg\myconfig.fpw
配置文件中不仅仅存放环境配置信息,例如可以在配置文件中设置 VFP 启动后立即去执行一个程序文件。这使得您可以在配置环境方面使用一种技巧,即将环境设置命令保存在一个程序文件中,然后让 VFP 启动时去执行它。
启动过程也可以通过使用命令行参数来定制,通过定制启动过程,可以得到不同的环境默认设置,以下是对环境配置有影响的一些情况:
开关 描述
-A 忽略默认配置文件以及 Windows注册表设置。
-C 放弃使用配置文件。
-c<文件> 指定默认配置文件 (Config.fpw) 之外的配置文件(必要时包含路径)。
[dvnews_page=VFP 高级教程:VFP 开发技巧]
第四节 更改默认设置
VFP 启动完成后,工作环境被设置成默认状态。您可以即时地更改环境参数,这有几种方法,各种方法可能适合于不同的情况。
交互式修改
在命令窗口输入环境设置命令,执行后该修改会立即生效。绝大部分的环境参数是通过 SET 命令设置的,另外还有一些通过系统变量存储以及极少数的函数设置。在早期的XBASE 工具中,例如dBASEII中,仅有 20 几条 SET 命令,而今天,VFP 中已经有 120 多个 SET 命令了。交互式的修改方法是枯燥的,因此只用于临时性的修改,例如调试等。
程序化执行修改
可以将一组环境设置命令组织成一个程序文件,运行该程序,就相当于在命令窗口一一输入执行了这组命令,有些情况下是需要这样做的,例如在开发环境下同时调试多于一个项目的时候。可以将该环境设置程序存为一个过程或直接写在项目的主文件中。事实上,对于应用程序,因为最终要脱离开发环境运行,所以大部分都是这样做的。
用命令方式读取Windows注册表中的设置
让 Visual FoxPro 再次读取自己的注册表设置,并且使用当前的注册表设置更新自己。 语法为: SYS(3056 [,1]) 说明:包含1选项可以只根据注册表设置进行更新,不包括 SET 命令和文件位置。Visual FoxPro 在 Windows 注册表的选项对话框中保存设置。当Visual FoxPro 启动时,读取这些设置,并利用这些设置进行配置。SYS(3056)可更新包含有文件名和路径的系统变量,而系统变量由SET命令和注册表设置。当您选择设置为默认值时,选项对话框指定的设置写入注册表。其中一些影响Visual FoxPro环境的设置含有SET 命令,例如SET BELL,SET LOCK等。注意 SYS(3056)不更新来自Config.fpw(即 Visual FoxPro 配置文件)的设置。
有关环境设置的命令
有很多环境设置的命令,在本文的附表中,以"选项"对话框中的分类列出了相应的环境设置命令,还有一些命令没有包含在"选项"对话框中,但它们也是关于环境的设置命令,本文仅将它们列出来,具体的意义及语法可参见随机文档。
SET ALTERNATE SET ASSERTS SET AUTOSAVE
SET COLOR OF SCHEME ET COLORS SET SET CONSOLE
SET COVERAGE SET CPCOMPILE SET CURSOR
SET DEBUG SET DEBUGOUT SET DEVICE
SET DISPLAY SET EVENTLIST SET EVENTTRACKING
SET FIXED SET FULLPATH SET FUNCTION
SET MACKEY SET MEMOWIDTH SET NULL
SET NULLDISPLAY SET OLEOBJECT SET PRINTER
SET READBORDER SET SPACE SET STATUS
SET SYSMENU SET TEXTMERGE SET TEXTMERGE DELIMITERS
SET TYPEAHEAD
无论是交互式还是程序化执行命令,其修改都是临时的,只对当前工作有效,VFP 系统关闭后,这种修改不能被保存,下一次运行,如果需要同样的设置,您不得不再一次输入该命令或执行该程序。要想使修改成为永久,必须将修改保存在 Windows注册表中或构建配置文件。
修改注册表
有两种方法:直接修改 Windows注册表或使用 VFP 开发环境提供的"选项卡"对话框。对于直接修改 Windwos 注册表的方法,没有人会建议您这样做,除非您首先对 Windwos 注册表的结构非常熟悉,其次对 VFP 在 Windows 注册表中的各种参数的意义比较了解,第三有某些特殊需要以至于不能使用常规的方法完成。常规的方法,是使用 VFP 的"选项卡"对话框来完成环境配置。
直接修改注册表
VFP 环境设置信息在 Windows注册表的目录如下: HKEY_CURRENT_USER\Software\Microsoft\VisualFoxPro\6.0\Options 主键名称在本文附表中有详细介绍。
使用"选项"对话框
使用"选项卡"对话框来进行系统的配置比直接修改 Windows注册表的方法至少有两个好处,第一,很多配置参数在"选项卡"上是以一种"易于理解的方式"表达的,您只需在某些"问题"前打勾或者在很多答案中选择一个,这就象您填一份表格一样来得轻松。第二,在"选项卡"上进行的配置,一旦完成后,立即生效,而直接修改 Windows 注册表的方法却不是这样,只能是在下一次运行 VFP 时生效。
在开发环境下,执行"工具"菜单中的"选项"菜单项,会出现"选项"对话框。对话框上有12个卡页,分12个方面对环境进行配置。本文附表中详细描述了其中的每一项设置。事实上,真正需要修改的并不多,很多项设置,原始值应该能满足要求。现在的问题是,当你修改完成后,可有两种选择,按"确定"按钮退出对话框,您的修改只会保存在当前环境中,随着系统的关闭而失效;按"设置为默认值"按钮退出对话框,当前的设置将会被写进 Windows注册表从而成为新的默认值。
[dvnews_page=VFP 高级教程:VFP 开发技巧]
第六节 ON命令
ON ERROR 命令
设计得再好的程序,在运行时也不可避免地会发生错误,这些错误可能是程序自身的错误,也可能是系统环境引起的或是用户错误地操作(如错误地移动/删除文件等)引起的等。
因此,程序员有责任编写出可以捕捉错误的程序并尽可能地处理这些错误。要捕捉程序中发生的错误使用 ON ERROR 命令。你可以在 ON ERROR 命令后跟随一个错误处理程序的名字:ON ERROR DO ERRORHANDLER,或者在 ON ERROR 命令后跟随一条赋值语句:ON ERROR glError = .T.。
注意,在程序中全程使用类似于ON ERROR glError = .T.的命令是极不负责任的和令人憎恶的,这有可能会使用程序陷入死循环而使用用户不得不强行退出系统(强行关断电源等),这样做极有可能破坏用户的数据文件。
ON ESCAPE 命令
指定在程序或命令运行过程中,按下 ESC 键时所执行的命令。
语法为:ON ESCAPE [Command]
ON SHUTDOWN 命令
指定当试图退出 Visual FoxPro 时所要执行的命令。
语法为:ON SHUTDOWN [Command]
第七节 一些重要的设置
以下是几乎每一个应用程序都要进行的设置:
_VFP 系统变量
指向当前运行的Visual FoxPro应用程序对象。
语法
_VFP.PropertyName[=eValue]
-或-
_VFP.Method
参数描述
PropertyName 指定应用程序对象的属性。
eValue 指定属性的值。Method指定应用程序对象的方法。
说明
通过_VFP,您可以访问对象集合(Objects collection)。
可设置的属性有:
ActiveForm Application AutoYield
Caption DefaultFilePath Forms
Full NameHeight Left
Name OLERequestPendingTimeout OLEServerBusyRaiseError
OLEServerBusyTimeout Parent StartMode
StatusBar Top Version
Visible Width
SET SAFETY
决定改写已有文件之前是否显示对话框,或者决定当用表设计器或用 ALTER TABLE 命令对表结构进行修改后,是否重新计算表或字段规则、默认值以及错误信息。 语法为:SET SAFETY ON | OFF
SET PROCEDURE TO
设置运行时的命令文件
SET CLASSLIB TO
设置运行时的类库文件
SET MEMOWIDTH TO
指定备注字段和字符表达式的显示宽度。
语法为:SET MEMOWIDTH TO nColumns
SET MULTILOCKS ON
决定能否使用 LOCK ()或 RLOCK () 锁定多个记录。
语法为:SET MULTILOCKS ON | OFF
若要在程序中使用表缓存必须设置SET MULTILOCKS 为 ON。
SET HELP TO
激活或废止 Visual FoxPro 联机帮助或指定的帮助文件。
语法为
SET HELP ON | OFF
- 或者 -
SET HELP TO [FileName]
SET DELETED
指定 Visual FoxPro 是否处理标有删除标记的记录,以及其他命令是否可以操作它们。
语法为:SET DELETED ON | OFF
SET EXCLUSIVE
指定 Visual FoxPro 在网络上以独占方式还是共享方式打开表文件。
语法为:SET EXCLUSIVE ON | OFF
SET NOTIFY
确定是否显示某种系统信息。
语法为:SET NOTIFY ON | OFF
SET BELL
关掉或打开计算机铃声,并设置铃声属性。
语法为:
SET BELL ON | OFF
- 或者 -
SET BELL TO [nFrequency, nDuration | cWAVFileName, nDuration]
SET NEAR
FIND 或 SEEK 查找记录不成功时,确定记录指针停留的位置。
语法为:SET NEAR ON | OFF
SET EXACT
指定比较不同长度两个字符串时,Visual FoxPro 使用的规则。
语法为:SET EXACT ON | OFF
SET CONFIRM
指定是否可以用在文本框中键入最后一个字符的方法退出文本框。
SET ESCAPE
决定是否可以通过按 ESC 键中断程序和命令的运行。
语法为:SET ESCAPE ON | OFF
SET DATE
设置日期格式
语法为:SET DATE [TO] AMERICAN | ANSI | BRITISH | FRENCH | GERMAN | ITALIAN | JAPAN | USA | MDY | DMY | YMD
SET CENTURY
设置是否在日期的年中显示世纪值
语法为:SET CENTURY ON | OFF
ON SHUTDOWN DO
指定当试图退出 Visual FoxPro 时所要执行的命令。
语法为:ON SHUTDOWN [Command]
[dvnews_page=VFP 高级教程:VFP 开发技巧]
第八节 进一步订制VFP的向导和生成器
作为最好的数据库管理系统,VFP 给我们提供了高度的可自定义的交互式的开发环境(interactive development environment IDE)。你可以修改菜单,安装新的生成器和向导,实现开发工具条,修改项目管理器的行为,以及很多其它事来使你的IDE 更高效。这些定制甚至比我们所知道的和喜欢的VFP语言更好,连相对不熟炼的VFP 开发者都可以按他们自己的方法定制开发环境。
本节将配合实际程序示例,向你展示如何建立简单的工具增加你和你的开发组的效率。我们将着眼于修改VFP 的向导和生成器来提供额外的或自定义功能,并使用VFP 6中的BuilderD 技术创建你自己的生成器。
修改VFP 的向导和生成器
如果你象我一样,你可能不常用VFP 的生成器和向导,因为它们不完全能满足你的需要。可能它们不具备足够的灵活性或可能你只是不喜欢他们的工作方式。直到VFP 6以前,没有办法改变生成器和向导的行为,因为Microsoft 没有提供源代码。但是,现在我们不但获得了生成器和向导的源代码,也获得了类浏览器,组件管理器的源代码。
生成器和向导的源代码可以在VFP主目录下的TOOLS\XSOURCE目录中的XSOURCE.ZIP 文件中找到。当你解压该文件时,它建立一个VFPSOURCE 目录,其中包含了所有的源代码。向导的源代码 可以在WIZARDS 目录下找到,生成器的在BUILDERS目录下 (虽然一些WIZARDS目录中的公共文件也被生成器使用)。
因此,现在我们有了源代码,我们可个按我们的需要来修改生成器和向导,对吗? 好了,一个较好的办法是建立新的生成器和向导时,使用源代码中的大多数类和程序,但以派生子类并复制和修改PRGs 或建立封装PRGs的方法来忽略他们原有的行为。本文将详细说明如何对各生成器和向导这样做。
一但你建立了你自己的生成器和向导,怎样告诉VFP 使用你的而不是原来的吗? 生成器是注册在BUILDER.DBF 且向导是在WIZARD.DBF中,两个表都在VFP主目录下的WIZARDS 子目录中。这些表具有相同的结构,如下表所示。
字段 描述
NAME 生成器或向导描述名。
DESCRIPT 生成器或向导的说明。
BITMAP 未使用。
TYPE 生成器或向导是对哪一对象类型的。在BUILDER.DBF情况下,它一般是一个对象的基类(虽然已有以MULTISELECT,AUTOFORMAT和RI 字段)。对于WIZARDS.DBF,它可能是FORM,REPORT,和 QUERY。
PROGRAM 包含生成器和向导的APP 文件名。
CLASSLIB APP文件中要实例的类。
CLASSNAME APP文件中的主要类的类库。
PARMS 传递到生成器或向导的参数。
表 1. BUILDER.DBF 和 WIZARD.DBF的结构
当你调用一个生成器时,VFP 调用_BUILDER 系统变量中指定的程序 (默认是BUILDER.APP)。BUILDER.APP 查看它所在的环境 (例如,生成器是被那一个对象调用),在BUILDER.DBF 表中查找与环境匹配的记录 (例如,在TYPE 字段中查找对象的基类),并调用注册后的生成器。除系统变量_WIZARD外,向导也是以相同的方法处理,_WIZARD是用于指向可在WIZARD.DBF找到的WIZARD.APP。
要告诉VFP 使用一个不同的生成器或向导,插入一条说明如何运行你的生成器或向导的新记录到BUILDER.DBF或 WIZARD.DBF表中。如果你想在运行新的向导或生成器的同时也可以选择运行原有的生成器或向导,在WIZARD.DBF表中保留原有的生成器或向导记录。如果你想替换原有的,简单的修改它的TYPE值为另外的值(我使用一个"X"前缀,如 "XGRID"),而不是删除该记录;
使用该方法,你可以简单的以恢复TYPE 的值来恢复使用原来的生成器或向导。 我们将考查创建一个Grid 生成器的替代物,参照完整性生成器,Upsizing 向导,和WWW 搜索页向导。
创建更有用的Grid 生成器
VFP Grid 生成器提供了一种快速方法来整合grid 的列并建立你所希望的视觉外观。但是,关于该生成器,有我所不喜欢的一些东西: 它不会自动调整列的宽度。必须自己调整列的宽度以适应数据宽度的需要。 在生成器的外观页面中的控件类型组合框只列出了已存在于列中的VFP 基类和类; 没有办法添加你自己的类到该列表中。 它创建的列和列头是VFP 的基类。你也许想用你自己的类替代它(必须是以编程的方式定义的),例如,单击一个列头而按该列排序。
要建立一个VFP Grid 生成器的替代物,首先建立了SFGRIDBLDR 项目(它在你解压该文档所附的示例程序时建立的GRID 子目录中) 并添加以下文件: BUILDER.VCX (在VFP 向导源目录中的BUILDERS\BUILDERS 子目录中),GRIDBLDR.VCX (在 BUILDERS\GRIDBLDR 目录中),THERM.VCX,WIZCTRL.VCX,WIZMOVER.VCX (所有都在WIZARDS\WZCOMMON目录中),DUMMY.PRG,和 WBGRID.PRG (在BUILDERS目录中)。我如何知道要添加那些文件到项目中呢? 这很简单:只需要查看GRIDBLDR 项目的内容。
其次,派生GridBuilder 类到SFGridBuilder (在 SFGRIDBLDR.VCX类库中) 并复盖ResetColumns 方法,该方法用于调整选定列的宽度到适当的大小 (我只实现了该想法,未实现上述列表中的其它两个)。该方法的代码在下面列出。这里要注意两个有趣的东西。首先,我希望写很多复杂的代码,根据字段宽度、字体和字号来计算出列的宽度,等等。有趣的是,它放弃了生成器中已存在的任务的方法 (SetColWidth),而只是传递字段宽度到该方法中,生成器传给它一个不同的值。其它事情是分配到loColumn。Width 的计算宽度被注释了。理由是我还没有调试好,改变列宽后,当生成器关闭时,会造成问题,所以我把列宽设置为,列宽是保存在wbaCols中。(如果你需要,wbaCols 是一个公共数组。我没有创建生成器,因此不要责怪我采用这种方式)
因此,效果是当一个字段添加网格中时,它没有立即获得适当的列宽,但是一但你执行了一些其它操作 (添加另一个字段,转到生成器的另一个页面中,关闭生成器等等。)它就会取得适当的列宽。
local lnRows, ;
lnI, ;
lcField, ;
loColumn, ;
lcHeader, ;
loHeader
dodefault()
lnRows = alen(wbaCols, 1)
for lnI = 1 to lnRows
lcField = wbaCols[lnI, 2]
if not empty(lcField)
loColumn = evaluate('wbaControl[1].' + ;
wbaCols[lnI, 7])
wbaCols[lnI, 1] = This.SetColWidth(fsize(lcField), ;
loColumn)
* loColumn.Width = wbaCols[lnI, 1]
endif not empty(lcField)
next lnI
最后我为我的生成器建立了GRIDMAIN.PRG (使用了BUILDERS\GRIDBLDR 中的GRIDMAIN.PRG 的办法) 并使它成为项目的主文件。该程序用SET CLASSLIB命令添加SFGRIDBLDR.VCX 到打开的类库中,这样它可以找到我们的SFGridBuilder 类。GRIDMAIN 也自动注册它自己到VFP BUILDER 表中(如果是直接运行该APP 文件)。
要查看该生成器的行为,建立并运行SFGRIDBLDR.APP 来作为grids生成器注册它。如果你在运行该APP后,观察观查BUILDER.DBF,你会发现它是"未注册的" ,原始的grid 生成器的 TYPE 字段由"GRID" 改成了"XGRID" 并在它后面为它自己添加了一条TYPE 字段为"GRID"的新记录。下一步,新建一个表单,拖动grid 到表单中,并调用生成器。新的生成器看起来与原来的没有任何区别,但是当你添加字段到表格时,你会发现字段宽度自动调整到了适当大小。
创建一个更好的参照完整性生成器
我有一小点关于VFP自身的参照完整性(RI)生成器的问题: 当你单击确认按钮来保存修改后的RI 时,它两次(而不是一次)让你确认。不是我太自信,但是我相信取消按钮的用途是允许我们返回; 我单击确认按钮因为它是确认,因此我不需要一条 "你真的,真的确认你要这样做吗" 的确认对话框。 在你压缩数据库前,你不能运行RI 生成器。 我确实砂需要它备份我的当前的储存过程为一个叫做RISP.OLD的我总是要自己删除它的文件。 生成的代码中至少有一处BUG ,应该用正确的功能来防止它。关于该BUG的细节,参见"VFP中的错误处理一文"。 它生成的代码既多又缺少注释。要试着理解这些代码是做什么的是一个艰苦的过程,而且如果是在一个复杂的数据库中,RI 代码可能超过VFP 编译后的代码的64K 限制。如果你看过Jim Booth 和 Steve Sawyer写的 "Visual FoxPro 6.0应用程序开发的有效技术" 一书,你会有一个较好的快速,简洁的子程序来维护RI。Steve的 NEWRI 子程序是数据驱动的,因此它是在运行时而不是在生成时检查哪些规则需要强制执行。结果是清楚的,紧密而不是VFP RI生成器生成的大实用的代码。 它所支持的规则仅是忽略、级联和限制。你所需要的其它选项又怎样呢,例如无效(设置子表的外部关键字为.NULL.) 或指定一个新值 (设置外部关键字为的默认值)?
修正这些项相对容易些,因为我们有RI 生成器的源代码。我建立了SFRIBUILDR.APP,一个 VFP RIBUILDR.APP的替换物。我没有实现附加的规则 (上面提及的最后一项) 但是我处理了其它的所有项。我首先建立了SFRIBUILDR 项目(它在解压后的程序的主目录下的RI 目录中) 并添加了VFP的RIBUILDR.VCX(在VFP向导源程序所在目录下的BUILDERS\RIBUILDR 目录中)。
接着,我派生VFP RI生成器类到 SFRIBUILDR.VCX 类库中的SFRIBuildr。我忽视(overrode)了Load 方法以便在数据库中有被删除的记录时不会发生错误 (你可以参见我注释的已存在的代码)。我忽视了确认按钮的Click 方法,以便不出现确认对话框和不复制当前的储存过程到RISP.OLD中,并修复了生成的代码中的错误。同时,如果它检查到NEWRI.PRG 存在于你的系统中 (与SFRIBUILR.APP在同一目录),它会把该代码放入数据库的储存代码中而不会生成其它代码。这个修改需要一个新的方法 RIMakeNewTr用一个不同的名字建立触发器(__RI_Handler) 而不是原来的RI 生成器的生成的(__RI_