Problem mit dem Verwalten mehrerer "Datenbanken"

  • Hey,


    ich spiele gerade mit dem Listview-Datenbank Beispiel von Oscar (Listview-Datenbank-Beispiel) und wollte eine Funktion einbauen.
    Also es soll nicht nur eine Datenbank aufgerufen werden, sondern über "Fileopendialog" eine bestimmte Datenbank ausgewählt werden.
    Soweit ist das noch kein Problem, allerdings möchte ich neben der Informationen aus der Datenbank noch verschiedene Labels/Inputfelder mit zusätzlichen Daten zur jeweiligen Datenbank füttern.

    Meine Lösung:

    Spoiler anzeigen
    [autoit]


    Func Load() ; Datenbank-Datei laden
    $ini = FileOpenDialog("Bitte auswählen", @ScriptDir, "INI (*.ini)")
    Local $sDBFile = IniRead($ini, "DB", "File", "")
    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]


    Die Load() Funktion bekommt ihre Info welche Datenbank gelesen werden soll direkt aus einer .ini und dort kann ich auch die Zusatzinfos auslesen.
    Allerdings brauche ich dann pro Datenbank eine extra .ini :(
    Vielleicht habt ihr da ein besseres Konzept? Alles in eine .ini zu schreiben hat das Problem mit der Auswahl der jeweiligen Datenbank, also über eine einfaches Fileopendialog funktionierts dann nichtmehr.
    Die Zusatzinfo in die jeweilige Datenbank zu packen hat den Nachteil, dass man die jeweiligen Zeilen beim einlesen fürs Listview irgendwie ausschließen müsste.

    Naja wie gesagt vielleicht hat einer von euch ja eine bessere Idee?

    Zweites Problem:
    Wie kann ich das mehrmalige Laden der gleichen Datenbank unterbinden?

    Drittes Problem:
    Wie kann ich verhindern, dass mein Programm mehr als 1-mal gestartet werden kann? Erste Versuche mit "ProcessExists" führten mich nichts zum Ziel (irgendwie logisch wenn ich das am Anfang abfrage beendet sich das Prog. selbst :D )

    Danke schonmal für die Antworten.

    Gruß nuts

    • Offizieller Beitrag

    Zu 1: Ich würde die zusätzlichen Informationen mit in die Datenbank packen. Einfach an den Anfang der Datei schreiben (mit FileWriteLine) und beim Lesen dann vor der While...WEnd-Schleife die Zeilen mit FileReadLine wieder auslesen.

    Zu 2: Du könntest Dir in einer Variablen merken, welche Datei gerade geöffnet ist und vergleichst diese dann mit der Eingabe (FileOpenDialog) des Benutzers.

    Zu 3: Schau Dir mal _Singleton() in der Hilfe an.

  • Hm also erstmal zu 1, dann müsste ich aber in der Funktion anders weitermachen oder (Filereadtoarray?)? Bei Filereadline innerhalb der While Wend Schleife gelingt es mir nicht mehrere Zeilen auszuschließen. Laut Hilfe kann ich alle Zeilen einlesen oder eine bestimmte.

    2. + 3. gute Idee, glaube das schaffe ich :thumbup:

    edit \ Singleton ist verstanden und läuft. Ganz einfach wenn man den richtigen Befehl dafür kennt.
    Nur wie kommt man denn auf die Idee bei diesem Problem nach "Singleton" zu suchen? ?(

    Einmal editiert, zuletzt von nuts (30. Januar 2009 um 14:29)

    • Offizieller Beitrag

    Wenn eine Datei zum lesen geöffnet wird, dann wird bei FileReadLine jeweils die nächste Zeile gelesen:

    [autoit]


    Func Load() ; Datenbank-Datei laden
    Local $sItem
    Local $hFile = FileOpen($sDBFile, 0) ; Datei zum lesen öffnen
    If $hFile <> -1 Then ; wenn das öffnen erfolgreich war, dann...
    $LabelInhalt = FileReadLine($hFile) ; 1. Zeile aus der Datei lesen
    $InputInhalt = FileReadLine($hFile) ; 2. Zeile aus der Datei lesen
    _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]

    Beim schreiben macht man es dann genau andersrum:

    [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...
    FileWriteLine($hFile, $LabelInhalt) ; 1. Zeile schreiben
    FileWriteLine($hFile, $InputInhalt) ; 2. Zeile schreiben
    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]

    Zuerst die zusätzlichen Informationen verarbeiten und dann den Rest einlesen.

    Das mit Singleton weiß man, weil man nach einiger Zeit alle AutoIt-Befehle kennt (oder glaubt alle zu kennen ;) ).

  • Super eine ganz simple Lösung - wie immer genial Oscar, vielen dank!

    edit \ kleiner Nachtrag zu Problem2:
    ein _GUICtrlListView_DeleteAllItems($hLVHandle) an den Anfang der Load() Funktion zu hängen führt auch zum Ziel.

    Einmal editiert, zuletzt von nuts (30. Januar 2009 um 23:20)

  • Mhm doch noch eine Frage zu so später Stunde.

    Mein Script sieht jetzt etwas vereinfacht so aus:

    Spoiler anzeigen
    [autoit]


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

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

    Global $sHeader = "Aufgabe|Erstellt am|Termin|Status|Schlussbemerkung" ; Die Überschriften für das Listview und für das "Neuer Eintrag"-Fenster
    Global $iEdit

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

    #Region Hauptfenster
    Global $hGui = GUICreate("Listview-Datenbank-Beispiel",900, 600) ; Hauptfenster erstellen
    Global $hListView = GUICtrlCreateListView($sHeader, 0, 100, 900, 420, $LVS_SHOWSELALWAYS) ; Listview erstellen
    Global $hLabel = GUICtrlCreateLabel("" , 10, 10, 250, 50, Bitor($SS_CENTER, $SS_Centerimage),$SS_BLACKFRAME)
    GUICtrlSetFont($hlabel, 14, "", 0)
    Global $hLVHandle = GUICtrlGetHandle($hListView) ; das Handle vom Listview wird für die UDF-Listview-Funktionen benötigt
    _GUICtrlListView_SetColumn($hLVHandle, 0, "Aufgabe", 360, 0) ; 1. Spalte = 360 Px breit, links ausgerichtet
    _GUICtrlListView_SetColumn($hLVHandle, 1, "Erstellt am", 80, 0)
    _GUICtrlListView_SetColumn($hLVHandle, 2, "Termin", 80, 0)
    _GUICtrlListView_SetColumn($hLVHandle, 3, "Status", 80, 0)
    _GUICtrlListView_SetColumn($hLVHandle, 4, "Schlussbemerkung", 295, 0)

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

    Global $hMenu = GUICtrlCreateMenu("Menü") ;Erstellt das Menü für die HauptGUI
    Global $hcUser = GUICtrlCreateMenuItem("Neuer Benutzer", $hmenu) ; der 1. Kontextmenüeintrag
    Global $hcEinstellungen = GUICtrlCreateMenuItem("Einstellungen", $hmenu) ; der 2. Kontextmenüeintrag

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

    Global $hNew = GUICtrlCreateButton("Neuer Eintrag", 5, 530, 80, 35, $BS_DEFPUSHBUTTON) ; Dieser Button ist der Default-Push-Button (wenn der User [Enter] drückt)
    Global $hEdit = GUICtrlCreateButton("Markierten Eintrag bearbeiten", 95, 530, 110, 35, $BS_MULTILINE) ; $BS_Multiline für mehrzeiligen Button
    Global $hLoad = GUICtrlCreateButton("Laden", 230, 530, 70, 35)
    Global $hSave = GUICtrlCreateButton("Speichern", 310, 530, 70, 35)
    Global $hDel = GUICtrlCreateButton("Markierte Einträge löschen", 400, 530, 90, 35, $BS_MULTILINE)
    Global $hDelAll = GUICtrlCreateButton("Alle Einträge löschen", 500, 530, 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

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

    #EndRegion Hauptfenster

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

    #Region Fenster für neuen Eintrag
    Global $hGuiNew = GUICreate("Neuer Eintrag", 632, 150, -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 = 1 To $aHeader[0]
    GUICtrlCreateLabel($aHeader[$i], 4 + ($i - 1) * 125, 25, 90, 20) ; Überschriften-Label erstellen
    $aNew[$i - 1] = GUICtrlCreateInput("", 2 + ($i - 1) * 125, 40, 120, 20) ; Eingabefelder erstellen
    Next
    Global $hCreate = GUICtrlCreateButton("Eintrag speichern", 254, 85, 120, 25, $BS_DEFPUSHBUTTON) ; Button zum speichern
    #EndRegion Fenster für neuen Eintrag

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

    #Region Fenster für neuen User
    Global $hGUIUser = GUICreate("Neuen Benutzer anlegen", 293, 217, 193, 125)
    Global $hSaveUser = GUICtrlCreateButton("Speichern", 60, 120, 180, 50, 0)
    Global $hInputUser = GUICtrlCreateInput("", 50, 70, 200, 21)
    Global $hLabelUser = GUICtrlCreateLabel("Benutzername eingeben", 60, 20, 179, 24, Bitor($SS_CENTER, $SS_Centerimage))

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

    #EndRegion Fenster für neuen User
    _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][/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 $hcUser
    GUISetState(@SW_SHOW, $hGuiUser) ; das Fenster "Neuer Benutzer" anzeigen
    GUISetState(@SW_DISABLE, $hGui)
    Case $hSaveUser
    NewUser()
    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 = 0
    GUISetState(@SW_HIDE, $hGuiNew) ; "Neuer Eintrag"-Fenster verstecken
    GUISetState(@SW_ENABLE, $hGui) ; Hauptfenster wieder aktivieren
    WinActivate($hGui) ; und in den Vordergrund holen
    Case $hGuiUser ; User will das Fenster "Neuen Benutzer anlegen" schließen
    GUISetState(@SW_HIDE, $hGuiUser) ; "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 Then ; wenn $iEdit <> 0 (Eintrag bearbeiten), dann...
    _GUICtrlListView_SetItemText($hLVHandle, $iEdit, GUICtrlRead($aNew[$i]), $i) ; den Eintrag aus dem Eingabefeld ins Listview schreiben
    Else ; sonst $iEdit = 0 (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 Then ; wenn $iEdit <> 0 (Eintrag bearbeiten), dann...
    $iEdit = 0
    GUISetState(@SW_HIDE, $hGuiNew) ; "Neuer Eintrag"-Fenster verstecken
    GUISetState(@SW_ENABLE, $hGui) ; Hauptfenster wieder aktivieren
    WinActivate($hGui) ; und in den Vordergrund holen
    Else ; sonst $iEdit = 0 (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
    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
    EndFunc ;==>Edit

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

    Func Load() ; Datenbank-Datei laden
    _GUICtrlListView_DeleteAllItems($hLVHandle)
    Local $opendb = FileOpenDialog("Bitte auswählen", @ScriptDir & "\Datenbanken\", "Text (*.txt)")
    Global $sDBFile = $opendb
    Local $sItem
    Local $hFile = FileOpen($sDBFile, 0) ; Datei zum lesen öffnen
    Local $hLabelInfo = FileReadLine($hfile) ; 1. Zeile der Datenbank wird gelesen -> Für Labelbeschriftung
    GUICtrlSetData($hLabel ,$hLabelInfo)
    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
    Local $LabelInhalt = GUICtrlRead($hlabel)
    If $hFile <> -1 Then ; wenn das öffnen erfolgreich war, dann...
    FileWriteLine($hFile, $LabelInhalt) ; 1. Zeile schreiben
    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] [autoit][/autoit] [autoit]

    Func NewUser() ; Neuen Benutzer anlegen
    Local $newdb = GUICtrlRead($hInputUser)
    _FileCreate(@ScriptDir & "\Datenbanken\" & $newdb &".txt")
    Fileopen(@ScriptDir & "\Datenbanken\" & $newdb &".txt",0)
    FileWriteLine(@ScriptDir & "\Datenbanken\" & $newdb &".txt", $newdb)
    FileClose(@ScriptDir & "\Datenbanken\" & $newdb &".txt")
    EndFunc

    [/autoit]

    Allerdings bekomme ich 2 "Warnings" beim Syntax prüfen:

    Code
    C:\Dokumente und Einstellungen\Nussman\Desktop\autoitskripte\todo\ToDo.au3(170,34) : WARNING: $sDBFile: possibly used before declaration.
    	Local $hFile = FileOpen($sDBFile,
    	~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
    C:\Dokumente und Einstellungen\Nussman\Desktop\autoitskripte\todo\ToDo.au3(149,27) : WARNING: $sDBFile: declared global in function only. Prefer top of file.
    	Global $sDBFile = $opendb

    Aushebeln kann ich die Warnmeldung indem ich "Global $sDBFile" einfach an den Anfang des Skriptes setze.
    Zu funktionieren scheint es auch, wollte mich nur aml vergewissern ob man so einfach die Variablen in einer Funktion als "Global" deklarieren kann/soll/darf?

    Einmal editiert, zuletzt von nuts (31. Januar 2009 um 00:21)

    • Offizieller Beitrag

    Setz doch gleich $opendb als Global.
    Im Moment deklarierst du $opendb als Local und weist in der nächsten Zeile diesen Wert der Globalen Variable $sDBFile zu.

    [autoit]

    Local $opendb = FileOpenDialog("Bitte auswählen", @ScriptDir & "\Datenbanken\", "Text (*.txt)")
    Global $sDBFile = $opendb

    [/autoit]

    Also entweder $opendb als Global oder und $sDBFile weglassen (dafür $opendb verwenden) oder nur $sDBFile verwenden.

  • Ähm ja thx. Die Zeile ist natürlich unnötig.

    Noch eine Frage:

    Spoiler anzeigen
    [autoit]


    #Region Fenster für neuen Eintrag

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

    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 = 1 To $aHeader[0]
    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
    GUICtrlSetData($aNew[1], @MDAY & "." & @MON & "." & @YEAR) ;Vorgabe für Column1
    GUICtrlSetData($anew[2], "ohne") ;Vorgabe für Column2
    GUICtrlSetData($anew[3], "offen") ;Vorgabe für Column3
    Global $hCreate = GUICtrlCreateButton("Eintrag speichern", 254, 65, 120, 25, $BS_DEFPUSHBUTTON)

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

    #EndRegion Fenster für neuen Eintrag

    [/autoit]


    In dieser Region wird die Eingabemaske automatisch nach den Listviewüberschriften erstellt. Ziemlich cool und das wollte ich auch so lassen.
    Seht ihr eine Möglichkeit die erstellten Inputs auch der Länge nach den Überschriften im Listview anzupassen?

    Hier mal mein ganzes Skript, ich habe das Listview-Beispiel von Oscar etwas ausgebaut, soll ein Aufgabenplaner werden.

    Spoiler anzeigen
    [autoit]


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

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

    Global $sHeader = "Aufgabe|Erstellt am|Termin|Status|Schlussbemerkung" ; Die Überschriften für das Listview und für das "Neuer Eintrag"-Fenster
    Global $iEdit = -1
    Global $sDBFile = IniRead(@ScriptDir & "\konfig.ini", "Einstellungen", "StartDB","")
    Global $dbnew
    #Region Hauptfenster
    $LVStyle = BitOR($LVS_REPORT, $LVS_SINGLESEL, $LVS_SHOWSELALWAYS )
    $ExStyle = BitOR($LVS_EX_FULLROWSELECT, $WS_EX_DLGMODALFRAME, $LVS_EX_CHECKBOXES, $LVS_EX_DOUBLEBUFFER)
    Global $hGui = GUICreate("Listview-Datenbank-Beispiel",900, 600) ; Hauptfenster erstellen
    Global $hListView = GUICtrlCreateListView($sHeader, 0, 100, 900, 420, $LVStyle, $ExStyle) ; Listview erstellen
    Global $hLabel = GUICtrlCreateLabel("" , 10, 10, 250, 50, Bitor($SS_CENTER, $SS_Centerimage),$SS_BLACKFRAME)
    GUICtrlSetFont($hlabel, 14, "", 0)
    Global $hLVHandle = GUICtrlGetHandle($hListView) ; das Handle vom Listview wird für die UDF-Listview-Funktionen benötigt
    _GUICtrlListView_SetColumn($hLVHandle, 0, "Aufgabe", 360, 0) ; 1. Spalte = 360 Px breit, links ausgerichtet
    _GUICtrlListView_SetColumn($hLVHandle, 1, "Erstellt am", 80, 0)
    _GUICtrlListView_SetColumn($hLVHandle, 2, "Termin", 80, 0)
    _GUICtrlListView_SetColumn($hLVHandle, 2, "Status", 80, 0)
    _GUICtrlListView_SetColumn($hLVHandle, 4, "Schlussbemerkung", 295, 0)

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

    Global $hMenu = GUICtrlCreateMenu("Menü") ;Erstellt das Menü für die HauptGUI
    Global $hcUser = GUICtrlCreateMenuItem("Neuer Benutzer", $hmenu) ; der 1. Kontextmenüeintrag
    Global $hcEinstellungen = GUICtrlCreateMenuItem("Einstellungen", $hmenu) ; der 2. Kontextmenüeintrag

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

    Global $hNew = GUICtrlCreateButton("Neuer Eintrag", 5, 530, 80, 35, $BS_DEFPUSHBUTTON) ; Dieser Button ist der Default-Push-Button (wenn der User [Enter] drückt)
    Global $hEdit = GUICtrlCreateButton("Markierten Eintrag bearbeiten", 95, 530, 110, 35, $BS_MULTILINE) ; $BS_Multiline für mehrzeiligen Button
    Global $hLoad = GUICtrlCreateButton("Laden", 230, 530, 70, 35)
    Global $hSave = GUICtrlCreateButton("Speichern", 310, 530, 70, 35)
    Global $hDel = GUICtrlCreateButton("Markierte Einträge löschen", 400, 530, 90, 35, $BS_MULTILINE)
    Global $hDelAll = GUICtrlCreateButton("Alle Einträge löschen", 500, 530, 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

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

    #EndRegion Hauptfenster

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

    #Region Fenster für neuen Eintrag

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

    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 = 1 To $aHeader[0]
    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
    GUICtrlSetData($aNew[1], @MDAY & "." & @MON & "." & @YEAR) ;Vorgabe für Column1
    GUICtrlSetData($anew[2], "ohne") ;Vorgabe für Column2
    GUICtrlSetData($anew[3], "offen") ;Vorgabe für Column3
    Global $hCreate = GUICtrlCreateButton("Eintrag speichern", 254, 65, 120, 25, $BS_DEFPUSHBUTTON)

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

    #EndRegion Fenster für neuen Eintrag

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

    #Region Fenster für neuen User
    Global $hGUIUser = GUICreate("Neuen Benutzer anlegen", 293, 217, 193, 125)
    Global $hSaveUser = GUICtrlCreateButton("Speichern", 60, 120, 180, 50, 0)
    Global $hInputUser = GUICtrlCreateInput("", 50, 70, 200, 21)
    Global $hLabelUser = GUICtrlCreateLabel("Benutzername eingeben", 60, 20, 179, 24, Bitor($SS_CENTER, $SS_Centerimage), $SS_BLACKFRAME)
    #EndRegion Fenster für neuen User

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

    #Region Fenster für Einstellungen
    Global $inistartdb = IniRead(@ScriptDir & "\konfig.ini", "Einstellungen", "StartDB","")
    Global $hGUIEinstellungen = GUICreate("Einstellungen", 600, 600, 193, 125)
    Global $hSaveEinstellungen = GUICtrlCreateButton("Speichern", 210, 500, 180, 50, 0)
    Global $hInputStartDB = GUICtrlCreateInput($inistartdb , 50, 50, 500, 21)
    Global $hLabelStartDB = GUICtrlCreateLabel("Verzeichnis der Start DB angeben", 50, 10, 179, 24, Bitor($SS_CENTER, $SS_Centerimage), $SS_BLACKFRAME)
    Global $hButtonOpen = GUICtrlCreateButton("./.", 560, 50, 20, 21)
    #EndRegion Fenster für Einstellungen

    [/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(IniRead(@ScriptDir & "\konfig.ini", "Einstellungen", "StartDB","")) Then Load() ; wenn ein Ini-Eintrag existiert, dann entsprechende 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 $hcUser
    GUISetState(@SW_SHOW, $hGuiUser) ; das Fenster "Neuer Benutzer" anzeigen
    GUISetState(@SW_DISABLE, $hGui)
    Case $hcEinstellungen
    GUISetState(@SW_SHOW, $hGuiEinstellungen) ; das Fenster "Einstellungen" anzeigen
    GUISetState(@SW_DISABLE, $hGui)
    Case $hSaveUser
    NewUser()
    If FileExists($dbnew) then
    msgbox(0, "", "Gespeichert")
    else
    MsgBox (0, "", "Speichern fehlgeschlagen oder kein Benutzer angegeben")
    endif
    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
    Local $sDBFile = FileOpenDialog("Bitte auswählen", @ScriptDir & "\Datenbanken\", "Text (*.txt)")
    Load()
    Case $hSave ; User hat auf "Speichern" 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 "Speichern" im Fenster "Neuer Eintrag" geklickt
    NewItem()
    Case $hSaveEinstellungen ;User hat auf "Speichern" im Fenster "Einstellungen" geklickt
    Einstellungen()
    Case $hButtonOpen
    EinstellungenOpen()
    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
    GUISetState(@SW_HIDE, $hGuiNew) ; "Neuer Eintrag"-Fenster verstecken
    GUISetState(@SW_ENABLE, $hGui) ; Hauptfenster wieder aktivieren
    WinActivate($hGui) ; und in den Vordergrund holen
    Case $hGuiUser ; User will das Fenster "Neuen Benutzer anlegen" schließen
    GUISetState(@SW_HIDE, $hGuiUser)
    GUISetState(@SW_ENABLE, $hGui)
    WinActivate($hGui)
    Case $hGUIEinstellungen ; User will das Fenster "Einstellungen" schließen
    GUISetState(@SW_HIDE, $hGuiEinstellungen)
    GUISetState(@SW_ENABLE, $hGui)
    WinActivate($hGui)
    EndSwitch
    EndSwitch
    WEnd

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

    Func End()
    Save() ; Daten vor dem Beenden speichern
    _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)
    GUICtrlSetData($aNew[1], @MDAY & "." & @MON & "." & @YEAR)
    GUICtrlSetData($anew[2], "ohne")
    GUICtrlSetData($anew[3], "offen")
    $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)
    ;Global $sDBFile = FileOpenDialog("Bitte auswählen", @ScriptDir & "\Datenbanken\", "Text (*.txt)")
    Local $sItem
    Local $hFile = FileOpen($sDBFile, 0) ; Datei zum lesen öffnen
    Local $hLabelInfo = FileReadLine($hfile) ; 1. Zeile der Datenbank wird gelesen -> Für Labelbeschriftung
    GUICtrlSetData($hLabel ,$hLabelInfo)
    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 $sDBFile
    Local $iCount = _GUICtrlListView_GetItemCount($hLVHandle) - 1 ; Anzahl der Listview-Einträge holen
    Local $hFile = FileOpen($sDBFile, 2) ; Datei zum speichern (überschreiben) öffnen
    Local $LabelInhalt = GUICtrlRead($hlabel)
    If $hFile <> -1 Then ; wenn das öffnen erfolgreich war, dann...
    FileWriteLine($hFile, $LabelInhalt) ; 1. Zeile schreiben
    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] [autoit][/autoit] [autoit]

    Func NewUser() ; Neuen Benutzer anlegen
    Local $newdb = GUICtrlRead($hInputUser)
    if $newdb <>0 then
    Global $dbnew = @ScriptDir & "\Datenbanken\" & $newdb &".txt"
    _FileCreate($dbnew)
    Fileopen(@ScriptDir & "\Datenbanken\" & $newdb &".txt",0)
    FileWriteLine(@ScriptDir & "\Datenbanken\" & $newdb &".txt", $newdb)
    FileClose(@ScriptDir & "\Datenbanken\" & $newdb &".txt")
    endif
    EndFunc

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

    Func Einstellungen() ;Button Aktion Einstellungen GUI
    Local $startdb = GUICtrlRead($hInputStartDB)
    IniWrite(@ScriptDir & "\konfig.ini", "Einstellungen", "StartDB", $startdb)
    MsgBox(0, "", "Gesichert")
    EndFunc
    Func EinstellungenOpen() ;Button Aktion Einstellungen GUI
    Local $hopen = FileOpenDialog("Bitte auswählen", @ScriptDir & "\Datenbanken\", "Text (*.txt)")
    GUICtrlSetData($hInputStartDB ,$hopen)
    EndFunc

    [/autoit]
    • Offizieller Beitrag

    Die Region kannst Du so ändern:

    Spoiler anzeigen
    [autoit]


    #Region Fenster für neuen Eintrag

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

    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
    Global $aInputWidth[$aHeader[0]] = [120, 100, 60, 60, 260] ; hier die Länge (in Pixel) der Inputfelder eintragen
    Global $xPos = 2
    For $i = 1 To $aHeader[0]
    GUICtrlCreateLabel($aHeader[$i], $xPos + 2, 15, 110, 20) ; Überschriften-Label erstellen
    GUICtrlSetFont(-1, 8, 400, 0, 'Verdana') ; Schriftgröße und -art der Überschriften festlegen
    $aNew[$i - 1] = GUICtrlCreateInput("", $xPos, 30, $aInputWidth[$i-1], 20, Default, $WS_EX_STATICEDGE) ; Eingabefelder erstellen
    GUICtrlSetFont(-1, 10, 600, 0, 'Verdana') ; Schriftgröße und -art der Eingabefelder festlegen
    $xPos += $aInputWidth[$i-1] + 5
    Next
    GUICtrlSetData($aNew[1], @MDAY & "." & @MON & "." & @YEAR) ;Vorgabe für Column1
    GUICtrlSetData($anew[2], "ohne") ;Vorgabe für Column2
    GUICtrlSetData($anew[3], "offen") ;Vorgabe für Column3
    Global $hCreate = GUICtrlCreateButton("Eintrag speichern", 254, 65, 120, 25, $BS_DEFPUSHBUTTON)

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

    #EndRegion Fenster für neuen Eintrag

    [/autoit]
  • Ah danke, ich kam erst jetzt zum testen, funktioniert wie gewollt!
    Wird immer besser das Programm, jetzt sollen noch die Überschriften je User individuelle anpassbar sein, mal sehn ob ich das alleine schaffe :thumbup: