• Momentan hantiere ich viel mit Listviews und bin dabei auf einige Fehler gestoßen, die ich hier aufzeigen möchte, um anderen Usern damit viel Zeit zu ersparen und das Leben zu erleichtern.

    Zuerst ein "funktioneller" Gruß an water - damit er das hier auch liest... ;)

    Ich liste die Fehler hier in der Reihenfolge auf, in der ich sie gefunden habe.

    #1 Fehler in den Beispielen bei _DebugPrint, die $tagNMITEMACTIVATE verwenden

    _GUICtrlListView_Create, _GUICtrlListView_GetHotItem, _GUICtrlListView_GetHoverTime, _GUICtrlListView_CancelEditLabel, _GUICtrlListView_EditLabel, _GUICtrlListView_SetHoverTime, _GUICtrlListView_GetEditControl, _GUICtrlListView_HitTest, _GUICtrlListView_SubItemHitTest, _GUICtrlListView_ClickItem

    DllStructGetData schlägt fehlt, weil ActionX/ActionY in $tagNMITEMACTIVATE ($tInfo) nicht gefunden werden kann - bei $tagNMLISTVIEW wäre ActionX/ActionY jedoch richtig!

    $tagNMLISTVIEW

    struct;hwnd hWndFrom;uint_ptr IDFrom;INT Code;endstruct;int Item;int SubItem;uint NewState;uint OldState;uint Changed;struct;long ActionX;long ActionY;endstruct;lparam Param

    $tagNMITEMACTIVATE

    struct;hwnd hWndFrom;uint_ptr IDFrom;INT Code;endstruct;int Index;int SubItem;uint NewState;uint OldState;uint Changed;struct;long X;long Y;endstruct;lparam lParam;uint KeyFlags

    #2 $NM_RETURN (list view) notification code

    $NM_RETURN kann mit WM_NOTIFY NICHT abgefangen werden - scheint ein Fehler im System zu sein...

    Worakround: Accelerator für "{ENTER}" erstellen und in WM_COMMAND abfangen.

    Dazu gibt es bereits Posts, in denen auch andere Lösungen zu finden sind:

    Listview - Reagiert nicht auf die Enter-Taste

    Der Worakround von nuts ist... ok, Bein amputieren ist schlimmer... aber nicht viel. 8o

    https://www.autoitscript.com/forum/topic/83…-via-wm_notify/

    NM_RETURN (list view) notification code

    #3 $LVN_KEYDOWN ; Notifies a list-view control's parent window that a key has been pressed.

    Der Grund dafür könnte sein, dass die Struktur $tagNMLVKEYDOWN in AutoIt mit "align 1;" ausgerichtet wird, von Microsoft aber nicht.

    Global Const $tagNMLVKEYDOWN = "align 1;struct;hwnd hWndFrom;uint_ptr IDFrom;INT Code;endstruct;word VKey;uint Flags" ; AutoIt

    Global Const $tagFIXEDNMLVKEYDOWN = "struct;hwnd hWndFrom;uint_ptr IDFrom;INT Code;endstruct;word VKey;uint Flags" ; Microsoft

    Falls jemand Probleme mit $LVN_KEYDOWN hat, dann einfach mal die Fixed-Version verwenden...

    #4 Func _GUICtrlListView_HitTest, _GUICtrlListView_InsertMarkHitTest, _GUICtrlListView_SubItemHitTest

    In allen drei Funktionen wird ein Handle in $hWnd erwartet... wird eine ControlID übergeben, kommt es zu Fehlern.

    _GUICtrlListView_HitTest, _GUICtrlListView_InsertMarkHitTest

    Local $aResult = DllCall("user32.dll", "bool", "ScreenToClient", "hwnd", $hWnd, "struct*", $tPoint) ; Fehler, wenn $hWnd kein Handle ist!

    _GUICtrlListView_SubItemHitTest (wenn $iX oder $iY = -1)

    If $iX = -1 Then $iX = _WinAPI_GetMousePosX(True, $hWnd) ; Fehler, wenn $hWnd kein Handle ist!

    If $iY = -1 Then $iY = _WinAPI_GetMousePosY(True, $hWnd) ; Fehler, wenn $hWnd kein Handle ist!

    Edit: Wobei das hier aber kein Fehler ist, da im Header der Funktion steht, das in $hWnd ein Handle sein muss.

    #5 $LVN_BEGINLABELEDIT, $LVN_ENDLABELEDIT und $LVN_GETINFOTIP

    Diese Cases sind in den bei #1 genannten Beispielen in der Funktion WM_NOTIFY zwar auskommentiert, würden aber einen Fehler produzieren, weil es die Konstanten nicht gibt.

    Richtig wäre:

    Case $LVN_BEGINLABELEDITA, Case $LVN_BEGINLABELEDITW

    Case $LVN_ENDLABELEDITA, Case $LVN_ENDLABELEDITW

    Case $LVN_GETINFOTIPA, Case $LVN_GETINFOTIPW

    3 Mal editiert, zuletzt von Bitnugger (29. Dezember 2020 um 08:05)

  • Gruß ist angekommen ;)