GetSelectedIndices -> controlid

  • Guten Morgen allerseits ;)

    Ich brauche die controlid (/ identifier) der mit

    [autoit]

    _GUICtrlListView_GetSelectedIndices

    [/autoit]

    selektierten Items...


    Ausnahmsweise mal eine kurze und klare Aufgabenstellung ;)
    Hau mich dann mal hin, und hoffe mal auf eine Antwort.

    mfg,
    dankeschön

    Zitat

    Programmieren ist so lange lustig bis ein Fehler auftritt!


    ~ Dankeschön

    Einmal editiert, zuletzt von Dankeschön (15. November 2010 um 16:32)

    • Offizieller Beitrag

    Mit _GUICtrlListView_GetSelectedIndices bekommst du den Index des selektierten Eintrages.
    Was willst du den genau machen? Wofür soll ein Controlid zu nutze sein?
    Mit dem Index kannst du fast alles in den UDF Funktionen machen.

  • Hallo DankeSchön,

    hier eine Methode um über den Index an die ID zu kommen:

    Spoiler anzeigen

    Skript entfernt neue Version siehe [ offen ] GetSelectedIndices -> controlid

    diese Methode funktioniert aber leider nur wenn der Text des Items eindeutig ist. Aber wie Raupi schon schrieb ist die ID unnötig, da alle _GUICtrlListView_ Funktionen die LV-Items betreffen auf dem Index aufbauen,

    mfg autoBert

    Einmal editiert, zuletzt von autoBert (15. November 2010 um 03:42)

    • Offizieller Beitrag

    autoBert, ich versteh dein Beispiel jetz mal überhaupt nicht.

    Das Ausgabelistview ist durchnummeriert und deine Control-Id's sind eigentlich die Indexeinträge welche selektiert sind.
    Das hat nichts mir der ControlId zu tun.

    Ausgehend von deinem Script könne die "ControlID's " Schon nicht stimmen,da das Listview selbst schon ContolID 3 hat.
    Mal ganz davon abgesehen, das die Controlid`s der Listvieweinträge unwichtig sind, weil sie per GUIGetMsg sowieso nicht ausgewertet werden können.
    Beim erstellen von Einträgen mit _GUICtrlListView_AddItem wird sowieso kein Controlid erzeugt, die Rückgabe ist der Indexeintrag.

  • Hallo Raupi ,

    Beim erstellen von Einträgen mit _GUICtrlListView_AddItem wird sowieso kein Controlid erzeugt, die Rückgabe ist der Indexeintrag.

    dies habe ich leider nicht in der Hilfe nachgeschlagen, dadurch ist das obige Skript für den Papierkorb da ich von der ControlID als Rückgabe ausging.

    Hier eine geänderte Version, die Einträge erzeuge ich jetzt mit GUICtrlCreateListViewItem:

    [spoiler][autoit];#AutoIt3Wrapper_au3check_parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6
    #include <GuiConstantsEx.au3>
    #include <GuiListView.au3>
    #include <Array.au3>

    Opt('MustDeclareVars', 1)

    $Debug_LV = False ; Check ClassName being passed to ListView functions, set to True and use a handle to another control to see it work

    _Main()

    Func _Main()
    Local $hListView, $aRes, $lvItems[10], $aRes2[1][2], $msg

    GUICreate("ListView Get Selected Indices", 400, 300)
    $hListView = GUICtrlCreateListView("", 2, 2, 394, 268, BitOR($LVS_SHOWSELALWAYS, $LVS_REPORT))
    GUISetState()
    ; Add columns
    _GUICtrlListView_AddColumn($hListView, "Column 1", 100)

    ; Add items
    For $i = 0 To 9
    $lvItems[$i] = GUICtrlCreateListViewItem("Item " & $i,$hListView)
    If Random(0, 1, 1) = 1 Then
    _GUICtrlListView_SetItemSelected($hListView, $i) ; Select this item
    ConsoleWrite("ControlId: " & $lvItems[$i] & " ist selktiert!" & @CRLF)
    Else
    ;Item is not selected
    EndIf
    Next
    $aRes = _GUICtrlListView_GetSelectedIndices($hListView, True)
    Local $j = $aRes[0], $s1, $s2
    ReDim $aRes2[$j + 1][2]
    For $i = 1 To UBound($aRes) - 1
    $s1 = _GUICtrlListView_GetItemText($hListView, $aRes[$i])
    For $j = 0 To 9
    $s2 = _GUICtrlListView_GetItemText($hListView, $j)
    If $s1 = $s2 Then
    $aRes2[$i][0] = $i
    $aRes2[$i][1] = $j+$lvItems[0]
    EndIf
    Next
    Next
    $aRes2[0][0] = "Index"
    $aRes2[0][1] = "Control-ID"
    _ArrayDisplay($aRes2)
    ; Loop until user exits
    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE
    GUIDelete()
    EndFunc ;==>_Main
    [autoit][spoiler]anhand der Kontrolausgabe der IDs in der Konsole siehst du dass diese mit dem ArrayDisplay übereinstimmen. Mir fällt aber auch kein Grund ein die ControlID eines LV-Items zu ermitteln ein, da alle mir bekannten Funktionen zu LV-Items mit dem Index arbeiten,

    mfg autoBert

    • Offizieller Beitrag

    Mir fällt aber auch kein Grund ein die ControlID eines LV-Items zu ermitteln ein, da alle mir bekannten Funktionen zu LV-Items mit dem Index arbeiten,

    Mir fällt schon ein Grund ein: Wenn man einzelne Listview-Einträge farblich markieren will (z.B. mit GUICtrlsetBkColor), benötigt man die Control-ID. Das habe ich bei meinem Starplayer benutzt, um das aktuelle Lied zu markieren.
    Ich kenne aber auch nur die Möglichkeit alle Control-IDs in einem Array zu speichern. Der LV-Index entspricht dann dem Index im Array.

  • Hallo,

    wenn es um selektierte Einträge geht, geht schon was, wenn auch nicht übermäßig elegant:

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    #include <GUIConstantsEx.au3>
    #include <ListViewConstants.au3>

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

    $hGUI = GUICreate("ListView", 600, 400)
    $idLV = GUICtrlCreateListView("ListView", 10, 10, 580, 290, $LVS_SHOWSELALWAYS)
    For $I = 0 To 30
    GUICtrlCreateListViewItem("Item " & $I, $idLV)
    Next
    $idBtn = GUICtrlCreateButton(" Auswahl anzeigen ", 10, 310)
    GUISetState()

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

    While True
    Switch GUIGetMsg()
    Case $idBtn
    $aSelected = _GetSelected($hGUI, $idLV)
    _ArrayDisplay($aSelected, "Selected Items", -1, 0, "", "", "Row|Item|ID")
    Case $GUI_EVENT_CLOSE
    ExitLoop
    EndSwitch
    WEnd

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

    Exit

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

    Func _GetSelected($hGUI, $idLV)
    Local $iSelected = ControlListView($hGUI, "", $idLV, "GetSelectedCount")
    Local $aSelected[$iSelected + 1][2] = [[$iSelected, 0]]
    If $iSelected = 0 Then Return $aSelected
    GUISetState(@SW_LOCK, $hGUI)
    Local $sSelected = ControlListView($hGUI, "", $idLV, "GetSelected", 1)
    Local $aSplit = StringSplit($sSelected, "|")
    For $I = 1 To $aSplit[0]
    $aSelected[$I][0] = $aSplit[$I]
    $aSelected[$I][1] = GUICtrlRead($idLV)
    ControlListView($hGui, "", $idLV, "DeSelect", $aSplit[$I])
    Next
    For $I = 1 To $aSplit[0]
    ControlListView($hGUI, "", $idLV, "Select", $aSplit[$I])
    Next
    GUISetState(@SW_UNLOCK, $hGUI)
    Return $aSelected
    EndFunc

    [/autoit]


    Ob das Sinn macht, steht auf einem anderen Blatt. ;)

  • autoBert & Raupi:
    1. Einfärben, da hat Oscar schonmal recht.
    2. Habe ich bereits mein hunderte Zeilen langes Skript auf den normalen control-id´s aufgebaut, und die UDF nie verwendet. Natürlich habe ich nun keine Lust, nur für die Mehrfachauswahl alles neuzuschreiben...

    autoBert:
    So hätte ich es auch gemacht, aber die Fehleranfälligkeit aufgrund gleicher Strings, und der größere Zeitverbrauch leitet mich weiter an...

    @Großvater:
    Danke, das funktioniert super, und sieht auch noch relativ ressourcensparend aus.
    Den Befehl kannte ich nichtmals ;)


    Danke euch daher,
    mfg,
    dankeschön

    Zitat

    Programmieren ist so lange lustig bis ein Fehler auftritt!


    ~ Dankeschön

    • Offizieller Beitrag

    @Großvater.

    Super Funktion, werde ich gleich mal archivieren. Ich benutze zwar meist kein StandardLIstview aber für kurze Scripte mit ein bischen LIstview sehr brauchbar :thumbup: