Frage zu ListView-Handle: Warum geht es manchmal verloren?

  • 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

    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?

    Grüße autoiter

    • Offizieller Beitrag

    Es gibt in der Listview-UDF einige Funktionen, die nur mit dem Handle (richtig) funktionieren.
    Wenn Du dort die Control-ID (Rückgabe von GUICtrlCreateListView) übergibst, funktioniert es nicht oder nur fehlerhaft.
    Ich habe mir deshalb angewöhnt, beim benutzen von Funktionen aus der Listview-UDF diese immer mit dem Handle "GUICtrlGetHandle($idListview)" aufzurufen.

    Deshalb funktioniert auch Dein Beispiel mit dem Handle:

  • Danke dir Oskar.
    Ich werde das vielleicht nicht immer machen, aber auf jeden Fall im Hinterkopf behalten.

    Nur warum klappt es genau in dem Bsp.2 nicht wo ich noch die anderen Sachen mache, ohne das Handle zu ermitteln.

    Vorher und nachher (Bsp.1 und 4) funktioniert der Befehl _GUICtrlListView_EnsureVisible ja auch ohne diese Operation ?(

    Grüße autoiter

  • Hi,

    Hier mal kurz meine Schlussfolgerung:

    Dein Beispiel 2 funktioniert wenn man den richtigen Datentyp nimmt:

    AutoIt
    _GUICtrlListView_EnsureVisible($idListview, Int($aItems[$iListposition]))


    Dass es bei Beispiel 3 funktioniert liegt vermutlich daran dass bei einem Hwnd die Funktion _SendMessage() benützt wird:

    AutoIt
    Func _SendMessage($hWnd, $iMsg, $wParam = 0, $lParam = 0, $iReturn = 0, $wParamType = "wparam", $lParamType = "lparam", $sReturnType = "lresult")
    	Local $aResult = DllCall("user32.dll", $sReturnType, "SendMessageW", "hwnd", $hWnd, "uint", $iMsg, $wParamType, $wParam, $lParamType, $lParam)
    	If @error Then Return SetError(@error, @extended, "")
    	If $iReturn >= 0 And $iReturn <= 4 Then Return $aResult[$iReturn]
    	Return $aResult
    EndFunc   ;==>_SendMessage


    Dort wird dann beim DllCall der richtige Datentyp mitgegeben, deshalb klappt das.
    Wenn du die Id mitgibst wird stattdessen GUICtrlSendMsg() benützt, welche dann einen String mitgibt, damit kann dann das Control nichts anfangen.

    mfg
    Zeitriss

    Einmal editiert, zuletzt von Zeitriss (25. Oktober 2016 um 19:40)

  • Hey @Zeitriss

    Tatsache, das funktioniert auch in meinem echten Skript. Ich danke dir für die Erklärung dazu! In AutoIt muss man sich so selten um den Datentyp kümmern, dass ich auf diese Lösung sicher nicht gekommen wäre. Ich bin eben auf einem anderen Niveau unterwegs, als die Leute, die sich darüber unterhalten, ob und wie sie besser, als der Compiler programmieren können ^^

    Danke @Zeitriss, @Oscar :thumbup:

    Grüße autoiter