Probleme mit ListView

  • Hallo,

    ich habe (mal wieder) ein Problem beim Scripten :D
    und zwar habe ich ein GUI fenster, indem sich ein 5 teiliges listview befindet.
    nun möchte ich (bei mehreren einträgen untereinander) alle einträge in einer ini abspeichern.
    d.h. die optimale form wäre: (eintrag1 | eintrag1_1 | eintrag 1_2 |...)
    allerdings sind es wie gesagt mehrere eintäge untereinander.
    Falls es euch hilft könnte ich auch noch den bisherigen Quellcode einstellen.

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <ListViewConstants.au3>
    #include <WindowsConstants.au3>
    #include <Guilistview.au3>

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

    #Region ### START Koda GUI section ### Form=
    Global $Form1 = GUICreate("", 506, 474, 196, 134)
    Global $ListView1 = GUICtrlCreateListView("Artikelnummer|Art|Nummer|Baureihe|Name", 0, 0, 505, 421)
    Global $ListView1_0 = GUICtrlCreateListViewItem("test|test1|test2|test3|test4", $ListView1)
    Global $ListView1_1 = GUICtrlCreateListViewItem("test|test1|test2|test3|test4", $ListView1)
    Global $ListView1_2 = GUICtrlCreateListViewItem("test|test1|test2|test3|test4", $ListView1)
    GUICtrlSendMsg(-1, 0x101E, 0, 100)
    GUICtrlSendMsg(-1, 0x101E, 1, 100)
    GUICtrlSendMsg(-1, 0x101E, 2, 100)
    GUICtrlSendMsg(-1, 0x101E, 3, 100)
    GUICtrlSendMsg(-1, 0x101E, 4, 100)
    Global $Button1 = GUICtrlCreateButton("Neu", 4, 428, 89, 33, 0)
    Global $Button2 = GUICtrlCreateButton("Laden", 152, 428, 89, 33, 0)
    Global $Button3 = GUICtrlCreateButton("Speichern", 264, 428, 89, 33, 0)
    Global $Button4 = GUICtrlCreateButton("Beenden", 412, 428, 89, 33, 0)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $Button4
    Global $Beendenmessage=MsgBox(68, "Beenden", "Wollen sie das Programm wirklich beenden?")
    If $Beendenmessage=6 Then
    Exit
    Else
    ContinueLoop
    EndIf
    Case $Button3

    EndSwitch
    WEnd

    [/autoit]


    (die ini soll natürlich später (beim wieder öffnen des programms) die daten an das programm weitergeben)

    MaddeX

    • Offizieller Beitrag

    Eine Inidatei ist als Datenbank nicht so gut geeignet. Benutze lieber ein eigenes Format.
    Ich habe Dein Beispielscript mal zu einem "Listview-Datenbank-Beispiel" ausgebaut:

    Edit: Jetzt mit noch mehr Funktionen (Neuer Eintrag, Eintrag bearbeiten, Markierte Einträge löschen, usw.)

    Edit2: Habe die Load-Funktion noch etwas beschleunigt.

    Spoiler anzeigen
    [autoit]


    #include<ListViewConstants.au3>
    #include<ButtonConstants.au3>
    #include<GUIConstantsEx.au3>
    #include<Guilistview.au3>

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

    Global $sHeader = "Artikelnummer|Art|Nummer|Baureihe|Name"
    Global $sDBFile = @ScriptDir & "\datenbank.txt"
    Global $iEdit

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

    #Region Hauptfenster
    Global $hGui = GUICreate("Listview-Datenbank-Beispiel", 600, 480)
    Global $hListView = GUICtrlCreateListView($sHeader, 0, 0, 600, 420, $LVS_SHOWSELALWAYS)

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

    Global $hLVHandle = GUICtrlGetHandle($hListView)
    _GUICtrlListView_SetColumn($hLVHandle, 0, "Artikelnummer", 120, 1) ; 120 Px breit, rechts ausgerichtet
    _GUICtrlListView_SetColumn($hLVHandle, 1, "Art", 60, 0) ; 60 Px breit, links ausgerichtet
    _GUICtrlListView_SetColumn($hLVHandle, 2, "Nummer", 90, 0) ; 90 Px breit, links ausgerichtet
    _GUICtrlListView_SetColumn($hLVHandle, 3, "Baureihe", 100, 0) ; 100 Px breit, links ausgerichtet
    _GUICtrlListView_SetColumn($hLVHandle, 4, "Name", 120, 0) ; 120 Px breit, links ausgerichtet

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

    Global $hNew = GUICtrlCreateButton("Neuer Eintrag", 5, 430, 80, 35, $BS_DEFPUSHBUTTON)
    Global $hEdit = GUICtrlCreateButton("Markierten Eintrag bearbeiten", 95, 430, 110, 35, $BS_MULTILINE)
    Global $hLoad = GUICtrlCreateButton("Laden", 230, 430, 70, 35)
    Global $hSave = GUICtrlCreateButton("Speichern", 310, 430, 70, 35)
    Global $hDel = GUICtrlCreateButton("Markierte Einträge löschen", 400, 430, 90, 35, $BS_MULTILINE)
    Global $hDelAll = GUICtrlCreateButton("Alle Einträge löschen", 500, 430, 90, 35, $BS_MULTILINE)
    #EndRegion Hauptfenster

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

    #Region Fenster für neuen Eintrag
    Global $hGuiNew = GUICreate("Neuer Eintrag", 502, 120)
    Global $aHeader = StringSplit($sHeader, '|'), $aNew[$aHeader[0]]
    For $i = 1 To $aHeader[0]
    GUICtrlCreateLabel($aHeader[$i], 4 + ($i - 1) * 100, 25, 90, 20)
    $aNew[$i - 1] = GUICtrlCreateInput("", 2 + ($i - 1) * 100, 40, 98, 20)
    Next
    Global $hCreate = GUICtrlCreateButton("Eintrag speichern", 190, 90, 130, 25, $BS_DEFPUSHBUTTON)
    #EndRegion Fenster für neuen Eintrag

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

    _GUICtrlListView_RegisterSortCallBack($hLVHandle)

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

    GUISetState(@SW_SHOW, $hGui)

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

    If FileExists($sDBFile) Then Load()

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

    While 1
    $nMsg = GUIGetMsg(1)
    Switch $nMsg[0]
    Case $hListView
    _GUICtrlListView_SortItems($hLVHandle, GUICtrlGetState($hListView))
    Case $hNew
    WinSetTitle($hGuiNew, "", "Neuer Eintrag")
    GUISetState(@SW_SHOW, $hGuiNew)
    GUISetState(@SW_DISABLE, $hGui)
    Case $hEdit
    WinSetTitle($hGuiNew, "", "Eintrag bearbeiten")
    GUISetState(@SW_SHOW, $hGuiNew)
    GUISetState(@SW_DISABLE, $hGui)
    Edit()
    Case $hLoad
    Load()
    Case $hSave
    Save()
    Case $hDel
    If MsgBox(256 + 32 + 4, "Einträge löschen", "Wollen sie die markierten Einträge wirklich löschen?") = 6 Then _GUICtrlListView_DeleteItemsSelected($hLVHandle)
    Case $hDelAll
    If MsgBox(256 + 32 + 4, "Einträge löschen", "Wollen sie wirklich alle Einträge löschen?") = 6 Then _GUICtrlListView_DeleteAllItems($hLVHandle)
    Case $hCreate
    NewItem()
    Case $GUI_EVENT_CLOSE
    Switch $nMsg[1]
    Case $hGui
    If MsgBox(32 + 4, "Beenden", "Wollen sie das Programm wirklich beenden?") = 6 Then End()
    Case $hGuiNew
    $iEdit = 0
    GUISetState(@SW_HIDE, $hGuiNew)
    GUISetState(@SW_ENABLE, $hGui)
    WinActivate($hGui)
    EndSwitch
    EndSwitch
    WEnd

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

    Func End()
    ;~ Save()
    _GUICtrlListView_UnRegisterSortCallBack($hLVHandle)
    Exit
    EndFunc

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

    Func NewItem()
    Local $sItem = ""
    For $i = 0 To UBound($aNew) - 1
    If $iEdit Then
    _GUICtrlListView_SetItemText($hLVHandle, $iEdit, GUICtrlRead($aNew[$i]), $i)
    Else
    $sItem &= GUICtrlRead($aNew[$i]) & "|"
    EndIf
    GUICtrlSetData($aNew[$i], "")
    Next
    If $iEdit Then
    $iEdit = 0
    GUISetState(@SW_HIDE, $hGuiNew)
    GUISetState(@SW_ENABLE, $hGui)
    WinActivate($hGui)
    Else
    GUICtrlSetState($aNew[0], $GUI_FOCUS)
    GUICtrlCreateListViewItem(StringTrimRight($sItem, 1), $hListView)
    EndIf
    EndFunc ;==>NewItem

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

    Func Edit()
    $iEdit = _GUICtrlListView_GetSelectionMark($hLVHandle)
    Local $aItem = _GUICtrlListView_GetItemTextArray($hLVHandle, $iEdit)
    For $i = 1 To $aItem[0]
    GUICtrlSetData($aNew[$i - 1], $aItem[$i])
    Next
    EndFunc ;==>Edit

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

    Func Load()
    Local $hFile = FileOpen($sDBFile, 0), $sItem
    If $hFile <> -1 Then
    _GUICtrlListView_BeginUpdate($hLVHandle)
    While True
    $sItem = FileReadLine($hFile)
    If @error Then ExitLoop
    GUICtrlCreateListViewItem($sItem, $hListView)
    WEnd
    _GUICtrlListView_EndUpdate($hLVHandle)
    FileClose($hFile)
    EndIf
    EndFunc ;==>Load

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

    Func Save()
    Local $iCount = _GUICtrlListView_GetItemCount($hLVHandle) - 1, $sItem
    Local $hFile = FileOpen($sDBFile, 2)
    If $hFile <> -1 Then
    For $i = 0 To $iCount
    $sItem = _GUICtrlListView_GetItemTextString($hLVHandle, $i)
    FileWriteLine($hFile, $sItem)
    Next
    FileClose($hFile)
    EndIf
    EndFunc ;==>Save

    [/autoit]
    • Offizieller Beitrag

    Hmm...habe das gerade mal mit ~1500 Einträgen probiert. Ich finde, dass das recht flott geht.
    Ok, das sortieren dauert etwas, aber so schlimm finde ich das nicht.

    Liegt wohl auch am verwendeten Rechner. ;)

    Edit: Noch ein Test mit 5380 Einträgen: umsortieren des Listview dauert bei mir ~20 sek. Naja, für eine Scriptsprache ganz passabel.

  • Oscar ich bin gerade von Blindheit geschlagen, wo sind die Programm Zeilen mit denen Du die einzelnen Colums des Listviews durch klick an das Column-Label asc oder desc sortierst? ?(

    ---
    In "Independence Day" konnten die Windows-Erdcomputer problemlos mit denen der Außerirdischen kommunizieren. Was sagt uns das über unseren lieben Bill Gates? :D
    ---

  • hab die Zeilen gesehen und kann nicht glauben, dass es so einach ist :)

    vielen Dank :!:

    Edit:
    Habs versucht um zu setzen, allerdings zeigt er mir nur die Pfeile an, aber sortiert nicht. Wohl doch nicht so einfach.. Zumindest nicht für mich..

    ---
    In "Independence Day" konnten die Windows-Erdcomputer problemlos mit denen der Außerirdischen kommunizieren. Was sagt uns das über unseren lieben Bill Gates? :D
    ---

    Einmal editiert, zuletzt von franzp (2. Dezember 2008 um 11:09)

  • Einmal editiert, zuletzt von MaddeX (2. Dezember 2008 um 14:32)