?? 125.txt
字號:
用兩分法搜索列表框或組合框中的數據
下面的函數能讓你在一個已作升序排列的列表框或組合框中查找符合條件的數據。
你可以實現精確查找或模糊查找。對這個程序稍微變一下,你就可以在一組已排好
序的數組中查找符合條件的數據。該方法的主要好處是對于大量的數據的查找,速
度非常之快。例如,一個列表框中有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.
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -