ListViewwert speichern

  • Hi,
    ich finde die Werte meiner Listview so heraus:

    [autoit]

    $Leiste = _GUICtrlListView_GetSelectedIndices($Listview, True)
    $Wert = _GUICtrlListView_GetItemTextArray($Listview, $Leiste[1])

    [/autoit]


    Nun kann ich die Werte mit $Wert[1], [2], [3],... auslesen, aber da sich meine Listview auch manchmal
    aktualisiert, wollte ich fragen, wie ich diese Werte zwischenspeichern kann
    $1 = Wert[1] funktioniert schon mal nicht

    Einmal editiert, zuletzt von Slyfex (21. Februar 2010 um 22:53)

  • Hallo slyfex,

    warum soll das nicht gehen? Du musst nur aufpassen, dass du dir die Variable(n) später nicht überschreibst.
    Hier einmal ein umgebautes Beispiel von mir:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <GUIConstants.au3>
    #include <WindowsConstants.au3>
    #include <GuiListView.au3>
    #include <ListViewConstants.au3>
    ;#include <array.au3>

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

    $main = GUICreate("Testlistview Drag & Drop from LV1 to LV2 DblClick in LV1", 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", 160, 120, 100, 20)
    For $i = 1 To 9
    $listitem = GUICtrlCreateListViewItem("test" & $i & " |Blub " & Random(1, 9), $listview)
    GUICtrlSetBkColor(-1, 0xcccccc) ; Hintergrundfarbe 2
    Next
    ;GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY") ;<=========================================== Bemachrichtigung Doppelklick
    GUISetState()
    $first = True
    While 1
    $msg = GUIGetMsg()
    Switch $msg
    Case $GUI_EVENT_DROPPED
    $ar = _GUICtrlListView_GetSelectedIndices($listview, True)
    ;_ArrayDisplay($ar)

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

    For $i = 1 To $ar[0]
    $sItem = _GUICtrlListView_GetItemTextString($listview, $ar[$i])
    GUICtrlCreateListViewItem($sItem, $listview2)
    Next
    Case $hbtnInfo
    $aItem = _GUICtrlListView_GetItemTextArray($listview)
    MsgBox(0, "Info zu " & $aItem[1] & ":", $aItem[2])
    if not $first Then MsgBox(0, "Erste Sicherung um " & $tZeit & ":", $s1 & @CRLF & $s2 & @CRLF )
    if $first Then
    $s1 = $aItem[1]
    $s2 = $aItem[2]
    $tZeit = @HOUR & ":" & @MIN
    $first = False
    EndIf
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    WEnd

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

    Func WM_NOTIFY($hWnd, $MsgID, $wParam, $lParam) ;<================== Benachrichtigung Doppelklick from Chaoskeks (in ChaosExecution)
    Local $tagNMHDR, $event, $hwndFrom, $code
    $tagNMHDR = DllStructCreate("int;int;int", $lParam)
    If @error Then Return 0
    $code = DllStructGetData($tagNMHDR, 3)
    If $wParam = $ListView And $code = -3 And _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
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_NOTIFY

    [/autoit]

    angewendet bei $hbtnInfo

    mfg (Auto)Bert

  • Danke
    Dann mach ich einen Fehler bei der Aktualisierung

    Wie kann ich den Inhalt der Listview am besten mit dem Inhalt einer .txt vergleichen?
    Der Inhalt der .txt sieht so aus: "1|2|3"

  • Ich habs, nur wie kann ich den Wert aktualisieren, ohne das bei mir der Fehler kommt: "Error: Subscript used with non-Array variable"

  • Mein Problem ist es schon, die Liste aus einer Datei zu aktualisieren
    Anfangs hat sich die Liste einfach einfach unter der existierenden gesetzt, deswegen hab ich anfangs gedacht,
    die Liste vorher zu löschen würde das Problem lösen, aber wenn ich das mache kommt bei mir
    "Error: Subscript used with non-Array variable"

  • Hallo slyfex,

    um Einträge einer LV in eine Datei zu speichern benutze ich:

    [autoit]


    $sFile = "LV.Dat"
    $hFileOut = FileOpen(@ScriptDir & "\" & $sFile, 2)
    For $j = 0 To _GUICtrlListView_GetItemCount($hListView) - 1
    $Item = _GUICtrlListView_GetItemTextString($hListView, $j)
    FileWriteLine($hFileOut, $aItem)
    Next
    FileClose($hFileOut)

    [/autoit]

    um sie wieder einzulesen:

    [autoit]


    $sFile = "LV.Dat"
    If FileExists($sFile) Then
    _FileReadToArray($sFile, $aItems)
    If IsArray($aItems) Then
    ;_ArrayDisplay($aItems)
    For $j = 1 To $aItems[0]
    GUICtrlCreateListViewItem($aItems[$j], $hListView)
    Next
    EndIf
    EndIf

    [/autoit]

    zum leeren der LV:

    [autoit]

    _GUICtrlListView_DeleteAllItems(GUICtrlGetHandle($hListView))

    [/autoit]

    kannst ja mal in meinen AutoStarter schauen, da arbeite ich mit LV's

    mfg (Auto)Bert

  • Danke,
    aber wenn ich die Liste leere und die Datei wieder einlese wird der Wert der Variable auch gelöscht,
    dadurch wird also mein Fehler verursacht

  • Danke für die ganze Hilfe jetzt hab ich es doch noch alleine geschaft :)

    Einmal editiert, zuletzt von Slyfex (21. Februar 2010 um 22:53)

  • Hallo slyfex,

    kannst du mir den Grund erklären, warum du die Func read alle 5 sekunden ausführst? Was willst du mit dieser sehr dynamischen LV darstellen, Aktienkurse?

    hier ein Beispiel wie man so eine dynamische LV abfragen kann, wobei ich davon ausgehe das sich die Spalte 1 (also warscheins die Bezeihnung nie ändert):

    Spoiler anzeigen
    [autoit]

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

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

    Global $aSav = 0, $bFirst = True

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

    $GUI = GUICreate("GUI", 405, 320, 302, 218)
    GUISetBkColor(0xFFFFFF)
    $ListView = GUICtrlCreateListView("1|2|3", 15, 15, 306, 226)
    $hbtnInfo = GUICtrlCreateButton("Info", 15, 295, 306, 20)

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

    GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, 50)
    GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 1, 50)
    GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 2, 50)
    $Handle = GUICtrlGetHandle($ListView)

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

    GUISetState(@SW_SHOW)

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

    $Timer = TimerInit()

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $hbtnInfo
    $aItem = _GUICtrlListView_GetItemTextArray($ListView)
    ;das aktuelle Item wird mit seinen Werten ausgelesen
    $sMsg = "neue Werte: " & $aItem[2] & " " & $aItem[3]
    If $aSav <> 0 Then
    if $aSav[1] = $aItem[1] Then $sMsg = $sMsg & @CRLF & "alte Werte: " & $aSav[2] & " " & $aSav[3]
    ;es handelt sich um das zuvor beobachtete Item also Vergleichswerte dazuSTRINGen
    EndIf
    MsgBox(0, "Info zu " & $aItem[1] & ":", $sMsg)
    $aSav = $aItem
    EndSwitch
    read()
    WEnd

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

    Func read()
    If TimerDiff($Timer) >= 5 * 1000 Then
    Local $File = @ScriptDir & "\Wert.txt"
    If $bFirst Then _GUICtrlListView_DeleteAllItems($Handle)
    ;eigentlich unnötig, aber damit kann man später auch manuell ohne Programm zu beenden erneut anfangen
    $FWert = FileOpen($File, 0)
    If $FWert <> -1 Then
    _GUICtrlListView_BeginUpdate($Handle)
    While True
    $Wert = FileReadLine($FWert)
    If @error Then ExitLoop
    If $bFirst Then
    GUICtrlCreateListViewItem($Wert, $ListView)
    ;leere LV also anlegen
    Else
    $aWert = StringSplit($Wert, "|")
    $iIndex = _GUICtrlListView_FindText($Handle, $aWert[1], -1, False, True)
    ;Item anhand des Itemtextes finden
    _GUICtrlListView_SetItemText($Handle, $iIndex, $aWert[2], 1)
    ;Wert für Sub-Item 1 eintragen
    _GUICtrlListView_SetItemText($Handle, $iIndex, $aWert[3], 2)
    ;Wert für Sub-Item 2 eintragen
    EndIf
    WEnd
    _GUICtrlListView_EndUpdate($Handle)
    FileClose($FWert)
    EndIf
    $bFirst = False ;Tabelle wurde gefüllt
    $Timer = TimerInit()
    EndIf
    EndFunc ;==>read

    [/autoit]

    Edit: zu spät gesehen du hast es geschafft, kannst du bitte deine Lösung und auch die eigentliche Problemstellung posten?
    mfg (Auto)Bert