ListView - Mehrere Items auslesen

  • Tag zusammen.

    Ich erstelle ein ListView wiefolgt, damit mehrere Items ausgewählt werden können :

    [autoit]

    GUICtrlCreateListView("Nummer",5,5,390,480,BitOR(0x0008,0x0010,0x0001))

    [/autoit]

    Nun habe ich bisher immer so den Inhalt des ausgewählten Listviews ausgelesen:

    [autoit]

    $read = StringTrimRight(GUICtrlRead(GUICtrlRead($nummerliste)),1)

    [/autoit]

    Das funktioniert bei einem item gut, bei mehreren wird aber nur das erste Item genommen.

    Jemand ne Idee ?

    mfg,
    dankeschön

    Zitat

    Programmieren ist so lange lustig bis ein Fehler auftritt!


    ~ Dankeschön

    Einmal editiert, zuletzt von Dankeschön (1. September 2010 um 21:49)

  • Ah, danke.

    Hatte die Funktion zwar gefunden,
    aber sie schien mir nur per selbst erstellter UDF-Listview zu funktionieren...

    Geht nun...
    thx so far

    //edit:
    Zu früh gefreut:

    [autoit]

    $read = _GUICtrlListView_GetSelectedIndices($nummerliste)
    ConsoleWrite($read & "-")
    Local $endstring
    $splitta = StringSplit($read,"|")
    If @error Then
    ConsoleWrite("1-")
    $read = _GUICtrlListView_GetItemTextString($nummerliste,$read)
    Else
    ConsoleWrite("2-")
    For $prep = 1 To $splitta[0]
    $endstring = $endstring & _GUICtrlListView_GetItemTextString($nummerliste,$splitta[$prep]) & "|"
    Next
    $read = StringTrimRight($endstring,1)
    EndIf
    ConsoleWrite($read & @crlf)

    [/autoit]

    ==> Output :

    Zitat

    0-1-
    1-1-


    Wird also nicht richtig ausgelesen.
    Interessanetrweise funktioniert das, wenn ich als Parameter einen festen Wert eingebe...

    Jemand ne Ahnung ?

    Zitat

    Programmieren ist so lange lustig bis ein Fehler auftritt!


    ~ Dankeschön

    Einmal editiert, zuletzt von Dankeschön (31. August 2010 um 23:25)

  • Hallo Dankeschön,

    warum splitest du den erhaltenen String zuerst um dann manuell wieder das Separator-Zeichen einzufügen? Du kannst doch gleich den ganzen String wegschreiben.

    Hier ein Beispiel zu LV in dem das lesen mehrere Items vorkommt:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <GUIConstants.au3>
    #include <WindowsConstants.au3>
    #include <GuiListView.au3>
    #include <ListViewConstants.au3>
    #include <File.au3>

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

    ;#include <array.au3>

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

    Local $tZeit, $s1, $s2

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

    $main = GUICreate("Test Drag & Drop from LV1 to LV2 DblClick in LV1 with ContextMenu in LV1 (copies to ClipBoard", 600, 400)
    $listview = GUICtrlCreateListView("Gruppe1| BlubText", 10, 10, 200, 100, BitOR($LVS_REPORT, $LVS_SHOWSELALWAYS), BitOR($LVS_EX_FULLROWSELECT, $WS_EX_CLIENTEDGE))
    GUICtrlSetBkColor(-1, $GUI_BKCOLOR_LV_ALTERNATE) ; legt fest, dass Hintergrundfarbe wechselt
    GUICtrlSetBkColor(-1, 0xE6E6FA) ; Hintergrundfarbe 1

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

    $listview2 = GUICtrlCreateListView("Gruppe2 | BlubText", 230, 10, 200, 100, BitOR($LVS_REPORT, $LVS_SHOWSELALWAYS), BitOR($LVS_EX_FULLROWSELECT, $WS_EX_CLIENTEDGE))
    GUICtrlSetState($listview2, $GUI_DROPACCEPTED)
    $hbtnInfo = GUICtrlCreateButton("Info (LV1)", 10, 120, 100, 20)
    $hbtnSave = GUICtrlCreateButton("&Speichern (LV2)", 230, 120, 100, 20)
    $hbtnLoad = GUICtrlCreateButton("&Laden (LV2)", 230, 150, 100, 20)

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

    For $i = 1 To 9
    $listitem = GUICtrlCreateListViewItem("test" & $i & " |Blub " & Random(1, 9), $listview)
    If $i = 5 Then GUICtrlSetFont($listitem, 14, 800)
    GUICtrlSetBkColor(-1, 0xcccccc) ; Hintergrundfarbe 2
    Next
    $hEdit =GUICtrlCreateEdit("",5,180,390,200)
    $idContextmenu = GUICtrlCreateContextMenu($listview)
    $idClipmenu = GUICtrlCreateMenuItem("Selektierte ins ClipBoard", $idContextmenu)
    $idAllClipmenu = GUICtrlCreateMenuItem("Alle aus Splate 2 ins ClipBoard", $idContextmenu)
    $idDragmenu = GUICtrlCreateMenuItem("In LV 2", $idContextmenu)

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

    GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY") ;<=========================================== Bemachrichtigung Doppelklick
    GUISetState()
    $first = True
    While 1
    $msg = GUIGetMsg()
    Switch $msg
    Case $GUI_EVENT_DROPPED, $idDragmenu
    $ar = _GUICtrlListView_GetSelectedIndices($listview, True)
    ;_ArrayDisplay($ar)
    For $i = 1 To $ar[0]
    $sItem = _GUICtrlListView_GetItemTextString($listview, $ar[$i])
    GUICtrlCreateListViewItem($sItem, $listview2)
    Next
    Case $hbtnInfo
    $Wert = _GUICtrlListView_GetItemTextArray($listview)
    If $Wert[2] <> "" Then
    MsgBox(0, "Eintrag für " & $Wert[1], "ist: " & $Wert[2])
    Else
    MsgBox(0, "", "Kein Eintrag ausgewählt")
    EndIf
    Case $hbtnSave
    SaveLV(@ScriptDir & "\LV2.DAT")
    Case $hbtnLoad
    LoadLV(@ScriptDir & "\LV2.DAT")
    Case $idClipmenu ;<==============================
    $aItems = _GUICtrlListView_GetSelectedIndices($listview, True)
    $sItemText = ""
    For $i = 1 To $aItems[0]
    ;Schleifenbeginn 1 da $aItem[0] die Anzahl enhält
    $sItemText &= _GUICtrlListView_GetItemTextString($listview, $aItems[$i]) & @CRLF
    ConsoleWrite($sItemText & @CRLF)
    Next ;= > weiter mit For
    ClipPut($sItemText & @CRLF)
    MsgBox(0,"","Jetzt einfach einmal CRTL-V drücken")
    ControlFocus($main,"",$hedit)
    Case $idAllClipmenu
    $sToClip = ""
    For $i = 0 To _GUICtrlListView_GetItemCount($listview)
    $aItem = _GUICtrlListView_GetItemTextArray($listview, $i)
    $sToClip &= $aItem[2] & @CRLF
    Next
    ClipPut($sToClip)
    MsgBox(0,"","Jetzt einfach einmal CRTL-v drücken")
    ControlFocus($main,"",$hedit)
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    WEnd

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

    Func SaveLV($sFile)
    Local $hFileOut, $aItem
    $hFileOut = FileOpen($sFile, 2)
    For $j = 0 To _GUICtrlListView_GetItemCount($listview2) - 1
    $aItem = _GUICtrlListView_GetItemTextString($listview2, $j)
    FileWriteLine($hFileOut, $aItem)
    Next
    FileClose($hFileOut)
    EndFunc ;==>SaveLV

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

    Func LoadLV($sFile)
    Local $aItems
    If FileExists($sFile) Then
    _FileReadToArray($sFile, $aItems)
    If IsArray($aItems) Then
    _GUICtrlListView_DeleteAllItems($listview2)
    ;_ArrayDisplay($aItems)
    For $j = 1 To $aItems[0]
    GUICtrlCreateListViewItem($aItems[$j], $listview2)
    Next
    EndIf
    EndIf
    EndFunc ;==>LoadLV

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

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

    [/autoit]

    Schau dir den Case-Zweig für $idClipmenu (Kontextmenü | Selektierte ins ClipBoard) an,

    mfg autoBert

  • Danke funktioniert.
    Anscheinend nimmt er einfach nur den Array-Wert...

    Ich weiß zwar nicht, wieso meins nicht geht, aber da das geht, kanns mir egal sein :P

    Zitat

    Programmieren ist so lange lustig bis ein Fehler auftritt!


    ~ Dankeschön