VFP9的10件酷事.docx
- 文档编号:11402318
- 上传时间:2023-02-28
- 格式:DOCX
- 页数:26
- 大小:31.05KB
VFP9的10件酷事.docx
《VFP9的10件酷事.docx》由会员分享,可在线阅读,更多相关《VFP9的10件酷事.docx(26页珍藏版)》请在冰豆网上搜索。
VFP9的10件酷事
VFP9的10件酷事
DavidStevenson著
RMH译
这是FOXTALK杂志6月刊提供的一篇免费文章,我们把她翻译出来,更多的译文资料在:
象VFP8一样,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.dbf"SHAREDIN0
SELECTautocomp
BROWSE
2、使用新的报表引擎来建立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版需要Setsafetyoff
SETSAFETYOFF
LOCALolistener
**获得对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数据弹出在浏览器中的时候,注意它的段,其中包含着许多表示报表中原有的带区的标志,例如
这些东西会很有用的,例如可以将你自己的XSLT样式表应用给这个XML文件,以通过高度自定义的布局来展示数据。
此外,你还可以通过在前面的代码中改变这一行来获得与报表布局一样的XML表现:
olistener.xmlmode=1&&只用报表布局报表布局的信息在一个名为
“VisualFoxPro报表定义语言”。
这一段的XML包含大量的
olistener.IncludeDataSourceInVFPRDL=.T.下面这行代码可以一次就返回同时包含了
olistener.xmlmode=2&&报表布局和数据还要等一段时间才会知道微软是否会提供某种能够将VFP-RDL定义转换为SQLServer新的报表服务使用的RDL格式的转换工具。
不过,即使没有,VFP9.0也已经给了你足够让你自己实现它的资料和工具!
这两个演示VFP报表新的输出能力的示例只是冰山的一角。
我希望你明白,你完全可以使用自己的ReportListener子类来超越VFP自带的listener类的能力,并通过在报表引擎中使用钩子(hook)来驱动你自己的输出、预览以及用户返回的行为特性。
是的,它仍然可以运行你已有的报表。
惊讶吧?
但这是真的。
3、组合多个ReportListener以提供多种输出
从前面的例子上再走远一点,让我们来看看你可以怎样通过组合多个ReportListener来实现在同一个运行中的报表上提供多种输出方案。
在默认的ReportOutput.app(以及在新的_reportListerer.vcxFFC基础类库中)提供的ReportListener的子类有一个属性叫Successor,可以用这个属性记录下对另一个个ReportListener实例的引用,而个被引用的实例将被挂钩到报表生成引擎上,因而是起着主导作用的“主控Listener”。
在下面的示例中,我通过执行DO(_reportoutput)两次来建立两个listener,每次执行的时候都传递给它一个变量,以返回一个对带有正确的输出类型的Listener的对象引用,输出类型是(_reportoutput)程序决定的。
在下面的代码中,olistener接收到一个对一个输出类型为0(打印输出)的listener的对象引用,而olistener2则接收到一个输出类型为4的XMLListener对象的引用。
现在,我们有一个全局的集合(_oReportOutput),该集合中拥有对缓存中的打印和XML两个Listener的引用,而我们则将这两个Listener引用为olistener和olistener2。
现在,为了演示从ReportOutput.app来取得一个ReportListener的引用的另一种办法,我们象这样给集合添加另一个将被放入缓存中的HTMLListener的实例:
DO(_reportoutput)WITH5注意,现在我们可以通过集合引用的办法来操作HTMLListener的属性,象这样:
_ReportOutput("5").targetfilename="c:
\htmltest2.htm"现在剩下的活是将这三个Listener象链条一样的串连起来,输出类型为0的打印Listener放在链条的最前面。
这个Listener将是我们在使用REPORTFROM命令的时候放在OBJECT子句里面去的那个,这样一来,它就变成了一个“驱动,或者主控”listener,而它会与另外两个与它在一条链条上的listener进行通讯。
将它们链接起来的代码是:
olistener.successor=olistener2
olistener2.successor=_oReportOutput("5")就是这样。
现在,运行这个报表,从同一次运行你就会获得三种类型的输出——在默认打印机上的一个报表、一个只带着数据的XML文件、以及一个显示着报表的HTML页面。
LOCALolistener,olistener2*获得一个对打印类的引用
DO(_reportoutput)WITH0,olistener*获得一个对XMLListener类的引用
DO(_reportoutput)WITH4,olistener2*关闭用户界面的返回和提示
olistener2.quietmode=.T.*只包含数据,不带布局信息
olistener2.xmlmode=0*指定文件名和路径,并关闭文件名提示
olistener2.targetfilename="c:
\xmltest2.xml"
olistener2.quietmode=.T.*现在为HTML输出做准备,但使用另一种办法来从全局的
*_oreportoutput集合中获得一个对listener的引用
DO(_reportoutput)WITH5*通过集合引用来设置HTMLListener的属性
_oReportOutput("5").targetfilename="c:
\htmltest2.htm"
_oReportOutput("5").quietmode=.T.*把三个listeners象链条一样的链接在一起
*其中,用打印listener作为驱动
olistener.successor=olistener2
olistener2.successor=_oReportOutput("5")*运行一个雇员电话号码列表,引用在列表中的第一个listener
REPORTFORM(_samples+"solution\reports\ledger.frx");
OBJECTolistener*在浏览器中显示XML和HTML结果
*并在打印机上打印报表
RUN/nExplorer.exec:
\xmltest2.xml
RUN/nExplorer.exec:
\htmltest2.htm
4、将报表保存为图形文件
ReportListener的另一种很大的用途是通过在你专门的子类中覆盖OutputPage方法来将一个报表保存为图形文件。
可以保存的图形文件格式包括EMF、JPEG、GIF、PNG、BMP、TIFF、以及多页的TIFF(这种格式对于用传真发送报表来说特别有用)。
注意,在这个示例的代码中,我将ListenerType属性设置为了2,这意味着让你自己来控制输出,每次用参数nDeviceType=-1调用OutputPage方法就打印一页,但并不将输出发送到一个打印设备。
MyReportListener有一个自定义的OutputPage方法,它先检查nDeviceType的参数是否为-1,然后再次调用OutputPage方法(给方法传递一个文件名和图形文件类型),再执行一个NODEFAULT。
这个示例在生成第一页的时候建立一个TIFF文件,然后将其它的页添加到同一个图形文件中去。
LOCALolistener*建立一个ReportListener的实例
olistener=CREATEOBJECT("MyTiffListener")
olistener.tifffilename="c:
\tifftest.tif"*运行一个将会引用我们设置好了的Listener的报表
REPORTFORM(_samples+"solution\reports\invoice.frx");
OBJECTolistenerRANGE1,2*在浏览器中显示结果
RUN/nExplorer.exec:
\tifftest.tifDEFINECLASSMyTiffListenerASReportListener
tifffilename=[]
listenertype=2&&一次一页,不输出FUNCTIONOutputPage(nPageNo,eDevice,nDeviceType)
*由于ListenerType指定了"不打印输出"
*在报表引擎调用这个方法的时候,nDeviceType将会是-1
*而我们现在则捕捉这个条件,然后自己来调用
*OutputPage方法,调用时带上文件名和图形类型参数
IFnDeviceType=-1;
ANDNOTEMPTY(THIS.tifffilename)
IFnPageNo=1
*如果是第一页,则建立TIFF文件
THIS.OutputPage(nPageNo,THIS.tifffilename,101)
ELSE
*否则,则向TIFF文件添加剩下的页
*(这段代码要运行,首先TIFF文件必须已经存在)
THIS.OutputPage(nPageNo,THIS.tifffilename,201)
ENDIF
*我们已经用需要的设置调用过OutputPage方法了
NODEFAULT
ENDIF
ENDDEFINE
5、使用新的超小型二进制索引
VFP9引进了一个新的索引类型---二进制索引,它可以在任何逻辑表达式中被使用。
据一些测试者讲,这种新型索引的访问速度和一般索引差不多,但是它的大小比一般索引要小90%,插入记录时要快80%。
要建二进制索引标志,你要在表设计器中设置索引类型为二进制,或者在Index命令中加入关键字BINARY:
INDEXONMyNonNullableLogicalExpressionTAGMyBinaryBINARY
INDEXONDELETED()TAGDELETEDBINARY
要注意的是,你建二进制索引或索引TAG的时候,不要包含FOR子句或INDEXON一个会得出NULL值的表达式。
你也不能在SEEK或SETORDERTO语句中使用二进制索引。
不过你可以在优化的FILTER条件和SQLSELECT的WHERE子句中使用并得到好处。
为了配合新的二进制索引,VFP9.0在SETDELETEDON环境中优化了DELETED()。
因为二进制索引已经是“位”级了,VFP可以在内存中更快地建立Rushmore,并且使用更少的局域网数据流量,从而大大提高了查询的性能。
现在你可以拿几个变量和别人讨论下在索引中使用DELETED()究竟会降低还是提高性能了。
6、用新的ICASE()函数一行搞定
当一个判断点出现在你的程序中(特别是SQLSELECT命令),你以前只能用一连串的IIF()来解决。
新的ICASE()函数可以让你建立更可靠更优雅的代码,它允许你使用包括OTHERWISE在内的100个条件。
比如,在你的SQLSELECT查询中要用到一个字符串,这个字符串是根据销售员的业绩得出的一系列结果,代码如下:
C
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VFP9 10 件酷事
![提示](https://static.bdocx.com/images/bang_tan.gif)