您的批评和鼓励都是我把编程无限办好的动力! 您编程时遇到困难,或遇到不顺心的事想发发牢骚尽管到这里来吧! 虽然本网力求全面,但也不能包罗万象,这些我筛选出的优秀网站连接就是对本站最好的补充! 学习编程当然也离不开书本了,这里收集大量编程书籍! 编程无限之源码超市,这里收集的代码令你意想不到的全面! 欢迎光临编程网校,这里专门收集VB/CB入门文章及技术文章! 欢迎光临编程无限!
     
       
 
当前位置:中文资料 >> 控件技术
用两分法搜索列表框或组合框中的数据
  资料类型: 控件技术 上传时间: 2001-02-21 阅读次数: 1738



用两分法搜索列表框或组合框中的数据

下面的函数能让你在一个已作升序排列的列表框或组合框中查找符合条件的数据。你可以实现精确查找或模糊查找。对这个程序稍微变一下,你就可以在一组已排好序的数组中查找符合条件的数据。该方法的主要好处是对于大量的数据的查找,速度非常之快。例如,一个列表框中有1024条数据,用此法查找只须重复十次,而用传统的方法则要重复512次;如果数据量翻倍,用此法的重复次数为11次,而传统的方法重复的次数也会翻倍。

Windows API提供了四个消息来实现上述的功能。对于列表框是:LB_FINDSTRING和LB_FINDSTRINGEXACT;对于组合框是:CB_FINDSTRING和CB_FINDSTRINGEXACT。但下面的程序则不分列表框和组合框,只要事先对其中的数据排序即可。 代码如下:

?
Function FindExact(Control As Control, Searched As String, _
Optional StartingIndex As Variant)

Dim I As Long, j As Long, k As Long

FindExact = -1
I = Iif(IsMissing(StartingIndex), 0, StartingIndex)
j = Control.ListCount - 1
Do

If I > j Then Exit Function

k = (I + j) / 2

Select Case StrComp(Control.List(k), Searched)
Case 0: Exit Do
Case -1: I = k + 1
Case 1: j = k - 1
End Select
Loop


Do While k > 0
If StrComp(Control.List(k - 1), Searched) Then
Exit Do
End If
k = k - 1
Loop
FindExact = k

End Function


Function FindPartial(Control As Control, Searched As String, _
Optional StartingIndex As Variant)
Dim I As Long, j As Long, k As Long, lun As Long

FindPartial = -1
I = Iif(IsMissing(StartingIndex), 0, StartingIndex)
j = Control.ListCount - 1
lun = Len(Searched)
Do

If I > j Then Exit Function

k = (I + j) / 2

Select Case StrComp(Left(Control.List(k), lun), Searched)
Case 0: Exit Do
Case -1: I = k + 1
Case 1: j = k - 1
End Select
Loop


Do While k > 0
If StrComp(Left(Control.List(k - 1), lun), Searched) Then
Exit Do
End If
k = k - 1
Loop
FindPartial = k

End Function
程序用法如下:

Index = FindExact(Control, Searched[, StartingIndex])
Index = FindPartial(Control, Searched[, StartingIndex])

其中Control代表列表框或组合框的名称,Searched表示搜索条件,StartingIndex为可选参数,表示从哪里开始搜索。函数的返回值为符合条件的数据的索引值。如果未找到符合条件的数据,则返回值为-1.

推荐给朋友 点 评( 0 ) 返回前页 关闭此页
   
  本类最热文章排名:
  1.自制控件方面的有关知识
2.在程序中注册和注销 OCX 控件
3.运用MSChart,生成统计图形
4.在Visual Basic中,在GotF...
5.直接编辑VB中网格控制项的两种方法
6.用VB设计聚焦框程序
7.自制IE风格按纽控件
8.如何用VB6写COM组件(一)
9.用WinSock设计Chat程序
10.ActiveX控件的创建
   
   
  评论:
 
 
 

 

关于本站 版权声明 联系方法
编程无限 V4.1 Copyright © 1999-2008 21code.com

京ICP备05006938号