MyException - 我的异常网
当前位置:我的异常网» VFP » VFP下的渐进式搜索,该怎么实现

VFP下的渐进式搜索,该怎么实现

www.MyException.Cn  网友分享于:2015-02-08  浏览:0次
VFP下的渐进式搜索,该如何实现?请指教
本帖最后由 G1QHTZ 于 2014-11-04 09:17:45 编辑

【背景:】想实现像股票行情软件中边输入股票代码或部份的股票中文名,边实时渐进式显示搜索结果的功能。


     上图分别演示输入数字或汉字时的预期效果

【存在问题:】按网上提供的方法,暂时只能用文本框+列表框的方式实现,虽然渐进式搜索基本能实现了,但还有不少疑问,在文本框中输入完搜索关键字后,键盘要按2次向下按钮才能把焦点切换到下方的列表框中选择所需结果,
一、这样比"天然"下拉组合框操作起来可就没那么得心应手了。
二、尝试直接用下拉组合框做的效果也极不理想:当在下拉组合框的文本框输入关键字时,下方列表框需要用鼠标点击才能看到结果,不点它自己不会自动弹开。这个是问题中最麻烦的一个点。

这是自己做的实验界面,原本应该在下拉组合框中输入关键字,就应该像左边那个列表框同步显示当前可选的结果,而图右边的下拉组合框完全没有弹开显示当前搜索结果


这是我点击组合框的下拉按钮时才能显示搜索结果的样子



【请求帮助解答:】如果使用下拉列表框做出渐进式搜索,在输入每个字符过程中能自动弹出下拉方便用户进行选择。

先谢谢了!


------解决思路----------------------
1. 直接用 Thisform.List1.SetFocus() 设置焦点就不用按两次了
2. 在组合框的 InteractiveChange 事件中写上 Keyboard '{F4}',下拉框就会自动弹出
------解决思路----------------------
我觉得这个问题可以这样解决:
1.在文本框的GotFocus事件中显示列表框.
2.在文本框的InteractiveChange事件中做实时筛选(这个应该已经做到了).
3.在文本框的KeyPress事件中做以下事情:
   nKeyCode = 13 or nKeyCode = 9 把列表框选中项赋给文本框的值, 并且隐藏列表框
   nKeyCode = 5 把列表框的LisIndex - 1, 当然要让ListIndex >=1,  并且NoDefault
   nKeyCode = 24 把列表框的ListIndex + 1, 当然要让ListIndex <= ListCount, 并且NoDefault
4.在文本框的LostFocus事件中隐藏列表框.

如果你的列表框一直是显示的, 那么上面的1可以没有, 下面这些就当我没说.
上面这样做的有一个缺点, 就是不能用鼠标点选列表框, 因为当你点列表框时文本框会触发LostFocus事件, 而隐藏列表框.
当然这也不是不可以解决的, 就是要在列表框的如下事件中写些代码: MouseEnter事件中做个标记, 这要在文本框的LostFocus事件中可以根据这个标记来判断是否要隐藏列表框; MouseLeave事件中清除标记, 作用如前所述. 
当然在列表框的Click事件中做文本框KeyPress事件中13,9一样的功能即可.
这里最棘手的问题是: 如果用户用鼠标点击的是列表框的流滚动条时, 列表框取得焦点却未触发Click事件, 如果这时用户用鼠标点击其他控件, 会导致列表框仍然可见, 为解决它, 就得在列表框的LostFocus事件中加入隐藏自己, 这样虽然完美地解决了这一问题, 但会在用记点击列表框滚动条后又直接点击文本框时列表框会内烁一下.

------解决思路----------------------
引用:
当我把K设置为24,即向下箭头键时,发现与VFP系统设置的TAB顺序有冲突,焦点只会跳到另一个控件中,而没有跳到LISTBOX里,
现在只好改用其他键值进行临时使用,请问这个冲突的问题有办法解决?

试试终止系统对按键的默认解释:
DO CASE
CASE k=24
    Thisform.list1.SetFocus
    Nodefault
ENDCASE
------解决思路----------------------
将下面代码复制到一个prg中运行,然后可以直接从ComboBox中下拉选择内容,也可在ComboBox上输入要查询的关键字,边输边筛选,然后可以鼠标或上下键选择筛选出来内容。

Public oform1

oform1=Newobject("form1")
oform1.Show
Return

Define Class form1 As Form

DoCreate = .T.
Caption = "Form1"
KeyPreview = .T.
Name = "Form1"

Add Object combo1 As ComboBox With ;
Height = 24, ;
Left = 48, ;
Style = 0, ;
Top = 24, ;
Width = 144, ;
Name = "Combo1"

Add Object list1 As ListBox With ;
Height = 97, ;
Left = 192, ;
Top = 84, ;
Visible = .F., ;
Width = 108, ;
Name = "List1"

Procedure Init
Create Cursor t1 (fl1 C(20))
For lnI=0 To 23
Insert Into t1 Values (Chr(65+lnI)+Chr(97+lnI)+'-'+Chr(66+lnI)+Chr(98+lnI)+'-'+Chr(67+lnI)+Chr(99+lnI)+Transform(lnI))
Endfor
Locate
Scan
Thisform.Combo1.AddItem(fl1)
Endscan
Endproc

Procedure KeyPress
Lparameters nKeyCode, nShiftAltCtrl
If (nKeyCode=5 Or nKeyCode=24 Or nKeyCode=13) And This.List1.Visible And This.List1.ListItemId>0 And This.Combo1.Tag='1'
If nKeyCode=13
This.Combo1.DisplayValue=Thisform.List1.ListItem(Thisform.List1.ListItemId,1) && 此种方式不会触发Text1的InteractiveChange事件
This.List1.Visible=.F.
Else
lnListID=Iif(nKeyCode=5,Max(This.List1.ListItemId-1,1),Min(This.List1.ListItemId+1,This.List1.ListCount))
This.List1.ListItemId=lnListID
This.Combo1.DisplayValue=Thisform.List1.ListItem(Thisform.List1.ListItemId,1)
Nodefault
Endif
Endif
Endproc

Procedure combo1.LostFocus
This.Tag=''
Endproc

Procedure combo1.KeyPress
Lparameters nKeyCode, nShiftAltCtrl
If Between(nKeyCode,48,57) ; && 0-9
Or Between(nKeyCode,97,122) ; && a-z
Or Between(nKeyCode,65,90) ; && A-Z
Or nKeyCode=7 ; && DEL
Or nKeyCode=127 ;  && BACKSPACE
Or (nKeyCode>127 And nKeyCode<>160) && 汉字
Thisform.List1.Tag='1' && 自动筛选
Else
Thisform.List1.Tag='' && 不筛选
Endif
Endproc

Procedure combo1.InteractiveChange
If Thisform.List1.Tag='1'
Thisform.List1.Tag=''
lcCombo1Val=Upper(Alltrim(This.DisplayValue))
If !Empty(lcCombo1Val)
Thisform.List1.RowSource=Null
Select fl1 Into Cursor ct2 From t1 Where (Upper(fl1) Like "%&lcCombo1Val.%")
Thisform.List1.RowSourceType=6
Thisform.List1.RowSource="ct2.fl1"
If Reccount('ct2')>0
Thisform.List1.ListItemId=1
Thisform.List1.Visible=.T.
Else
Thisform.List1.Visible=.F.
Endif
Else
Thisform.List1.Visible=.F.
Endif
Endif
Endproc

Procedure combo1.DropDown
Thisform.List1.Visible=.F.
Thisform.List1.Tag=''
Endproc

Procedure combo1.GotFocus
This.Tag='1'
Endproc

Procedure list1.MouseEnter
Lparameters nButton, nShift, nXCoord, nYCoord
This.Refresh && 解决鼠标移到其他控件(部分遮挡本控件)后,又移回本控件的显示问题
Endproc

Procedure list1.Init
This.Move(Thisform.Combo1.Left,Thisform.Combo1.Top+Thisform.Combo1.Height-1,Thisform.Combo1.Width,100) && 目的是显示在 Combo1 的正下方,让人看起来像是 Combo1 的下拉框
Endproc

Procedure list1.Click
Thisform.Combo1.DisplayValue=Thisform.List1.ListItem(Thisform.List1.ListItemId,1)
This.Visible=.F.
Endproc

Enddefine

------解决思路----------------------
引用:
Quote: 引用:

接上
说明
可以在事件或方法过程中的任何位置使用 NODEFAULT。利用表单设计器,也可以在事件或方法过程中使用 NODEFAULT。例如,在 KeyPress 事件过程或函数中包含 NODEFAULT,可以防止 Visual FoxPro 将按键放入 Visual FoxPro 键盘缓冲区中。从而,您可以创建一个 KeyPress 过程,允许您在发送按键到键盘缓冲区之前,检查按了哪个键。



在KEYPRESS事件中测试失败!!:(

keypress事件要在第一句写 NODEFAULT,在其他位置不起作用

文章评论

我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
程序员必看的十大电影
程序员必看的十大电影
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
漫画:程序员的工作
漫画:程序员的工作
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
Google伦敦新总部 犹如星级庄园
Google伦敦新总部 犹如星级庄园
一个程序员的时间管理
一个程序员的时间管理
程序员都该阅读的书
程序员都该阅读的书
每天工作4小时的程序员
每天工作4小时的程序员
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
Java程序员必看电影
Java程序员必看电影
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
中美印日四国程序员比较
中美印日四国程序员比较
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
 程序员的样子
程序员的样子
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
那些性感的让人尖叫的程序员
那些性感的让人尖叫的程序员
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
如何成为一名黑客
如何成为一名黑客
2013年美国开发者薪资调查报告
2013年美国开发者薪资调查报告
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
10个调试和排错的小建议
10个调试和排错的小建议
我的丈夫是个程序员
我的丈夫是个程序员
那些争议最大的编程观点
那些争议最大的编程观点
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
编程语言是女人
编程语言是女人
程序员的鄙视链
程序员的鄙视链
老程序员的下场
老程序员的下场
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
代码女神横空出世
代码女神横空出世
为什么程序员都是夜猫子
为什么程序员都是夜猫子
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
我是如何打败拖延症的
我是如何打败拖延症的
2013年中国软件开发者薪资调查报告
2013年中国软件开发者薪资调查报告
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
总结2014中国互联网十大段子
总结2014中国互联网十大段子
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有