Doppelklick bei mehreren Listviews ?

  • Heyho,

    ich hab eine GUI mit 3 ListViews (wegen der Übersicht).
    Irgendwo hab ich mal eine Funktion gefunden, die mir die Doppelklicks dafür bereitstellt (unglückliche Formulierung, ich weiss :huh: )

    Testscript
    [autoit]

    #include <GuiListView.au3>

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

    Global $hInput, $hListview_1, $hListview_2, $hListview_3

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

    GUICreate("TestGUI", 240, 300)
    $hListview_1 = GUICtrlCreateListView("View 1|Spalte 2|Spalte 3", 8, 10, 225, 70)
    GUICtrlCreateListViewItem("Zeile 1a|Test 1a|Text 1a", $hListview_1)
    GUICtrlCreateListViewItem("Zeile 1b|Test 1b|Text 1b", $hListview_1)

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

    $hListview_2 = GUICtrlCreateListView("View 2|Spalte 1|Spalte 2", 8, 90, 225, 70)
    GUICtrlCreateListViewItem("Zeile 2a|Test 2a|Text 2a", $hListview_2)
    GUICtrlCreateListViewItem("Zeile 2b|Test 2b|Text 2b", $hListview_2)

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

    $hListview_3 = GUICtrlCreateListView("View 3|Spalte 1|Spalte 2", 8, 170, 225, 70)
    GUICtrlCreateListViewItem("Zeile 3a|Test 3a|Text 3a", $hListview_3)
    GUICtrlCreateListViewItem("Zeile 3b|Test 3b|Text 3b", $hListview_3)

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

    $hInput = GUICtrlCreateInput("", 8, 260, 225, 20, 0x0800)

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

    GUIRegisterMsg(0x004E, "WM_NOTIFY")
    GUISetState()

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

    Do
    Sleep(50)
    Until GUIGetMsg() = -3

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

    Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
    Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView
    Local $hListview = $hListview_1 ;==> eingefügt, dammit ein ListView erkannt wird
    $hWndListView = $hListview
    If Not IsHWnd($hListview) Then $hWndListView = GUICtrlGetHandle($hListview)
    $tNMHDR = DllStructCreate("hwnd hWndFrom;uint_ptr IDFrom;INT Code", $lParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")
    If $hWndFrom = $hWndListView Then
    If $iCode = -3 Then
    $tInfo = DllStructCreate("hwnd hWndFrom;uint_ptr IDFrom;INT Code;int Item;int SubItem;" & _
    "uint NewState;uint OldState;uint Changed;long ActionX;long ActionY;lparam Param", $lParam)

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

    $iIndex = DllStructGetData($tInfo, "Item")
    GUICtrlSetData($hInput, _GUICtrlListView_GetItemText($hWndListView, $iIndex))
    EndIf
    EndIf
    Return 'GUI_RUNDEFMSG'
    EndFunc ;==>WM_NOTIFY

    [/autoit]


    Ich will, dass bei Doppelklick auf eines der 3 ListViews die erste Spalte ausgelesen wird, damit ich die erhaltene Info weiter verarbeiten kann.
    Leider klappt das mal wieder nicht wie gewünscht. Ich versuchte erst, in Zeile 29 des Testscripts diesen Code:

    [autoit]

    Local $hListview = $hListview_1 And $hListview_2 And $hListview_3

    [/autoit]

    danach

    [autoit]

    Local $hListview = $hListview_1 Or $hListview_2 Or $hListview_3

    [/autoit]

    ... beides erfolglos... danach versuchte ich, die Funktion WM_NOTIFY 3 mal einzubauen, natürlich mit 3 verschiedenen Namen und
    hab die auch registriert und bei jedem der 3 Notifies jeweils ein anderes ListView eingebaut, aber auch das war erfolglos... 8|

    Wie muss diese Funktion umgeschrieben werden, damit, egal in welchem ListView ich grad geklickt habe, ich den Inhalt der 1. Spalte zum Weiterverarbeiten bekomme?


    Grüße vom Lottich

    • Offizieller Beitrag
    Spoiler anzeigen
    [autoit]

    #include <GuiListView.au3>
    #include <WinAPI.au3>
    #region - Timestamp
    ; 2013-03-17 07:02:08
    #endregion - Timestamp

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

    Global $hInput, $hListview_1, $hListview_2, $hListview_3

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

    GUICreate("TestGUI", 240, 300)
    $hListview_1 = GUICtrlCreateListView("View 1|Spalte 2|Spalte 3", 8, 10, 225, 70)
    GUICtrlCreateListViewItem("Zeile 1a|Test 1a|Text 1a", $hListview_1)
    GUICtrlCreateListViewItem("Zeile 1b|Test 1b|Text 1b", $hListview_1)

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

    $hListview_2 = GUICtrlCreateListView("View 2|Spalte 1|Spalte 2", 8, 90, 225, 70)
    GUICtrlCreateListViewItem("Zeile 2a|Test 2a|Text 2a", $hListview_2)
    GUICtrlCreateListViewItem("Zeile 2b|Test 2b|Text 2b", $hListview_2)

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

    $hListview_3 = GUICtrlCreateListView("View 3|Spalte 1|Spalte 2", 8, 170, 225, 70)
    GUICtrlCreateListViewItem("Zeile 3a|Test 3a|Text 3a", $hListview_3)
    GUICtrlCreateListViewItem("Zeile 3b|Test 3b|Text 3b", $hListview_3)

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

    $hInput = GUICtrlCreateInput("", 8, 260, 225, 20, 0x0800)
    Global $hWndListView1 = GUICtrlGetHandle($hListview_1) ;Erstelle die Listhandles Global, das spart Zeit weil die Handles nich bei jedem Aufruf von WM_NOTIFY abgefragt werden müssen
    Global $hWndListView2 = GUICtrlGetHandle($hListview_2)
    Global $hWndListView3 = GUICtrlGetHandle($hListview_3)
    GUIRegisterMsg(0x004E, "WM_NOTIFY")
    GUISetState()

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

    Do
    Sleep(50)
    Until GUIGetMsg() = -3

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

    Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
    Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR
    $tNMHDR = DllStructCreate("hwnd hWndFrom;uint_ptr IDFrom;INT Code", $lParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")
    If $hWndFrom = $hWndListView1 Or $hWndFrom = $hWndListView2 Or $hWndFrom = $hWndListView3 Then
    If $iCode = -3 Then
    $tInfo = DllStructCreate("hwnd hWndFrom;uint_ptr IDFrom;INT Code;int Item;int SubItem;" & _
    "uint NewState;uint OldState;uint Changed;long ActionX;long ActionY;lparam Param", $lParam)

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

    $iIndex = DllStructGetData($tInfo, "Item")
    GUICtrlSetData($hInput, _GUICtrlListView_GetItemText(_WinAPI_GetDlgCtrlID($hWndFrom), $iIndex));
    EndIf
    EndIf
    Return 'GUI_RUNDEFMSG'
    EndFunc ;==>WM_NOTIFY

    [/autoit]
  • Danke Raupi :thumbup:

    da lag ich ja mit dem Or ja doch nicht so falsch ;)

    Ist jetzt zwar gelöst, aber eine Frage hab ich dennoch. Kann man das auch so umschreiben, dass ich das gleiche Ergebnis auch mit einem einfachen Linksklick erreichen kann?
    ich werd zwar versuchen, dass auf eigene Faust hinzubekommen, doch ich bin mir sicher, dass ich es nicht hinkriegen werde :whistling:


    Edit:
    Lösung doch gefunden :)
    einfach aus der -3 eine -2 gemacht...

    Vielen dank Raupi :thumbup:

    • Offizieller Beitrag

    Kann man das auch so umschreiben, dass ich das gleiche Ergebnis auch mit einem einfachen Linksklick erreichen kann?


    Steht doch alles in der Hilfe (UDF _GUICtrlListview_Create )
    Dort findest du in der $iCode-Auswertung etwa dieses:

    [autoit]

    Case $NM_CLICK ; Sent by a list-view control when the user clicks an item with the left mouse button
    Local $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
    Local $aInfo[12] = [$hWndFrom, _
    $iIDFrom, _
    $iCode, _
    DllStructGetData($tInfo, "Index"), _
    DllStructGetData($tInfo, "SubItem"), _
    DllStructGetData($tInfo, "NewState"), _
    DllStructGetData($tInfo, "OldState"), _
    DllStructGetData($tInfo, "Changed"), _
    DllStructGetData($tInfo, "ActionX"), _
    DllStructGetData($tInfo, "ActionY"), _
    DllStructGetData($tInfo, "lParam"), _
    DllStructGetData($tInfo, "KeyFlags")]

    [/autoit]
  • BugFix :

    Ja, da hast du recht. Doch so geil und hilfreich die AutoIt-Hilfe auch ist, hat sie doch einen kleinen Haken:
    Sie ist so verdammt groß und Umfangreich, dass man manchmal gar nicht weiss, wo man die richtigen Infos herbekommt.

    Ich wollte das in meinem Projekt eigentlich über Doppelklick lösen, die Möglichkeit, das Ganze per einfachen Linksklick zu machen kam mir erst im Nachhinein.
    Das eigentliche Script, wo ich das brauch, wird mehrere 1000 Zeilen Code enthalten. Das weiss ich bereits mit Sicherheit. Und daher ist für mich die Lösung über WM_NOTIFY
    am Sinvollsten, denn jede gesparte Zeile Code wird für mich Gold wert sein. :D