Listview-Datenbank-Beispiel

    • Offizieller Beitrag

    Es gibt ein neues, verbessertes Beispiel-Script: Listview-Datenbank v3


    Hier ist mal ein (kommentiertes) Beispiel-Script, wie man mit Listview eine Datenbank erstellen kann.

    Vorhandene Eigenschaften:
    - Neuen Eintrag erstellen
    - Eintrag bearbeiten
    - Datenbank laden/speichern
    - Markierte Einträge löschen
    - Alle Einträge löschen
    - Kontextmenü für "Neuen Eintrag", "Eintrag bearbeiten" und "Markierte Einträge löschen"
    - Sortieren des Listviews über einen Klick auf die Spaltenüberschrift
    - Suche im gesamten Listview nach dem eingegebenen Suchbegriff und Anzeige in einem extra Listview

  • hey,

    kann es sein, dass sich in der Edit() Funktion ein Bug eingeschlichen hat?
    Immer wenn ich den ersten Eintrag im Listview editieren will, wird dieser mit den geänderten Werten nochmal erstellt.
    Bei den folgenden Einträgen funktionierts wie erwartet.

    Bin mir noch nicht so ganz im Klaren woran das liegt.

  • So klappts, super!
    In Zeile 84, also beim Verlassen des "Neuer Eintrag" Fensters muss das $iEdit dann aber auch wieder auf -1 gesetzt werden, sonst funktionierts nur einmal :)

  • du solltest was dagegen machen dass man leere einträge einfügt
    bei mir stürzt dann das script ab oO

    Padmak

  • ok jetzt gehts :)
    ich würd noch ne funktion beim laden einfügen ob man alles neu laden will oder die einträge einfach hinzufügen will

    Padmak

  • so ich nochmal ...

    Wenn man das "Eintrag bearbeiten Fenster" über den Exitbutton verlässt wird kein

    [autoit]

    GUICtrlSetData($aNew[$i], "") ; das entsprechende Eingabefeld leeren

    [/autoit]

    durchgeführt und dadurch verbleibt das Skript im "Edit-Modus" wenn man wieder einen neuen Eintrag hinzufügen will.

    Die entsprechenden Zeilen hab ich für mein Skript jetzt so geändert:

    [autoit]


    Case $hGuiNew ; User will das "Neuer Eintrag"-Fenster schließen
    $iEdit = -1
    For $i = 0 To UBound($aNew) - 1
    GUICtrlSetData($aNew[$i], "")
    Next
    GUISetState(@SW_HIDE, $hGuiNew) ; "Neuer Eintrag"-Fenster verstecken
    GUISetState(@SW_ENABLE, $hGui) ; Hauptfenster wieder aktivieren
    WinActivate($hGui) ; und in den Vordergrund holen

    [/autoit]

    So scheint es (probierts mal bei euch aus) zu funktionieren.

  • Hallo Oscar,

    dein Beispiel ist genau das richtige was ich für eine kleine Adressenverwaltung brauche. Selbst als absoluter AutoIT-Anfänger komm ich damit super zurecht. :thumbup:

    Mir ist aufgefallen, dass man:


    • a) auch leere Einträge anlegen kann
    • b) die Sortierung nach Neualage bzw. Änderung nicht mehr stimmt

    deshalb hab ich die function NewItem für meine Testzwecke abgeändert. Dies geht sicher schöner aber ich beschäftige mich erst seit 2 Tagen mit AutoIT, bin mir aber jetzt schon sicher, dass die Sprache zu mir passt :)

    mfg

  • Super Programm =) Nur ich habe ein Frage. Ich habe es jett für mich gerecht um geändert :)
    Ich habe nur die Namen geändert :D Aber wo Zahlen rein müssen.
    Kann man auch z.B. ich schreib eine 25000000 rein, dass er aber 25,000,000 Reinschreibt. Das , dass komma gesetzt wird. Oder wenn er einfach nur 25 000 000 ; schreibt ,dass auch dort automatisch 25,000,000 gemacht wird =) Sonst Super Programm kann ich viel raus lernen ^^

  • Ist eigentlich kein Problem fürs Listviewdatenbank-Beispiel.
    Hilft dir

    [autoit]

    _StringAddThousandsSep

    [/autoit]

    ?
    Ansonsten müsste man das wohl selbst nachbauen.

  • Die Hilfe zeigt mir das an.

    [autoit]


    #include <String.au3>
    $nAmt = '38849230'
    $sDelim = _StringAddThousandsSep($nAmt)
    MsgBox(64, 'Info', $sDelim)

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

    Nur ich bekomme es dort war ins Script eingebaut. Aber es geht nicht :P
    Wüsste jemand wo des hinkommen soll & was das $nAmt dann sein soll ?

  • Ja, ich weiß, das der letzte Beitrag länger als 1580 Tage zurück liegt. ;)

    Ich habe folgendes, von Oscar geschriebenes Script gerade am testen.

    Mir sind folgende Punkte aufgefallen, wobei ich nur den ersten und letzten Punkt nicht gelöst bekomme.

    1.) sortieren nach Einscheinungsdatum: sortiert die Datumsangaben nicht in Folge, sondern z. B. den 17.03.2004 vor den 21.02.2014

    2.) Spalte "Anzahl der Bücher" muss ausgeblendet werden. (Lsg.: Zeile 50)

    3.) bei Laden werden derzeitig nicht erst das angezeigt gelöscht, sondern die gespecherten Daten drangehäng (Lsg.: Zeile 144)

    4.) habe in Zeile 31 "_GUICtrlListView_SetColumn($hLVHandle, 5, "???", 10, 0) ; 6. Spalte = 10 Px breit, links ausgerichtet" hinzugefügt,
    wo muss noch etwas erweitert werden?


    Spoiler anzeigen
    [autoit]


    ; https://autoit.de/index.php?page…tview-Datenbank

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

    ; sortieren nach Einscheinungsdatum: sortiert die Datumsangaben nicht in Folge, sondern z. B. den 17.03.2004 vor den 21.02.2014

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

    ; Spalte "Anzahl der Bücher" muss ausgeblendet werden. (Lsg.: Zeile 52)

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

    ; bei Laden werden derzeitig nicht erst das angezeigt gelöscht, sondern die gespecherten Daten drangehäng (Lsg.: Zeile 146)

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

    ; habe in Zeile 31 "_GUICtrlListView_SetColumn($hLVHandle, 5, "???", 10, 0) ; 6. Spalte = 10 Px breit, links ausgerichtet" hinzugefügt,
    ; wo muss noch etwas erweitert werden?

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

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

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

    Global $sHeader = "Anzahl der Bücher|Buchtitel|Autor|Verlag|Erscheinungsdatum" ; Die Überschriften für das Listview und für das "Neuer Eintrag"-Fenster
    Global $sDBFile = @ScriptDir & "\buch_db2.csv" ; Pfad und Name der Datenbank-Datei
    Global $iEdit = -1 ; Wert auf -1 setzen, weil _GUICtrlListView_GetSelectionMark() einen Nullbasierten Wert liefert

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

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

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

    Global $hLVHandle = GUICtrlGetHandle($hListView) ; das Handle vom Listview wird für die UDF-Listview-Funktionen benötigt
    _GUICtrlListView_SetColumn($hLVHandle, 0, "", 1, 1) ; 1. Spalte = 120 Px breit, rechts ausgerichtet; hier versteckt da es nicht sichtbar sein soll
    _GUICtrlListView_SetColumn($hLVHandle, 1, "Buchtitel", 60, 0) ; 2. Spalte = 60 Px breit, links ausgerichtet
    _GUICtrlListView_SetColumn($hLVHandle, 2, "Autor", 90, 0) ; 3. Spalte = 90 Px breit, links ausgerichtet
    _GUICtrlListView_SetColumn($hLVHandle, 3, "Verlag", 100, 0) ; 4. Spalte = 100 Px breit, links ausgerichtet
    _GUICtrlListView_SetColumn($hLVHandle, 4, "Erscheinungsdatum", 120, 0) ; 5. Spalte = 120 Px breit, links ausgerichtet
    _GUICtrlListView_SetColumn($hLVHandle, 5, "???", 10, 0) ; 6. Spalte = 10 Px breit, links ausgerichtet

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

    Global $hNew = GUICtrlCreateButton("Neuer Eintrag", 5, 430, 80, 35, $BS_DEFPUSHBUTTON) ; Dieser Button ist der Default-Push-Button (wenn der User [Enter] drückt)
    Global $hEdit = GUICtrlCreateButton("Markierten Eintrag bearbeiten", 95, 430, 110, 35, $BS_MULTILINE) ; $BS_Multiline für mehrzeiligen Button
    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)

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

    Global $hCM = GUICtrlCreateContextMenu($hListView) ; ein Kontextmenü für das Listview erstellen
    Global $hCMNew = GUICtrlCreateMenuItem("Neuer Eintrag", $hCM) ; der 1. Kontextmenüeintrag
    Global $hCMEdit = GUICtrlCreateMenuItem("Eintrag bearbeiten", $hCM) ; der 2. Kontextmenüeintrag
    Global $hCMDel = GUICtrlCreateMenuItem("Markierte Einträge löschen", $hCM) ; der 3. Kontextmenüeintrag
    #EndRegion Hauptfenster

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

    #Region Fenster für neuen Eintrag
    Global $hGuiNew = GUICreate("Neuer Eintrag", 632, 140, -1, -1, $WS_SYSMENU) ; das Fenster "Neuer Eintrag" erstellen
    Global $aHeader = StringSplit($sHeader, '|') ; Überschriften-Array
    Global $aNew[$aHeader[0]] ; Array für die Input-IDs
    For $i = 2 To $aHeader[0] ; durch "$i = 2" wird die Buchanzahl nicht angezeigt
    GUICtrlCreateLabel($aHeader[$i], 4 + ($i - 1) * 125, 15, 110, 20) ; Überschriften-Label erstellen
    GUICtrlSetFont(-1, 8, 400, 0, 'Verdana') ; Schriftgröße und -art der Überschriften festlegen
    $aNew[$i - 1] = GUICtrlCreateInput("", 2 + ($i - 1) * 125, 30, 120, 20, Default, $WS_EX_STATICEDGE) ; Eingabefelder erstellen
    GUICtrlSetFont(-1, 10, 600, 0, 'Verdana') ; Schriftgröße und -art der Eingabefelder festlegen
    Next
    Global $hCreate = GUICtrlCreateButton("Eintrag speichern", 254, 65, 120, 25, $BS_DEFPUSHBUTTON) ; Button zum speichern
    #EndRegion Fenster für neuen Eintrag

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

    _GUICtrlListView_RegisterSortCallBack($hLVHandle) ; damit man das Listview (mit Klick auf die Spaltenüberschrift) sortieren kann

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

    GUISetState(@SW_SHOW, $hGui) ; Hauptfenster sichtbar machen

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

    If FileExists($sDBFile) Then Load() ; wenn Datenbank-Datei existiert, dann Datenbank laden

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

    While 1
    $nMsg = GUIGetMsg(1) ; Message-Event holen (1) = erweiterter Modus
    Switch $nMsg[0] ; anhand der Control-ID das entsprechende Case aufrufen
    Case $hListView ; User hat auf eine Spaltenüberschrift geklickt
    _GUICtrlListView_SortItems($hLVHandle, GUICtrlGetState($hListView)) ; Einträge entsprechend sortieren
    Case $hNew, $hCMNew ; User hat auf "Neuer Eintrag" geklickt
    WinSetTitle($hGuiNew, "", "Neuer Eintrag") ; den Titel des Fenster anpassen
    GUISetState(@SW_SHOW, $hGuiNew) ; das Fenster "Neuer Eintrag" anzeigen
    GUISetState(@SW_DISABLE, $hGui) ; das Hauptfenster deaktivieren
    Case $hEdit, $hCMEdit ; User hat auf "Eintrag bearbeiten" geklickt
    WinSetTitle($hGuiNew, "", "Eintrag bearbeiten") ; den Titel des Fenster anpassen
    GUISetState(@SW_SHOW, $hGuiNew) ; das Fenster "Neuer Eintrag" anzeigen
    GUISetState(@SW_DISABLE, $hGui) ; das Hauptfenster deaktivieren
    Edit()
    Case $hLoad ; User hat auf "Laden" geklickt
    Load()
    Case $hSave ; User hat auf "Laden" geklickt
    Save()
    Case $hDel, $hCMDel ; User hat auf "Markierte Einträge löschen" geklickt
    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 ; User hat auf "Alle Einträge löschen" geklickt
    If MsgBox(256 + 32 + 4, "Einträge löschen", "Wollen sie wirklich alle Einträge löschen?") = 6 Then _GUICtrlListView_DeleteAllItems($hLVHandle)
    Case $hCreate ; User hat auf "Eintrag speichern" im Fenster "Neuer Eintrag" geklickt
    NewItem()
    Case $GUI_EVENT_CLOSE ; User hat auf das Schließen-Symbol geklickt (bzw. die ESC-Taste gedrückt)
    Switch $nMsg[1] ; erweiterte Abfrage für welches Fenster
    Case $hGui ; User will das Hauptfenster schließen
    If MsgBox(32 + 4, "Beenden", "Wollen sie das Programm wirklich beenden?") = 6 Then End() ; wenn ja, dann End-Funktion aufrufen
    Case $hGuiNew ; User will das "Neuer Eintrag"-Fenster schließen
    $iEdit = -1
    For $i = 0 To UBound($aNew) - 1
    GUICtrlSetData($aNew[$i], "") ; Alle Eingabefelder leeren
    Next
    GUISetState(@SW_HIDE, $hGuiNew) ; "Neuer Eintrag"-Fenster verstecken
    GUISetState(@SW_ENABLE, $hGui) ; Hauptfenster wieder aktivieren
    WinActivate($hGui) ; und in den Vordergrund holen
    EndSwitch
    EndSwitch
    WEnd

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

    Func End()
    ;~ Save() ; wenn der vordere Kommentar entfernt wird, dann werden vor dem beenden noch die Daten gespeichert
    _GUICtrlListView_UnRegisterSortCallBack($hLVHandle) ; Sortierroutine wieder de-registrieren
    Exit ; Programm beenden
    EndFunc

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

    Func NewItem() ; Funktion zum auslesen der Eingabefelder (Neuer Eintrag bzw. Eintrag bearbeiten)
    Local $sItem = ""
    For $i = 0 To UBound($aNew) - 1 ; Schleife, um alle Eingabefelder durchzugehen
    If $iEdit > -1 Then ; wenn $iEdit > -1 (Eintrag bearbeiten), dann...
    _GUICtrlListView_SetItemText($hLVHandle, $iEdit, GUICtrlRead($aNew[$i]), $i) ; den Eintrag aus dem Eingabefeld ins Listview schreiben
    Else ; sonst $iEdit = -1 (neuer Eintrag)
    $sItem &= GUICtrlRead($aNew[$i]) & "|" ; den Eintrag aus dem Eingabefeld erstmal in einer Variablen ($sItem) speichern
    EndIf
    GUICtrlSetData($aNew[$i], "") ; das entsprechende Eingabefeld leeren
    Next
    If $iEdit > -1 Then ; wenn $iEdit > -1 (Eintrag bearbeiten), dann...
    $iEdit = -1
    GUISetState(@SW_HIDE, $hGuiNew) ; "Neuer Eintrag"-Fenster verstecken
    GUISetState(@SW_ENABLE, $hGui) ; Hauptfenster wieder aktivieren
    Sleep(300)
    WinActivate($hGui) ; und in den Vordergrund holen
    Else ; sonst $iEdit = -1 (neuer Eintrag)
    GUICtrlSetState($aNew[0], $GUI_FOCUS) ; den Focus wieder auf das erste Eingabefeld setzen, für weitere Eingaben
    GUICtrlCreateListViewItem(StringTrimRight($sItem, 1), $hListView) ; mit den Werten aus $sItem einen neuen Listview-Eintrag hinzufügen
    EndIf
    EndFunc ;==>NewItem

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

    Func Edit() ; Funktion zum bearbeiten eines Listview-Eintrags im "Eintrag bearbeiten"-Fenster
    $iEdit = _GUICtrlListView_GetSelectionMark($hLVHandle) ; auslesen, welcher Listview-Eintrag markiert (bei mehreren, den obersten) ist
    If $iEdit > -1 Then
    Local $aItem = _GUICtrlListView_GetItemTextArray($hLVHandle, $iEdit) ; die Einträge aus dem Listview in ein Array holen
    For $i = 1 To $aItem[0]
    GUICtrlSetData($aNew[$i - 1], $aItem[$i]) ; und in die entsprechenden Eingabefelder schreiben
    Next
    EndIf
    EndFunc ;==>Edit

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

    Func Load() ; Datenbank-Datei laden
    _GUICtrlListView_DeleteAllItems($hLVHandle) ; Somit werden die Daten nicht mehr nur an den bestehenden angezeigten Daten drangehängt
    ; erst mal löschen und dann neu laden
    Local $sItem
    Local $hFile = FileOpen($sDBFile, 0) ; Datei zum lesen öffnen
    If $hFile <> -1 Then ; wenn das öffnen erfolgreich war, dann...
    _GUICtrlListView_BeginUpdate($hLVHandle) ; Listview sperren
    While True ; Endlosschleife
    $sItem = FileReadLine($hFile) ; Zeile aus der Datei lesen
    If @error Then ExitLoop ; wenn das Ende der Datei erreicht ist, dann Endlosschleife verlassen
    GUICtrlCreateListViewItem($sItem, $hListView) ; mit den eingelesenen Daten einen neuen Listview-Eintrag erstellen
    WEnd
    _GUICtrlListView_EndUpdate($hLVHandle) ; Listview wieder freigeben
    FileClose($hFile) ; Datei schließen
    EndIf
    EndFunc ;==>Load

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

    Func Save() ; Datenbank-Datei speichern
    Local $sItem
    Local $iCount = _GUICtrlListView_GetItemCount($hLVHandle) - 1 ; Anzahl der Listview-Einträge holen
    Local $hFile = FileOpen($sDBFile, 2) ; Datei zum speichern (überschreiben) öffnen
    If $hFile <> -1 Then ; wenn das öffnen erfolgreich war, dann...
    For $i = 0 To $iCount ; Schleife, um alle Listview-Einträge durchzugehen
    $sItem = _GUICtrlListView_GetItemTextString($hLVHandle, $i) ; die Werte aus dem Listview-Eintrag holen
    FileWriteLine($hFile, $sItem) ; und in die Datei schreiben
    Next
    FileClose($hFile) ; Datei schließen
    EndIf
    EndFunc ;==>Save

    [/autoit]


    buch_db2.csv:

    Spoiler anzeigen
    [autoit]


    0|b1|a1|v1|01.01.2014|0
    0|b3|a3|v3|15.06.2014|0
    0|b4|a4|v4|17.05.2014|0
    0|b2|a2|v2|31.12.2014|0

    [/autoit]

    Wie o. g. Propleme lösen?

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

  • Alina,
    Oscar hat in seinem Beispiel kein Datum drin. Das Datum muss immer gewandelt werden, also erst ins Autoit-Format, dann sortieren und ins deutsche Format zurück (siehe PN). ;)

    [autoit]


    ; Die Überschriften für das Listview und für das "Neuer Eintrag"-Fenster
    Global $sHeader = "Anzahl der Bücher|Buchtitel|Autor|Verlag|Erscheinungsdatum|???"

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

    ; [ ... ]

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

    ; 10 Px nicht ausreichend besser 50px
    ; 6. Spalte = 10 Px breit, links ausgerichtet
    _GUICtrlListView_SetColumn($hLVHandle, 5, "???", 50, 0)
    ; Ende

    [/autoit]