Textbox 的自动完成(Auto Completion)功能
张洪举(
http://www.vfptop.com
) Microsoft Visual FoxPro MVP
概述
在即将发布的VFP9.0(公测Beta版可以从
http://msdn.microsoft.com/vfoxpro/
下载)中,为Textbox控件增加了类似IE浏览器的“自动完成”(AutoCompletion)功能。在IE浏览器的地址栏中,用户输入一个链接地址,会显示一个与之相匹配的所有地址列表,同样,在网页中的某些文本框中,也会保留用户最近输入过的词条列表,如http://mail.163.com的“用户名”文本框,如图1所示。VFP9将使用数据表来提供“自动完成”支持,所以FoxPro程序员可以很容易地修改其中的内容,该功能可以提供一个类似组合框功能的支持。
图1 IE浏览器中文本框的下拉列表
解决方案
键盘、鼠标、笔在文本框中的触发动作方式
• 重要事项:当从文本框的下拉列表中选择项目后,则整个文本框中的内容会被该项目内容替换,即使先前在文本框中输入了内容。
• 当用户使用鼠标或笔在文本框中第一次单击时,将自动显示一个可用选择的下拉列表,用户然后可以移动鼠标到列表项上进行选择,选择后,该列表项将自动插入到文本框中。
• 如果用户通过键盘定位到文本框,只到在文本框中输入一个字符时,才自动显示下拉列表,空格键将触发整个列表。注意:列表的大小(可见显示限制)在Options对话框的View选项卡中设置。
• 当下拉列表第一次显示时,下拉列表的内容根据用户输入的内容进行筛选,在下拉列表中仅显示包含用户所输入内容的列表项,如果没有列表项可匹配,将隐藏下拉列表。当按下了退格(backspace)或删除(delete)键,下拉列表会根据匹配结果重新调整下拉列表的大小。注意:用户在文本框中输入时,不会自动选择下拉列表中的项目,如果要选择项目,可以使用上/下箭头、上翻(PageUp)、下翻(PageDown)键或鼠标来完成操作。
• 如果用户按下了回车(Enter)或Tab键,则在下拉列表中选定项目的内容会自动插入到文本框中。注意:如果用户已经在文本框中输入有空格,则会首先剪裁掉这些前导空格。
• 当列表项被选定并插入到文本框中时,将进行如下“自动完成”表更新:
o 如果是一个新项目,将增加一条新记录。
o 如果在表中已经存在该项目,将更新Updated、Count和Data 字段,并只存储文本的最近指定情况。
注意:如果第一次输入时指定的“自动完成”表不存在,将自动建立该表。
• 如果用户在已具有的文本的文本框中重新输入,将在下拉列表中显示精确匹配的项目以及在精确匹配文本之外包含有其他附加文本的项目。
• 文本的显示和内容区分大小写,因此,在“自动完成”表中只存储文本项目的一个实例,也就是存储最近输入的实例。例如,如果Hong Ju已经存储在“自动完成”表中,这时用户又输入了HONG JU,则将用HONG JU替换掉原来的Hong Ju,使用这种方法可以只显示最近的版本。此外,在保存时也会删除掉文本头尾的多余空格。
• 下拉列表中的项目可以从列表中删除掉。方法是在下拉列表打开时,选定要删除的列表项并按Delete键,这时会为该记录添加删除标记,并且不会提示警告信息。当项目被删除时,只影响下拉列表的内容,而不会更新被编辑的实际字段。
AutoComp表
用于自动完成的数据默认存储在AutoComp.DBF表中,该表的结构如下:
字段名称字段类型说明
Source C (20)自动完成控件的源名称
DataC (254)在控件中显示的数据
CountI项目被选择的次数
WeightI这是用于用户自定义的字段
CreatedT日期时间字段,是第一次建立时的唯一时间戳
UpdatedT日期时间字段,是最近更新时的唯一时间戳
UserM用户字段
Source C (20)自动完成控件的源名称
DataC (254)在控件中显示的数据
CountI项目被选择的次数
WeightI这是用于用户自定义的字段
CreatedT日期时间字段,是第一次建立时的唯一时间戳
UpdatedT日期时间字段,是最近更新时的唯一时间戳
UserM用户字段
“自动完成”表被文本框的AutoCompSource属性引用,因此,每个文本框可以具有自己的“自动完成”表。当一个文本框被允许使用“自动完成”功能,将按照下列方式处理 “自动完成”表:
• 如果指定的“自动完成”表不存在,系统将自动建立,存在则自动打开表。
• 缺省情况下,如果没有指定目录,VFP使用HOME(7)位置存储“自动完成”表。如果要控制用于所有程序的全局设置,可以使用新增的_SCREEN.AutoCompSource属性指定一个表。注意:Textbox.AutoCompSource属性会优先执行。
• 如果Textbox.AutoCompSource属性不为空,将为“自动完成”使用该属性指定的表(如果不存在则自动建立);如果Textbox.AutoCompSource属性为空,则检测_SCREEN.AutoCompSource属性并作为源表;如果Textbox和_SCREEN的AutoCompSource属性都为空,则使用默认的HOME(7)位置和Autocomp.DBF表。
• 在运行时,可以动态改变AutoCompSource属性。
• 每次激活/禁止“自动完成”菜单,将打开/关闭“自动完成”表一次,了解这一点是十分重要的,因为这可以让你知道在如KeyPress等事件中如何书写代码来访问“自动完成”表。
• “自动完成”表以共享模式打开,这允许其他用户也可以以共享模式打开该表。
• 如果指定的表存在,但是不能打开,文本框将不支持自动完成功能,并且不产生错误。
• 每当一个新“自动完成”表被创建,也将创建相应的索引来提高数据访问性能,索引标识基于下列表达式:
SOURCE+UPPER(LEFT(DATA,30))+PADL(COUNT,8)
AutoCompTable属性
指定“自动完成”表的名称和位置,存储用于文本框的数据。
语法:
Textbox.AutoCompTable [ = String Value]
属性详述:
在设计和运行时可读写。
应用于:Textbox, _SCREEN
说明: 为“自动完成”数据指定源表名称。
注释:
• 如果没有指定位置和名称,则默认位置和名称是:HOME(7) + “Autocomp.DBF”。
• 参考上面“AutoComp表”部分的表规则和操作触发方式。
示例:
AddressForm.Text1.AutoCompTable = 'c:\myApp\AutoComp.DBF'
AutoCompSource属性
指定用于在“自动完成“表中查找数据的源表名称。
语法:
Textbox. AutoCompSource [ = String Value]
属性详述:
在设计和运行时可读写。
应用于:Textbox
说明: 指定源表名称,用于查找“自动完成“数据。
注释:
• 当词条在“自动完成”表中被创建或访问时,将使用一个主键(保存在Source字段中)。缺省情况下,如果该属性没有指定表,则使用文本框的名称(如Text1)作为主键。
• 通过使用该属性,可以在应用程序中共享这些“自动完成”列表信息。例如:可能许多表单中都有一个Address字段,通过为每个显示Address字段的文本框设置AutoCompSource属性到类似myAddress的表,这样你的整个程序就可以重复使用这些相同的“自动完成”词条。
示例:
AddressForm.AddressText1.AutoCompSource = 'myAddress'
AutoComplete属性
该属性指定是否在文本框中使用“自动完成”功能和“自动完成”的模式。使用“自动完成”功能时,根据输入的词条,将显示一个与之匹配的最近输入的词条列表,如果选择了其中的一个词条,将使用该词条自动填充文本框内容,这很类似IntelliSense。
语法:
Textbox.AutoComplete [ = Value]
字段名称字段类型说明
Source C (20) 自动完成控件的源名称
Data C (254) 在控件中显示的数据
Count I 项目被选择的次数
Weight I 这是用于用户自定义的字段
Created T 日期时间字段,是第一次建立时的唯一时间戳
UpdatedT 日期时间字段,是最近更新时的唯一时间戳
User M 用户字段
Source C (20) 自动完成控件的源名称
Data C (254) 在控件中显示的数据
Count I 项目被选择的次数
Weight I 这是用于用户自定义的字段
Created T 日期时间字段,是第一次建立时的唯一时间戳
UpdatedT 日期时间字段,是最近更新时的唯一时间戳
User M 用户字段
属性详述:
在设计和运行时可读写。
应用于:Textbox
说明: 指定自动完成的模式。
注释:
• 值1用于指定按字母顺序排序,不区分大小写。
• 值2指定按最常使用排序,VFP首先基于Count字段,然后基于Updated字段显示“自动完成”词条。.
• 值3指定按最近使用排序,VFP基于Updated 字段显示“自动完成”词条。
• 值4是按用户指定的顺序排序。在AutoComp表中包含一个特定的Weight字段,所以用户可以按照自己的算法来指定如何显示列表排序。如果有约束,则使用Updated字段排序(按最近使用排序)。
• 出现在“自动完成”下拉列表中的项目数目受Options对话框View选项卡中的List Display Count(列表显示数目)设置控制。
示例
下面的示例程序在表单中建立了两个Textbox对象,其中Text1没有指定“自动完成”表的位置和名称,所以将默认使用HOME(7)下的AutoComp.DBF表来存储数据,而Text2指定了tblAddress作为“自动完成”表名称,由于该表并不存在,在运行该程序时,会在当前目录下自动创建该表。
PUBLIC oform1 oform1=NEWOBJECT("form1") oform1.Show RETURN DEFINE CLASS form1 AS form Top = 0 Left = 0 Height = 150 Width = 352 Caption = "Form1" Name = "form1" ADD OBJECT text1 AS textbox WITH ; &&未指定“自动完成”表的位置和名称 Height = 22, ; Left = 66, ; Top = 36, ; Width = 111, ; AutoComplete = 1, ; Name = "Text1" ADD OBJECT text2 AS textbox WITH ; &&指定了“自动完成”表,该表将保存在当前目录下 Height = 22, ; Left = 66, ; Top = 75, ; Width = 198, ; AutoComplete = 1, ; AutoCompSource = "", ; AutoCompTable = "tblAddress", ; Name = "Text2" ADD OBJECT label1 AS label WITH ; Caption = "姓名:", ; Height = 17, ; Left = 21, ; Top = 36, ; Width = 40, ; Name = "Label1" ADD OBJECT label2 AS label WITH ; Caption = "地址:", ; Height = 17, ; Left = 21, ; Top = 75, ; Width = 40, ; Name = "Label2" ENDDEFINE
执行上面的代码,在表单的文本框中输入词条,效果如图2所示。
图2 “自动完成”运行效果
这时,可以使用USE命令打开tblAddress表查看一下其中的内容,如图3所示。其中,TEXT2是文本框的对象名称;第5条记录(山东烟台)的Count字段值为2,表示被选择了2次;第3条记录被添加了删除标记,是在下拉列表中选中项目后按下Delete键后的结果。
图3 tblAddress表中保存的内容