VB6:如何使用API​​搜索列表框并获取所有匹配项?

时间:2013-05-01 20:40:55

标签: vb6

我有一个包含几千个项目的列表框。如果我想获得第一场比赛,@AngryHacker in this threat给出的下面的代码是完美的。但有时我有多个具有相同数据的项目。那么,我想得到所有的比赛,怎么做?

实际上,它是这样的: AA4 SDS AA5 AA6 FDF DSF

从列表中,我想获得以“aa”

开头的项目的索引
Private Declare Function SendMessage Lib "USER32" Alias "SendMessageA" _
     (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As _
     Integer, ByVal lParam As Any) As Long

'constants for searching the ListBox
Private Const LB_FINDSTRINGEXACT = &H1A2
Private Const LB_FINDSTRING = &H18F

'function to get find an item in the Listbox
Public Function GetListBoxIndex(hWnd As Long, SearchKey As String, Optional FindExactMatch As Boolean = True) As Long

    If FindExactMatch Then
        GetListBoxIndex = SendMessage(hWnd, LB_FINDSTRINGEXACT, -1, ByVal SearchKey)
    Else
        GetListBoxIndex = SendMessage(hWnd, LB_FINDSTRING, -1, ByVal SearchKey)
    End If

End Function

2 个答案:

答案 0 :(得分:4)

您可以利用wParam LB_FINDSTRINGLB_FINDSTRINGEXACT条消息让调用者指定要搜索的第一个项目这一事实:

  

wParam中

     

要搜索的第一个项目之前的项目从零开始的索引。当搜索到达列表框的底部时,它将继续从列表框的顶部搜索回到wParam参数指定的项目。如果wParam为-1,则从头开始搜索整个列表框。

因此,您的GetListBoxIndex采用以下格式(请注意StartIndex参数而非硬编码-1):

'LB_ constants
Private Const LB_ERR = -1
Private Const LB_FINDSTRINGEXACT = &H1A2
Private Const LB_FINDSTRING = &H18F

Private Declare Function SendMessage Lib "USER32" _
    Alias "SendMessageA" (ByVal hWnd As Long _
    , ByVal wMsg As Long _
    , ByVal wParam As Integer _
    , ByVal lParam As Any) As Long

Public Function GetListBoxIndex(hWnd As Long _
    , SearchKey As String _
    , StartIndex As Long _
    , Optional FindExactMatch As Boolean = True) As Long
    If FindExactMatch Then
        GetListBoxIndex = SendMessage(hWnd, LB_FINDSTRINGEXACT, StartIndex, SearchKey)
    Else
        GetListBoxIndex = SendMessage(hWnd, LB_FINDSTRING, StartIndex, SearchKey)
    End If
End Function

其余的取决于你打算在事后对结果做些什么。下面是简单的测试,仅将结果打印到立即窗口:

Private Sub Command1_Click()
    PrintAllMatches List1.hWnd, Text1.Text
End Sub

Private Sub Form_Load()
    List1.AddItem "aa1"
    List1.AddItem "bbb"
    List1.AddItem "aa2"
End Sub

Private Sub PrintAllMatches(hWnd As Long, SearchKey As String)
    Dim firstMatch As Long, nextMatch As Long
    nextMatch = GetListBoxIndex(hWnd, SearchKey, -1, False)
    If nextMatch = LB_ERR Then
        Debug.Print "Not found"
        Exit Sub
    End If

    firstMatch = nextMatch
    Do
        Debug.Print "Match is at index " & nextMatch
        nextMatch = GetListBoxIndex(hWnd, SearchKey, nextMatch, False)
    Loop While nextMatch <> firstMatch
End Sub

答案 1 :(得分:0)

我有类似这样的案例如何解决以下代码,

Adodc1.Recordset.MoveFirst Adodc1.Recordset.Find "DEBTOR_CODE = '" & Text11.Text & "'" If Adodc1.Recordset.EOF = True Or Adodc1.Recordset.BOF = True Then MsgBox "Record Not Found!", vbApplicationModal Adodc1.Recordset.MoveFirst Me.Combo1.SetFocus Me.Combo1.ListIndex = Me.Text11.Text End If

我必须搜索debtor_code并且每个债务人都有多个地址,我需要在组合框中获得多个答案