• Offizieller Beitrag

    Edit 12.02.08: Angepaßt an Ver. 3.2.10.0 und erweitert
    Mit der neuen Funktion: _GUICtrlListView_FindInText() werden jetzt auch SubItems durchsucht, aber ausschließlich Case insensitiv. Auch eine Teilsuche ist nicht möglich. Aus diesem Grund habe ich meine Funktion entsprechend erweitert.
    • Suche in allen Subitems
    • Suche Case sensitiv (Standard) oder nicht
    • Teilsuche möglich (Standard False), dabei wird Case sensitiv auf False gesetzt, selbst wenn True übergeben
    • Rückgabe als Array: Array[0] = ItemIndex, Array[1] = SubItemIndex

    Beispiel
    [autoit]

    #include <GUIConstants.au3>
    #include <GuiListView.au3>
    Opt("GUIOnEventMode", 1)

    [/autoit] [autoit][/autoit] [autoit]

    $Form1 = GUICreate("Form1", 633, 454, 193, 115)
    GUISetOnEvent($GUI_EVENT_CLOSE, "Form1Close")
    $b = GUICtrlCreateButton('Suche', 10, 10, 80, 20)
    GUICtrlSetOnEvent(-1, '_search')
    $in = GUICtrlCreateInput('Wert 4-2', 100, 10, 80, 20)
    $ListView1 = GUICtrlCreateListView("Spalte1|Spalte2|Spalte3", 80, 56, 457, 337)
    GUICtrlSendMsg(-1, 0x101E, 0, 100)
    GUICtrlSendMsg(-1, 0x101E, 1, 100)
    GUICtrlSendMsg(-1, 0x101E, 2, 100)
    For $i = 1 To 10
    _GUICtrlListView_AddItem($ListView1, "Wert " & $i & '-1')
    For $k = 2 To 3
    _GUICtrlListView_AddSubItem($ListView1, $i-1, "Wert " & $i & '-' & $k, $k-1)
    Next
    Next
    GUISetState(@SW_SHOW)

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    Sleep(100)
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func Form1Close()
    Exit
    EndFunc
    Func _search()
    $ret = _LV_Search($ListView1, GUICtrlRead($in), False, True)
    If IsArray($ret) Then
    _GUICtrlListView_SetItemSelected($ListView1, $ret[0])
    _GUICtrlListView_SetSelectedColumn($ListView1, $ret[1])
    MsgBox(0, 'Suche: ' & GUICtrlRead($in), 'Zeile: ' & $ret[0]+1 & @LF & 'Spalte: ' & $ret[1]+1 )
    Else
    MsgBox(0, '', 'Keine Übereinstimmung')
    EndIf
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _LV_Search($LV, $What2Find, $CaseSens=True, $Partial=False)
    $count = _GUICtrlListView_GetItemCount($LV)
    Local $aOut[2] = [-1,0]
    If $count < 1 Then
    SetError(1)
    Return -1
    EndIf
    If $Partial Then $CaseSens = False
    $countSub = _GUICtrlListView_GetColumnCount($LV)
    For $i = 0 To $count-1
    For $k = 0 To $countSub-1
    If $CaseSens Then
    If _GUICtrlListView_GetItemText($LV, $i, $k) == $What2Find Then
    $aOut[0] = $i
    $aOut[1] = $k
    Return $aOut
    EndIf
    Else
    If Not $Partial Then
    If _GUICtrlListView_GetItemText($LV, $i, $k) = $What2Find Then
    $aOut[0] = $i
    $aOut[1] = $k
    Return $aOut
    EndIf
    Else
    If StringInStr(_GUICtrlListView_GetItemText($LV, $i, $k), $What2Find, 1) Then
    $aOut[0] = $i
    $aOut[1] = $k
    Return $aOut
    EndIf
    EndIf
    EndIf
    Next
    Next
    SetError(2)
    Return -1
    EndFunc ;==>_LV_Search

    [/autoit]
  • Klingt gut aber:
    C:\Programme\AutoIt3\Include\_LV_Search.au3(21,43) : ERROR: _GUICtrlListViewGetItemCount(): undefined function.
    $count = _GUICtrlListViewGetItemCount($LV)
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
    C:\Programme\AutoIt3\Include\_LV_Search.au3(26,50) : ERROR: _GUICtrlListViewGetSubItemsCount(): undefined function.
    $countSub = _GUICtrlListViewGetSubItemsCount($LV)
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
    C:\Programme\AutoIt3\Include\_LV_Search.au3(29,46) : ERROR: _GUICtrlListViewGetItemText(): undefined function.
    If _GUICtrlListViewGetItemText($LV, $i, $k)
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^


    :(

    • Offizieller Beitrag

    Hier Oscar, nur für dich ;)
    Du kannst den Start Index für Item und SubItem festlegen. Der SubItemIndex wird natürlich nur einmal verwendet, anschließend werden wieder alle Spalten durchsucht.
    Somit kannst du deine Suche mit dem letzten Ergebnis fortsetzen. Mußt nur (in Abhängigkeit von der Spaltenzahl und dem letzten Treffer) entweder ItemIndex oder SubItemIndex um 1 erhöhen.

    Spoiler anzeigen
    [autoit]

    ;-----------------------------------------------------------------------------------------------------------------------
    ; Function _LV_Search($LV, $What2Find [, $CaseSens=True [, $Partial=False [, $iStart=0 [,$kStart=0]]]])
    ;
    ; Description search a term in every item and subitem of a given ListView
    ;
    ; Parameter $LV ListView -ID
    ; $What2Find Search term
    ; $CaseSens Casesensitivity True (default) or False
    ; $Partial Partialsearch, Casesens will set to False also if given True
    ; $iStart ItemIndex for start (default 0)
    ; $kStart SubItemIndex for start (default 0), works only in 1.st loop, than SubItemIndex is 0
    ;
    ; Return Success Array[0] = LV-Index
    ; Array[1] = SubItem-Index
    ; Failure Return -1 and set @error : 1 - ListView is empty
    ; 2 - $What2Find was not found
    ;
    ; Requirements #include <GuiListView.au3>
    ;
    ; Author BugFix ([email='bugfix@autoit.de'][/email])
    ;-----------------------------------------------------------------------------------------------------------------------
    #include <GuiListView.au3>
    Func _LV_Search($LV, $What2Find, $CaseSens=True, $Partial=False, $iStart=0, $kStart=0)
    $count = _GUICtrlListView_GetItemCount($LV)
    Local $aOut[2] = [-1,0]
    If $count < 1 Then
    SetError(1)
    Return -1
    EndIf
    If $Partial Then $CaseSens = False
    $countSub = _GUICtrlListView_GetColumnCount($LV)
    For $i = $iStart To $count-1
    For $k = $kStart To $countSub-1
    If $CaseSens Then
    If _GUICtrlListView_GetItemText($LV, $i, $k) == $What2Find Then
    $aOut[0] = $i
    $aOut[1] = $k
    Return $aOut
    EndIf
    Else
    If Not $Partial Then
    If _GUICtrlListView_GetItemText($LV, $i, $k) = $What2Find Then
    $aOut[0] = $i
    $aOut[1] = $k
    Return $aOut
    EndIf
    Else
    If StringInStr(_GUICtrlListView_GetItemText($LV, $i, $k), $What2Find, 1) Then
    $aOut[0] = $i
    $aOut[1] = $k
    Return $aOut
    EndIf
    EndIf
    EndIf
    Next
    $kStart = 0
    Next
    SetError(2)
    Return -1
    EndFunc ;==>_LV_Search

    [/autoit]