Hi Leute,
ich bastele gerade an einem Programm und dabei ist mir an neuer Stelle ein Problem untergekommen, dass ich nun zwar schon umgehen kann, aber doch gerne verstehen würde.
Bei meinem Programm funktionierte das Hin und Her springen zwischen markierten Suchbegriffen in der Listview nicht. Erst als ich das Bsp für euch erstellt habe, konnte ich mein Problem lösen, nur eben nicht verstehen.
Spoiler anzeigen
#include <GuiListView.au3>
Example()
Func Example()
Local $idListview
GUICreate("ListView Ensure Visible", 400, 400)
$idListview = GUICtrlCreateListView("Items", 2, 2, 394, 268)
$forward = GUICtrlCreateButton("Vorwärts", 10, 320, 100, 40)
$backward = GUICtrlCreateButton("Rückwärts", 120, 320, 100, 40)
_GUICtrlListView_SetColumnWidth($idListview, 0, 100)
_GUICtrlListView_SetExtendedListViewStyle($idListview, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT))
GUISetState(@SW_SHOW)
_GUICtrlListView_BeginUpdate($idListview)
For $i = 1 To 200
GUICtrlCreateListViewItem("Item " & $i, $idListview)
Next
_GUICtrlListView_EndUpdate($idListview)
Local $sItems = "1|29|70|108|186" ; Die Items zu denen ich springen möchte
Local $iListposition = 1
MsgBox(0, "Beispiel 1", "Beide Buttons wechseln einfach hin und her. Egal ob man wiederholt den einen drückt, oder abwechselt." & @CRLF & @CRLF & "Schließen führt zum nächsten Beispiel.")
Do
$msg = GUIGetMsg()
Select
Case $msg = $forward
If $iListposition = 1 Then
$iListposition = 2
_GUICtrlListView_EnsureVisible($idListview, 180)
Else
$iListposition = 1
_GUICtrlListView_EnsureVisible($idListview, 10)
EndIf
Case $msg = $backward
If $iListposition = 1 Then
$iListposition = 2
_GUICtrlListView_EnsureVisible($idListview, 180)
Else
$iListposition = 1
_GUICtrlListView_EnsureVisible($idListview, 10)
EndIf
EndSelect
Until $msg = -3
MsgBox(0, "Beispiel 2", "Keine Reaktion auf die Buttons, obwohl in der Konsole alles gut aussieht." & @CRLF & @CRLF & "Schließen führt zum nächsten Beispiel.")
Do
$msg = GUIGetMsg()
Select
Case $msg = $forward
$aItems = StringSplit($sItems, "|") ; $aItems[0] beeinhaltet die Anzahl der gefundenen Strings.
If $iListposition = $aItems[0] Then
$iListposition = 1
Else
$iListposition += 1
EndIf
ConsoleWrite($aItems[$iListposition] & @CRLF)
_GUICtrlListView_EnsureVisible($idListview, $aItems[$iListposition])
Case $msg = $backward
$aItems = StringSplit($sItems, "|")
If $iListposition = 1 Then
$iListposition = $aItems[0]
Else
$iListposition -= 1
EndIf
ConsoleWrite($aItems[$iListposition] & @CRLF)
_GUICtrlListView_EnsureVisible($idListview, $aItems[$iListposition])
EndSelect
Until $msg = -3
MsgBox(0, "Beispiel 3", "Fast das Gleiche wie Bsp 2 - mit dem Unterschied, das nach Klick noch einmal das Listviewhandle geholt wird. Schon geht es." & @CRLF & @CRLF & "Schließen führt zum nächsten Beispiel.")
Do
$msg = GUIGetMsg()
Select
Case $msg = $forward
$hListview = GUICtrlGetHandle($idListview)
$aItems = StringSplit($sItems, "|") ; $aItems[0] beeinhaltet die Anzahl der gefundenen Strings.
If $iListposition = $aItems[0] Then
$iListposition = 1
Else
$iListposition += 1
EndIf
ConsoleWrite($aItems[$iListposition] & @CRLF)
_GUICtrlListView_EnsureVisible($hListview, $aItems[$iListposition])
Case $msg = $backward
$hListview = GUICtrlGetHandle($idListview)
$aItems = StringSplit($sItems, "|")
If $iListposition = 1 Then
$iListposition = $aItems[0]
Else
$iListposition -= 1
EndIf
ConsoleWrite($aItems[$iListposition] & @CRLF)
_GUICtrlListView_EnsureVisible($hListview, $aItems[$iListposition])
EndSelect
Until $msg = -3
MsgBox(0, "Wieder Beispiel 1", "Erneut wechseln beide Buttons einfach hin und her. Egal ob man wiederholt den einen drückt, oder abwechselt." & @CRLF & @CRLF & "Bitte beachten, hier muss erneut kein Handle geholt werden!")
Do
$msg = GUIGetMsg()
Select
Case $msg = $forward
If $iListposition = 1 Then
$iListposition = 2
_GUICtrlListView_EnsureVisible($idListview, 180)
Else
$iListposition = 1
_GUICtrlListView_EnsureVisible($idListview, 10)
EndIf
Case $msg = $backward
If $iListposition = 1 Then
$iListposition = 2
_GUICtrlListView_EnsureVisible($idListview, 180)
Else
$iListposition = 1
_GUICtrlListView_EnsureVisible($idListview, 10)
EndIf
EndSelect
Until $msg = -3
GUIDelete()
EndFunc ;==>Example
Alles anzeigen
Dort wo ich das Handling der Listview ermitteln muss, nutze ich einen String, in dem die Positionen stehen, splitte ihn, gebe einer Variable einen neuen Wert und versuche dann an die richtige Position zu springen, die im entsprechenden Element des Array steht.
Das sind für einen Buttonclick schon ein paar Aufgaben. Aber warum geht ausgerechnet das Listview-Handle verloren?