⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 定制vfp向导.txt

📁 Vfp 文档 一些经典编程文章 可供初学者学习编程时使用
💻 TXT
📖 第 1 页 / 共 2 页
字号:
--------------------------------------------------------------------------------
第八节 进一步订制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].' + ;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -