VFP9的10件酷事DavidStevenson著RMH译这是FOXTALK杂志6月刊提供的一篇免费文章,我们把她翻译出来,更多的译文资料在:一样,VFP9的许多改进建议也是来自全球的各个VFP社区。(大大小小的建议,很难知道是谁提出了这些好建议)。不过尽管改进很多,我们也必须承认,VFP的很多方面还没被照顾到。总的看来,VFP9带给我们的是:修补了很多BUG;弥补了一些功能的缺陷或实现了过去曾提出过的一些设想;某些功能被重写发生了翻天覆地的变化……当然,你所渴望的某些功能或许在或许不在这个版本里面,但可以确定你能从那个“What'sNew”文档中发现一些有价值的东西。记住,尝试测试版总要带点探险精神的。我写这篇文章的时候,是在VFP测试版发布前的几个星期,VFP文档有些地方跟不上VFP软件的更新,这就意味着你拿到的测试版拷贝会和文档有些出入,所以很自然,尝试测试版软件总要带点探险精神的,呵呵。正式的官方文档还在继续完善,不过其中“What'sNew”的一部分现在已经展现在我面前了。花了4页纸用以赤裸裸地展示了数据增强部分,IDE增强用了2页,语言增强用了10页等等……实际上提供给官方内部测试者的版本声明和开发文档有1英寸多厚,就这还不包括新的报表设计部分!报表设计器焕然一新。与报表编辑器的大幅度改动相比,其它所有的改进和新功能都变得黯然失色。尽管保持了向后兼容,VFP开发组还是从底层完全重写了VFP的报表编辑器,给了它一个新的引擎,该引擎能够让你从外部用自己的代码来与它提供的GDI+表现界面进行交互,并为你自己的代码提供了钩子(hook)。按照VFP惯例,几个以下划线开头的系统变量将粉墨登场(_ReportBuilder,_ReportOutput,和_ReportPreview),这些都是外挂的报表模块,你可以用自己的模块来代替他们。你还可以使用一个名叫“ReportListener”的基类,可以直接使用它,可以在预览/打印行为中使用它,或者把它提供给其它的用户反馈表单。你甚至可以把几个“ReportListener”连在一起,控制多个输出和反馈。FOXTALK杂志将会在接下来的几个月讲述VFP9报表系统改良的优越性,期间你会碰到一些新概念,比如ReportListener,一开始完全掌握它们会有点难度,你得呆在这儿连续阅读,最好跟着试验下。一旦这些概念注入你的大脑,我想你会吃惊、感叹的。让我们来看看这十件酷事老实说要在这个文档中挑选10个新特征来举例真不容易,因为这里有上百个新特性供选,我眼花花,比如,也许我该选这个?:如何在BROWSE窗口显示MEMO提示(移动鼠标到MEMO字段上面显示4095个字符);如何禁止打开表对话框并返回一个错误(SETTABLEPROMPTOFF);如何用SETREFRESH指定更快的刷新率;如何在命令按钮/选项按钮/检查框中隐藏CAPTION后还能使用热键/图像(通过设置一个新的属性PicturePosition=14-NoText)。嗯……或者我应该介绍这个?:为CURSOR对象提供的新属性OrderDirection,在数据环境中将它设为升序或降序;工具栏纵横向改变时动态调整分隔对象;用Listbox.AutoHideScrollBar属性来隐藏滚动条。我苦思冥想,因为我要从这个万众瞩目的VFP9.0中选出10个典型的特性来阐述。注:因为这篇文章基于VFP9的一个早期测试版,所以有的特征可能和现在有点出入。1、文本框自动完成你是否曾梦想过给文本框添加一种看起来更流行的“输入常用的单词或短语就出现一个下拉列表”的外观?通过使用VFP智能感知的核心引擎,VFP开发组给了我们这样一种很酷的新功能,并且不但令人惊讶的易于使用,而且完全可以扩充。让我们来尝试一下,将一个文本框拖放到表单上(或者打开一个有文本框的任何一个表单),将文本框新的AutoComplete属性设置为一个非零值,这样就搞定了!运行几次这个表单,在文本框里输入一些内容,然后就看魔术表演吧!你也可以用下面这样的代码来让表格中的文本框支持AutoComplete:THISFORM.Grid1.Column1.Text1.AutoComplete=1AutoComplete属性控制着自动完成的行为表现,可用的值如下:※0——不使用自动完成;※1——按字母顺序;※2——最常用的;※3——最近使用的;※4——用户自定义的加权排序(WeightedOrder);这些选项中的最后一个需要特别注意一下。当AutoComplete的值在1-3之间的时候,自动完成的功能是系统自维护的,而用户自定义加权排序的值4则让你可以通过给AutoComp.DBF表中的Weight字段赋以一个数值型值来指定各个数据项的显示顺序(最大的Weight值显示在下拉列表的顶部)。默认的AutoComp.DBF表位于HOME(7)目录下(译者注:使用参数7,该函数返回用户应用程序的数据目录。),但你可以通过在全局的层次上设置_SCREEN.AutoCompTable、或者在单个文本框的层次上设置Text1.AutoCompTable来覆盖默认的设置。不管你在哪个属性中指定一个表,如果这个表不存在,则系统会自动为你新建一个。你可以同时拥有多个AutoComp表,而每个表也可以服务于一个或多个文本框,VFP会管理这些在一个隐藏的数据工作期内的表的打开和关闭。在AutoComp表中,除非你给文本框设置了AutoCompSource属性,否则这个文本框的Name将作为决定显示哪些数据项的查询关键字,反之,则使用AutoCompSource属性指定的值。要想让多个文本框共享自动完成提供的值的话,只要简单的把这些文本框的AutoCompSouce属性设置为相同的值就可以里,例如设置为NameAutoComp或者Cities。通过在运行时将AutoCompSource动态的设置为一个代表某个用户的特定代码的字符串、或者在属性表中设置如下的代码,你甚至可以为你所在组织中的每个人启用独特的自动完成列表:=Custs_+LoginName不过,如果采用了这种办法,你需要注意的是在AutoComp表中作为搜索关键字的Source字段只有20个字符大小。当然,你可以自己建一个有着更大长度的Source字段的表作为AutoComp表,可是如果在为一个特定的文本框初次使用AutoComplete功能的时候你让VFP自动为你建立这个表,那么这个表中的Source字段的长度默认就是20个字符。要在测试的时候看看AutoComp表中发生了什么事情,你可以从VFP的另一个数据工作期内共享打开这个表来浏览它的内容,或者也可以在命令窗口中执行如下代码:USEHOME(7)+autocomp.dbfSHAREDIN0SELECTautocompBROWSE2、使用新的报表引擎来建立HTML或者XML由于新设计的报表编辑器引擎使用了一个GDI+输出接口而不是旧的GDI技术,并且由于该引擎的那些表现部分的彻底改变,当使用新样式的报表输出的时候,你会发现在那些报表数据项的位置上的细微区别。你还将发现在输出质量的增强。但这一切首先有个前提,你必须执行一个命令来启用新样式输出,因为VFP开发组为了向后兼容的目的默认使用的是老样式的输出。这意味着你不需要对已有的报表做任何改动就可以在VFP9.0中照样使用它们,或者你也可以通过这行下面的命令来切换到使用新样式的输出:SETREPORTBEHAVIOR90用下面的命令可以切换回使用旧的样式:SETREPROTBEHAVIOR80此外,当你在REPORT命令中使用了象OBJECTTYPE4或者OBJECTox这样的需要新行为特性的任何一个命令行选项参数的时候,系统会动态切换到使用新样式的报表。这里是一个示例,你可以试一下它来把你的报表内容输出到一个HTML文件:REPORTFROM(HOME(1)+tools\filespec\90frx.frx);OBJECTTYPE5当这个命令运行的时候,VFP将切换为使用90样式的报表引擎,并使用由ReportOutput.app提供的HTMLListener类来将你的报表输出为一个位于你的个人Temp目录中的HTML文件,并提示你文件名。单击Yes将文件名保存在_CLIPTEXT系统变量中,然后打开浏览器,按下CTRL+V将这个文件名粘贴到URL文本框中取,按下回车就会看到9.0版FRX表定义的上佳HTML表现。你可以通过首先要求VFP将一个对HTMLListener的对象引用放入到一个你已经初始化的变量中去来获得对HTMLListener的更多控制权。然后就可以设置它的各种属性了,如下所示:LOCALolistener**取得一个对HTMLListener类的引用DO(_reportoutput)WITH5,olistener**在执行下面的命令后会关闭用户界面的返回和提示olistener.quietmode=.T.**指定自己的文件名和目录olistener.targetfilename=c:\htmltest.htm**运行一个将会引用我们已经设置好了的listener的报表REPORTFROM(_samples+solution\reports\ledger.frx);OBJECTolistener**在浏览器中显示结果RUN/nExplorer.exec:\htmltest.htm你可以用类似的途径来使用XMLListener以建立一个带有所有数据的XML文件。注意:由于_reportoutput也许并非总是指向默认的ReportOutput.app,所以,更安全的办法是从FFC基础类库中新的_reportlistener.vcx类库来建立XMLListener或者HTMLListener的实例,入下面的示例所示:**在我手里的Beta版需要SetsafetyoffSETSAFETYOFFLOCALolistener**获得对FFC基础类库中的_Reportlistener.vcx**类库中的XMLListener类的一个引用olistener=NEWOBJECT(XMLListener,;HOME(0)+ffc\_reportlistener.vcx)**在执行下面的命令后会关闭用户界面的返回和提示olistener.quietmode=.T.**只包含数据,不带布局信息olistener.xmlmode=0&&只包含数据**指定自己的文件名和路径olistener.targetfilename=c:\xmltest.xml**运行一个将会引用已经设置好了的listener的报表REPORTFROM(_samples+solution\reports\ledger.frx);OBJECTolistener**在浏览器中显示结果RUN/nExplorer.exec:\xmltest.xml当XML数据弹出在浏览器中的时候,注意它的Data段,其中包含着许多表示报表中原有的带区的标志,例如PH表示页标头,D表示细节带区,而PF则表示页注脚。这些东西会很有用的,例如可以将你自己的XSLT样式表应用给这个XML文件,以通过高度自定义的布局来展示数据。此外,你还可以通过在前面的代码中改变这一行来获得与报表布局一样的XML表现:olistener.xmlmode=1&&只用报表布局报表布局的信息在一个名为VFP-RDL的XML段中,也许你已经猜到了这个名字所代表的意思:“VisualFoxPro报表定义语言”。这一段的XML包含大量的VFPFRXLayoutObject标记,它描述了定义在报表的FRX中的所有显示元素,并可以通过如下设置来选择包含关于数据来源的信息:olistener.IncludeDataSourceInVFPRDL=.T.下面这行代码可以一次就返回同时包含了VFP-RDL报表布局段和Data段的一个XML文件:ol