VFP90 对较于之前VFP60 有哪些重大的改进.docx
- 文档编号:3866797
- 上传时间:2022-11-26
- 格式:DOCX
- 页数:12
- 大小:28.34KB
VFP90 对较于之前VFP60 有哪些重大的改进.docx
《VFP90 对较于之前VFP60 有哪些重大的改进.docx》由会员分享,可在线阅读,更多相关《VFP90 对较于之前VFP60 有哪些重大的改进.docx(12页珍藏版)》请在冰豆网上搜索。
VFP90对较于之前VFP60有哪些重大的改进
VFP9.0对较于之前VFP6.0有哪些重大的改进
VFP9.0对较于之前VFP6.0有哪些重大的改进2
1、文本框自动完成2
2、使用新的报表引擎来建立HTML或者XML4
3、组合多个ReportListener以提供多种输出6
4、将报表保存为图形文件7
5、使用新的超小型二进制索引9
7、停靠你的表单10
8、使用新的数据浏览面板14
10、为了能使用户更好的对数据类型进行控制16
11、超级SYS(1037,1)16
14、控件的Anchor属性19
15、自定义Memo编辑窗口20
VFP9.0对较于之前VFP6.0有哪些重大的改进
象VFP8一样,VFP9的许多改进建议也是来自全球的各个VFP社区。
(大大小小的建议,很难知道是谁提出了这些好建议)。
不过尽管改进很多,我们也必须承认,VFP的很多方面还没被照顾到。
总的看来,VFP9带给我们的是:
修补了很多BUG;弥补了一些功能的缺陷或实现了过去曾提出过的一些设想;某些功能被重写发生了翻天覆地的变化……当然,你所渴望的某些功能或许在或许不在这个版本里面,但可以确定你能从那个“What'sNew”文档中发现一些有价值的东西。
记住,尝试测试版总要带点探险精神的。
我写这篇文章的时候,是在VFP测试版发布前的几个星期,VFP文档有些地方跟不上VFP软件的更新,这就意味着你拿到的测试版拷贝会和文档有些出入,所以很自然,尝试测试版软件总要带点探险精神的,呵呵。
如何在BROWSE窗口显示MEMO提示(移动鼠标到MEMO字段上面显示4095个字符);如何禁止打开表对话框并返回一个错误(SETTABLEPROMPTOFF);如何用SETREFRESH指定更快的刷新率;如何在命令按钮/选项按钮/检查框中隐藏CAPTION后还能使用热键/图像(通过设置一个新的属性PicturePosition=14-NoText)。
嗯……或者我应该介绍这个?
:
为CURSOR对象提供的新属性OrderDirection,在数据环境中将它设为升序或降序;工具栏纵横向改变时动态调整分隔对象;用Listbox.AutoHideScrollBar属性来隐藏滚动条。
vfp6.0 中文版下载:
我苦思冥想,因为我要从这个万众瞩目的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
**取得一个对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包含大量的 标记,它描述了定义在报表的FRX中的所有显示元素,并可以通过如下设置来选择包含关于数据来源的信息:
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
VFP9.0中文汉化版下载:
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查询中要用到一个字符串,这个字符串是根据销售员的业绩得出的一系列结果,代码如下:
CREATETABLElineitems(custcodeI,purchasesN)
FORi=1TO10
INSERTINTOlineitemsvalueS(i,800*(i-2))
E□□□OR
SELECTli.custcode,li.purchases,;
PADR(;
ICASE(li.purchases<=0,"DragonProfits",;
li.purchases<500,"BreadandButter",;
li.purchases<2000,"SendGiftBox",;
li.purchases<5000,"TaketoBallgame",;
"TriptoHawaii";
),20)ASCustStatus;
FROMlineitemsli我指定了4个条件组,最后的那个"TriptoHawaii"是OTHERWISE段。
而且我把返回值用空格填充到固定的20个字符,因为在SQLSELECT中有时需要这么做。
另外,不管你有偶数个参数还是奇数个参数,每个CASE段的最后一个参数就是OTHERWISE的值。
7、停靠你的表单
你现在可以用新的表单Dockable属性把停靠行为加入到你的程序中。
默认的Dockable值是0,跟以前版本的行为一致。
然而,如果你把Dockable设为1或2,表单的标题栏高度就会变成原来的一半,这时表单就支持停靠了(设为1表示表单已停靠)。
表单支持停靠(Dockable设为1或2)后,你可以用WINDOWS菜单的Dockable项或在表单的标题栏点击鼠标右键来切换这2种设置。
当Dockable=1时,你可以将表单拖放到可停靠的位置,你也可以用以下代码实现停靠:
*1=top,2=left,3=right,4=bottom
THISFORM.Dock(nPosition)
*tab-docktoanotherform
THISFORM.Dock(4,oFormTarget)
*tab-docktoawindow
DOCKNAMEoFormRefPOSITION4WINDOWWindowName一个已停靠的表单也可以通过WINDOWS菜单的Dockable项或在表单的标题栏点击鼠标右键来终止停靠,或用以下的代码:
*setformto"supportsdocking,butnotdocked"
THISFORM.Dockable=2
*orcalltheform'sdockmethod
THISFORM.Dock(-1)你可以运行下面的代码看看停靠的过程。
这些代码建了3个表单,并设定了TOP/LEFT,然后把它们停靠到COMMAND窗口上。
你可以用上面的Dock/Undock按钮来实现表单的停靠/不停靠,点击3个中任一一个表单的X按钮会关闭演示。
选中一个表单后,你可以用菜单来切换它的Dockable属性,当表单处于可停靠
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VFP90 对较于之前VFP60 有哪些重大的改进 之前 VFP60 哪些 重大 改进