Angeklickte ListView ermitteln (@GUI_CtrlId??)

  • Hi,

    ich hab in meinem Projekt mehrere ListViews drin und möchte - wenn ein Eintrag in einer ListView angeklickt wird, ermitteln um welche ListView es sich handelt.

    Mein Plan wäre, über das Macro @GUI_CtrlId die ID auszulesen.
    Problem: Mir ist aufgefallen, dass sich die ID anscheinend ändert, sobald man irgendein neues CTRL-Element ins Script einbaut (z.B. nen neuen Button).

    Gibt es auch eine andere Möglichkeit, herauszufinden, welche ListView angeklickt wurde?

    Viele Grüße

    Daniel

    Einmal editiert, zuletzt von basementmedia (30. November 2010 um 10:52)

  • Hallo basementmedia,

    herzlich willkommen im Forum und viel Spass mit AutoIt.

    Hier kannst du dir die Hilfe herunterladen.
    Hier gibt es ein AutoIt-Tutorial: http://wiki.autoit.de/wiki/index.php/TutorialSehr hilfreich ist auch das Buch von peethebee

    und jetzt zu deinem Problem, da du @GuiCtrlId verwendest gehe ich davon aus, das du im OnEvent-Modus skriptest, sonst würde es ja einen Fehler hervorrufen. Hier eine andere Möglichkeit mit der du den Klick auswerten kannst:

    Spoiler anzeigen
    [autoit]

    #include <StaticConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #Include <GuiListView.au3>

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

    Opt("GUIOnEventMode", 1)

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

    #cs ----------------------------------------------------------------------------

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

    AutoIt Version: 3.3.6.1
    Author: autoBert: http://www.autoit.de/index.php?page=Thread&threadID=24279

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

    Skriptbeispiel für den Umgang mit INI-Files und in Array verwalteten ControlIDS
    #ce ----------------------------------------------------------------------------

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

    Global $idLV[4]

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

    $hGUI = GUICreate("LV-Test", 800, 500)
    GUISetOnEvent($GUI_EVENT_CLOSE,"_MYEXIT")
    GUICtrlCreateTab(2,5,796,495)
    for $i = 0 to 3
    GUICtrlCreateTabItem("Tab-Item " & $i+1)
    Switch $i
    case 0
    $sLvHeader = "Spalte 1|Spalte 2"
    case 1
    $sLvHeader = "Test 1|Test 2|Test 3"
    case 2
    $sLvHeader = "a1|b|c|d"
    case 3
    $sLvHeader = "Spalte 1|Spalte 2"
    EndSwitch
    $idLV[$i] = GUICtrlCreateListView($sLvHeader,5,35,790,400)
    $k = Random(0,15,1)
    for $j = 0 to $k
    GUICtrlCreateListViewItem(" Item " & $j & " von LV: " & $i,$idLV[$i])
    Next
    _GUICtrlListView_SetColumnWidth($idLV[$i],0,300)a
    Next
    GUICtrlCreateTabItem("")
    GUISetState()
    GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY") ;<=========================================== Bemachrichtigung Doppelklick

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

    While 1
    sleep(10000)
    WEnd

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

    Func WM_NOTIFY($hWnd, $MsgID, $wParam, $lParam)
    Local $tagNMHDR, $event, $hwndFrom, $code, $LV
    $tagNMHDR = DllStructCreate("int;int;int", $lParam)
    If @error Then Return 0
    $code = DllStructGetData($tagNMHDR, 3)
    Switch $wParam
    Case $idLV[0]
    $LV = $idLV[0]
    Case $idLV[1]
    $LV = $idLV[1]
    Case $idLV[2]
    $LV = $idLV[2]
    Case $idLV[3]
    $LV = $idLV[3]
    EndSwitch
    If $wParam = $LV Then
    ;ConsoleWrite($code & @CRLF)
    Switch $code
    ;case -3 ;DoppelKlick
    Case -2 ;Klick
    If _GUICtrlListView_GetSelectedCount($LV) > 0 Then
    For $i = 0 To _GUICtrlListView_GetItemCount($LV)
    If _GUICtrlListView_GetItemSelected($LV, $i) Then
    $aItem = _GUICtrlListView_GetItemTextArray($LV, $i)
    MsgBox(0, "Doppel-Klick auf ", $aItem[1] & @CRLF & @CRLF & $aItem[2],9,$hGUI)
    EndIf
    Next
    EndIf
    EndSwitch
    EndIf
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_NOTIFY
    Func _MYExit()
    Exit
    EndFunc

    [/autoit]

    Das Schema lässt sich aber auch auf @GuiCtrlID umsetzen, falls du weiter Fragen hast poste doch bitte dein Skript

    mfg autoBert

  • Hi Bernd,

    dankeschön. Skript funktioniert wunderbar und macht das was ich brauch ;)
    Es war aber ein kleiner Fehler drin (ein "a" in Zeile 39). Sonst aber perfekt :)

    Spoiler anzeigen
    [autoit]


    #include <StaticConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #Include <GuiListView.au3>

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

    Opt("GUIOnEventMode", 1)

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

    #cs ----------------------------------------------------------------------------

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

    AutoIt Version: 3.3.6.1
    Author: autoBert: http://www.autoit.de/index.php?page=Thread&threadID=24279

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

    Skriptbeispiel für den Umgang mit INI-Files und in Array verwalteten ControlIDS
    #ce ----------------------------------------------------------------------------

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

    Global $idLV[4]

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

    $hGUI = GUICreate("LV-Test", 800, 500)
    GUISetOnEvent($GUI_EVENT_CLOSE,"_MYEXIT")
    GUICtrlCreateTab(2,5,796,495)
    for $i = 0 to 3
    GUICtrlCreateTabItem("Tab-Item " & $i+1)
    Switch $i
    case 0
    $sLvHeader = "Spalte 1|Spalte 2"
    case 1
    $sLvHeader = "Test 1|Test 2|Test 3"
    case 2
    $sLvHeader = "a1|b|c|d"
    case 3
    $sLvHeader = "Spalte 1|Spalte 2"
    EndSwitch
    $idLV[$i] = GUICtrlCreateListView($sLvHeader,5,35,790,400)
    $k = Random(0,15,1)
    for $j = 0 to $k
    GUICtrlCreateListViewItem(" Item " & $j & " von LV: " & $i,$idLV[$i])
    Next
    _GUICtrlListView_SetColumnWidth($idLV[$i],0,300)
    Next
    GUICtrlCreateTabItem("")
    GUISetState()
    GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY") ;<=========================================== Bemachrichtigung Doppelklick

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

    While 1
    sleep(10000)
    WEnd

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

    Func WM_NOTIFY($hWnd, $MsgID, $wParam, $lParam)
    Local $tagNMHDR, $event, $hwndFrom, $code, $LV
    $tagNMHDR = DllStructCreate("int;int;int", $lParam)
    If @error Then Return 0
    $code = DllStructGetData($tagNMHDR, 3)
    Switch $wParam
    Case $idLV[0]
    $LV = $idLV[0]
    Case $idLV[1]
    $LV = $idLV[1]
    Case $idLV[2]
    $LV = $idLV[2]
    Case $idLV[3]
    $LV = $idLV[3]
    EndSwitch
    If $wParam = $LV Then
    ;ConsoleWrite($code & @CRLF)
    Switch $code
    ;case -3 ;DoppelKlick
    Case -2 ;Klick
    If _GUICtrlListView_GetSelectedCount($LV) > 0 Then
    For $i = 0 To _GUICtrlListView_GetItemCount($LV)
    If _GUICtrlListView_GetItemSelected($LV, $i) Then
    $aItem = _GUICtrlListView_GetItemTextArray($LV, $i)
    MsgBox(0, "Doppel-Klick auf ", $aItem[1] & @CRLF & @CRLF & $aItem[2],9,$hGUI)
    EndIf
    Next
    EndIf
    EndSwitch
    EndIf
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_NOTIFY
    Func _MYExit()
    Exit
    EndFunc

    [/autoit]

    Viele Grüße

    Daniel

    Edit Oscar: Spoiler gesetzt.

    Einmal editiert, zuletzt von Oscar (30. November 2010 um 10:41)

  • Hallo,

    die AU3-Listviews sind gesprächiger, als ich erwartet hätte. Ein Teil der Klickerkennung lässt sich auch so lösen:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <ListviewConstants.au3>

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

    Opt('GUIOnEventMode', 1)

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

    GUICreate("ListViews", 600, 365)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
    $idLV1 = GUICtrlCreateListView("Listview1|Zeile", 0, 0, 300, 300)
    GUICtrlSetOnEvent(-1, "_LV1_HeaderClicked")
    For $I = 1 to 20
    GUICtrlCreateListViewItem("Listview1|Zeile" & $I, $idLV1)
    GUICtrlSetOnEvent(-1, "_LV1_ItemSelected")
    Next
    $idLV2 = GUICtrlCreateListView("Listview2|Zeile", 300, 0, 300, 300)
    GUICtrlSetOnEvent(-1, "_LV2_HeaderClicked")
    For $I = 1 to 20
    GUICtrlCreateListViewItem("Listview2|Zeile" & $I, $idLV2)
    GUICtrlSetOnEvent(-1, "_LV2_ItemSelected")
    Next
    GUICtrlCreateButton("GetSelected LV1", 0, 320, 300, 25)
    GUICtrlSetOnEvent(-1, "_LV1_GetSelected")
    GUICtrlCreateButton("GetSelected LV2", 300, 320, 300, 25)
    GUICtrlSetOnEvent(-1, "_LV2_GetSelected")
    GUISetState()

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

    While True
    Sleep(1000)
    WEnd
    Exit

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

    Func _LV1_HeaderClicked()
    ToolTip("Click on LV1 Header")
    AdlibRegister("_KillToolTip", 2000)
    EndFunc

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

    Func _LV1_ItemSelected()
    ToolTip("LV1 Item selected:" & @CRLF & @CRLF & GUICtrlRead(@GUI_CtrlId, 1) & @CRLF)
    AdlibRegister("_KillToolTip", 2000)
    EndFunc

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

    Func _LV1_GetSelected()
    ToolTip("LV1 selected Item:" & @CRLF & @CRLF & GUICtrlRead(GUICtrlRead($idLV1), 1) & @CRLF)
    AdlibRegister("_KillToolTip", 2000)
    EndFunc

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

    Func _LV2_HeaderClicked()
    ToolTip("Click on LV2 Header")
    AdlibRegister("_KillToolTip", 2000)
    EndFunc

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

    Func _LV2_ItemSelected()
    ToolTip("LV2 Item selected:" & @CRLF & @CRLF & GUICtrlRead(@GUI_CtrlId, 1) & @CRLF)
    AdlibRegister("_KillToolTip", 2000)
    EndFunc

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

    Func _LV2_GetSelected()
    ToolTip("LV2 selected Item:" & @CRLF & @CRLF & GUICtrlRead(GUICtrlRead($idLV2), 1) & @CRLF)
    AdlibRegister("_KillToolTip", 2000)
    EndFunc

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

    Func _KillToolTip()
    AdlibUnRegister("_KillToolTip")
    ToolTip("")
    EndFunc

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

    Func _Exit()
    Exit
    EndFunc

    [/autoit]
  • Hi,

    dankeschön.
    Ist schon witzig: Gestern dachte ich noch, es gibt keine Lösung und nun hab ich schon zwei ;)

    Viele Grüße

    Daniel

  • Innerhalb der Funktionen, die über GUIRegisterMsg aufgerufen werden, sollte man übrigens das Skript nicht anhalten (msgbox).
    Nur als Zusatzinfo, falls du dich für die Lösung von autobert entscheidest.