.ini in ListView einlesen [Problem]

  • Nabend zusamm. Ich hab en Problem, an dem ich nun seit 3 Stunden henge.
    Ich dachte ich packs mit der Hilfe alleine, aber das wird wohl nix ^^

    Also, ich hab eine .ini namens "Database.ini".
    Nun will ich diese in ein ListView eintragen.
    Dabei gibts 2 Probleme:

    #1: Es gibt pro Sektion 9 Schlüssel. Die Anzahl der Sektionen ist variabel.
    Wie lese ich nun den Wert jedes Schlüssels einer Sektion in das ListView ein?

    #2: Es sollen nur die ersten 5 Schlüssel/Werte eingelsen werden.
    Die anderen 4 kommen wo anders hin.

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>

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

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Database", 642, 397, 193, 122)
    GUISetBkColor(0xC0C0C0)
    $ListView1 = GUICtrlCreateListView("Vorname|Nachname|Datum|Klasse|ID", 4, 4, 633, 369)
    GUICtrlSendMsg(-1, 0x101E, 0, 150)
    GUICtrlSendMsg(-1, 0x101E, 1, 150)
    GUICtrlSendMsg(-1, 0x101E, 2, 100)
    GUICtrlSendMsg(-1, 0x101E, 3, 100)
    GUICtrlSendMsg(-1, 0x101E, 4, 129)
    $Menu1 = GUICtrlCreateMenu("Datei")
    $Menu1Item0 = GUICtrlCreateMenu ("Benutzer", $Menu1)
    $Menu1Item1 = GUICtrlCreateMenuItem("Erweiterte Benutzerinformationen", $Menu1Item0)
    $Menu1Item2 = GUICtrlCreateMenuItem("Termin für diesen Benutzer eintragen", $Menu1Item0)
    $Menu1Item3 = GUICtrlCreateMenuItem("", $Menu1)
    $Menu1Item4 = GUICtrlCreateMenuItem("Beenden", $Menu1)
    $Menu2 = GUICtrlCreateMenu("Hinzufügen/Entfernen")
    $Menu2Item1 = GUICtrlCreateMenuItem("Hinzufügen", $Menu2)
    $Menu2Item2 = GUICtrlCreateMenuItem("Entfernen", $Menu2)
    $Menu3 = GUICtrlCreateMenu("Hilfe")
    $Menu3Item1 = GUICtrlCreateMenuItem("Über", $Menu3)
    $Menu3Item2 = GUICtrlCreateMenuItem("Hilfe", $Menu3)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE, $Menu1Item4
    Exit
    Case $Menu2Item2
    _Entfernen ()
    Case $Menu2Item1
    _Hinzufugen ()
    Case $Menu1Item2
    _Eintragen ()
    EndSwitch
    WEnd

    [/autoit]

    Hier mal ein Teil des Scripts.
    alle anderen Funktionen sind vorerst mal nebensache.

    Hoffe mir kann da einer helfen ;(

  • Hallo


    Es kommt eine GUI mit ListView und Menü, der Eit-Button und de Menüpunkt beenden funktionieren auch schon, aber wo sind die ach so nebensächlichen Zeilen in denen du die Ini einlesen willst (vorher müsstest du die Ini erst schreiben). Für Datensätze machst du es besser mit TextFiles, gibt es schon einige im Forum z.B von Oscar im Forum Skripte,

    mfg (Auto)Bert

  • Ok, ich poste einfach mal das ganze script.
    Ich habe vor kurzem ne Anfrage von der Fahrschule bekomm, ob ich denen net mal
    Datenbank erstellen könnte, in der Termine für Fahrstunden gespeichert werden können.

    Also hier das ganze script. Die .ini erstellt man, indem man das Formular unter "Hinzufügen" ausfüllt.

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>

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

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Database", 642, 397, 193, 122)
    GUISetBkColor(0xC0C0C0)
    $ListView1 = GUICtrlCreateListView("Vorname|Nachname|Datum|Klasse|ID", 4, 4, 633, 369)
    GUICtrlSendMsg(-1, 0x101E, 0, 150)
    GUICtrlSendMsg(-1, 0x101E, 1, 150)
    GUICtrlSendMsg(-1, 0x101E, 2, 100)
    GUICtrlSendMsg(-1, 0x101E, 3, 100)
    GUICtrlSendMsg(-1, 0x101E, 4, 129)
    $Menu1 = GUICtrlCreateMenu("Datei")
    $Menu1Item0 = GUICtrlCreateMenu ("Benutzer", $Menu1)
    $Menu1Item1 = GUICtrlCreateMenuItem("Erweiterte Benutzerinformationen", $Menu1Item0)
    $Menu1Item2 = GUICtrlCreateMenuItem("Termin für diesen Benutzer eintragen", $Menu1Item0)
    $Menu1Item3 = GUICtrlCreateMenuItem("", $Menu1)
    $Menu1Item4 = GUICtrlCreateMenuItem("Beenden", $Menu1)
    $Menu2 = GUICtrlCreateMenu("Hinzufügen/Entfernen")
    $Menu2Item1 = GUICtrlCreateMenuItem("Hinzufügen", $Menu2)
    $Menu2Item2 = GUICtrlCreateMenuItem("Entfernen", $Menu2)
    $Menu3 = GUICtrlCreateMenu("Hilfe")
    $Menu3Item1 = GUICtrlCreateMenuItem("Über", $Menu3)
    $Menu3Item2 = GUICtrlCreateMenuItem("Hilfe", $Menu3)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE, $Menu1Item4
    Exit
    Case $Menu2Item2
    _Entfernen ()
    Case $Menu2Item1
    _Hinzufugen ()
    Case $Menu1Item2
    _Eintragen ()
    EndSwitch
    WEnd
    ; =======================================================================================================
    Func _Entfernen ()
    #Region ### START Koda GUI section ### Form=
    $Form3 = GUICreate("Entfernen", 260, 130, 193, 125)
    $Label1 = GUICtrlCreateLabel("ID oder Vorname des Benutzers eingeben", 10, 10, 201, 17)
    $Input1 = GUICtrlCreateInput("", 10, 25, 240, 21)
    $Button1 = GUICtrlCreateButton("Benutzer aus der Datenbank entfernen", 10, 96, 240, 25, 0)
    $Checkbox1 = GUICtrlCreateCheckbox("Erst alle Benutze mit diesem Namen anzeigen", 10, 52, 237, 17)
    $Checkbox2 = GUICtrlCreateCheckbox("Alle Benutzer mit diesem Namen entfernen", 10, 72, 233, 17)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    GUIDelete ($Form3)
    ExitLoop
    Case $Button1
    $Read1 = GUICtrlRead ($Input1)
    $Read2 = GUICtrlRead ($Checkbox1)
    $Read3 = GUICtrlRead ($Checkbox2)
    _Delete ($Read1, $Read2, $Read3)
    EndSwitch
    WEnd
    EndFunc ;==> Entfernen
    Func _Delete ($In1, $Check1, $Check2)
    $NumCheck = StringIsDigit ($In1)
    If $NumCheck = 1 Then
    $IdSearch2 = IniReadSectionNames (@ScriptDir & "\Database.ini")
    For $i = 1 To $IdSearch2[0] Step 1
    $IdRead = IniRead (@ScriptDir & "\Database.ini", $IdSearch2[$i], "ID_", "0")
    If $IdRead = $In1 Then
    IniDelete (@ScriptDir & "\Database.ini", $IdSearch2[$i])
    EndIf
    Next
    ElseIf $NumCheck = 0 Then
    If $Check2 = $GUI_CHECKED Then
    $NameSearch = IniReadSectionNames (@ScriptDir & "\Database.ini")
    For $i = 1 To $NameSearch[0] Step 1
    If $NameSearch[$i] = $In1 Then
    IniDelete (@ScriptDir & "\Database.ini", $NameSearch[$i])
    EndIF
    Next
    EndIf
    If $Check1 = $GUI_CHECKED Then
    _Entfernen_Liste ($In1)
    ElseIf $Check1 = $GUI_UNCHECKED Then
    IniDelete (@ScriptDir & "\Database.ini", $In1)
    EndIF
    EndIf
    EndFunc
    Func _Entfernen_Liste ($Para1)
    #Region ### START Koda GUI section ### Form=
    $Form4 = GUICreate("Entfernen-Liste", 634, 441, 193, 125)
    $ListView1 = GUICtrlCreateListView("Vorname|Nachname|Datum|Klasse|ID", 4, 4, 625, 405)
    GUICtrlSendMsg(-1, 0x101E, 0, 150)
    GUICtrlSendMsg(-1, 0x101E, 1, 150)
    GUICtrlSendMsg(-1, 0x101E, 2, 100)
    GUICtrlSendMsg(-1, 0x101E, 3, 100)
    GUICtrlSendMsg(-1, 0x101E, 4, 121)
    $Button1 = GUICtrlCreateButton("Weiter", 4, 412, 87, 25, 0)
    $Button2 = GUICtrlCreateButton("Abbrechen", 96, 412, 91, 25, 0)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    GUIDelete ($Form4)
    ExitLoop
    Case $Button1
    IniDelete (@ScriptDir & "\Database.ini", $Para1)
    MsgBox (64, "Erfolgreich", "Der Benutzer " & $Para1 & " wurde erfolgreich entfern")
    GUIDelete ($Form4)
    ExitLoop
    Case $Button2
    GUIDelete ($Form4)
    ExitLoop
    EndSwitch
    WEnd
    EndFunc
    ; =======================================================================================================
    #include <GUIConstantsEx.au3>
    Func _Hinzufugen ()
    Global $Input[8]
    #Region ### START Koda GUI section ### Form=c:\programme\autoit3\forms\form2.kxf
    $Form2 = GUICreate("Anmeldeformular", 609, 319, 193, 125)
    GUICtrlCreateLabel("Vorname", 20, 20, 46, 17)
    $Input[0] = GUICtrlCreateInput("", 20, 35, 190, 21)
    GUICtrlCreateLabel("Nachname", 20, 70, 56, 17)
    $Input[1] = GUICtrlCreateInput("", 20, 85, 190, 21)
    GUICtrlCreateLabel("Datum", 20, 120, 35, 17)
    GUICtrlCreateLabel("Klasse", 20, 170, 35, 17)
    $Input[2] = GUICtrlCreateInput("", 20, 185, 190, 21)
    GUICtrlCreateLabel("ID", 20, 220, 15, 17)
    $Input[3] = GUICtrlCreateInput("", 20, 235, 190, 21)
    $Date1 = GUICtrlCreateDate("2009/05/25 16:04:11", 20, 135, 190, 20)
    GUICtrlCreateGroup("Hauptangaben", 10, 5, 220, 270)
    GUICtrlCreateGroup("Erweiterte Angaben", 236, 29, 365, 246)
    $Label1 = GUICtrlCreateLabel("Stadt/Postleitzahl", 246, 49, 87, 17)
    GUICtrlSetState(-1, $GUI_DISABLE)
    $Input[4] = GUICtrlCreateInput("", 246, 64, 200, 21)
    GUICtrlSetState(-1, $GUI_DISABLE)
    $Label2 = GUICtrlCreateLabel("Straße/Hausnummer", 246, 99, 102, 17)
    GUICtrlSetState(-1, $GUI_DISABLE)
    $Input[6] = GUICtrlCreateInput("", 246, 114, 200, 21)
    GUICtrlSetState(-1, $GUI_DISABLE)
    $Input[5] = GUICtrlCreateInput("", 451, 64, 95, 21)
    GUICtrlSetState(-1, $GUI_DISABLE)
    $Input[7] = GUICtrlCreateInput("", 451, 114, 95, 21)
    GUICtrlSetState(-1, $GUI_DISABLE)
    $Checkbox1 = GUICtrlCreateCheckbox("Erweitert", 240, 8, 97, 17)
    $Button1 = GUICtrlCreateButton("Sperichern", 12, 284, 137, 25, 0)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###
    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    GUIDelete ($Form2)
    ExitLoop
    Case $Checkbox1
    If GUICtrlRead ($Checkbox1) = $GUI_CHECKED Then
    GUICtrlSetState($Label1, $GUI_ENABLE)
    GUICtrlSetState($Input[4], $GUI_ENABLE)
    GUICtrlSetState($Label2, $GUI_ENABLE)
    GUICtrlSetState($Input[6], $GUI_ENABLE)
    GUICtrlSetState($Input[5], $GUI_ENABLE)
    GUICtrlSetState($Input[7], $GUI_ENABLE)
    Else
    GUICtrlSetState($Label1, $GUI_DISABLE)
    GUICtrlSetState($Input[4], $GUI_DISABLE)
    GUICtrlSetState($Label2, $GUI_DISABLE)
    GUICtrlSetState($Input[6], $GUI_DISABLE)
    GUICtrlSetState($Input[5], $GUI_DISABLE)
    GUICtrlSetState($Input[7], $GUI_DISABLE)
    EndIf
    Case $Button1
    Dim $Read[8]
    For $i = 0 To 7 Step 1
    $Read[$i] = GUICtrlRead ($Input[$i])
    Next
    $DateRead = GUICtrlRead ($Date1)
    If FileExists (@ScriptDir & "\Database.ini") Then
    $IdSearch = IniReadSectionNames (@ScriptDir & "\Database.ini")
    For $i = 1 To $IdSearch[0] Step 1
    $IdRead = IniRead (@ScriptDir & "\Database.ini", $IdSearch[$i], "ID_", "0")
    If $IdRead = $Read[3] Then
    MsgBox (16, "Fehler", "Es ist bereits ein Benutzer mit dieser ID registriert!")
    EndIf
    Next
    EndIf
    _Save ($Read[0], $Read[1], $Read[2], $Read[3], $Read[4], $Read[5], $Read[6], $Read[7], $DateRead)
    EndSwitch
    WEnd
    EndFunc ;==> _Hinzufugen
    Func _Save ($Read1, $Read2, $Read3, $Read4, $Read5, $Read6, $Read7, $Read8, $Read9)
    IniWrite (@ScriptDir & "\Database.ini", $Read1, "Vorname_", $Read1)
    IniWrite (@ScriptDir & "\Database.ini", $Read1, "Nachname_", $Read2)
    IniWrite (@ScriptDir & "\Database.ini", $Read1, "Registrierdatum_", $Read9)
    IniWrite (@ScriptDir & "\Database.ini", $Read1, "Klasse_", $Read3)
    IniWrite (@ScriptDir & "\Database.ini", $Read1, "ID_", $Read4)
    IniWrite (@ScriptDir & "\Database.ini", $Read1, "Stadt_", $Read5)
    IniWrite (@ScriptDir & "\Database.ini", $Read1, "Postleitzahl_", $Read6)
    IniWrite (@ScriptDir & "\Database.ini", $Read1, "Straße_", $Read7)
    IniWrite (@ScriptDir & "\Database.ini", $Read1, "Hausnummer_", $Read8)
    EndFunc
    ; =======================================================================================================
    Func _Eintragen ()
    Global $Input[5]
    #Region ### START Koda GUI section ### Form=
    $Form5 = GUICreate("Termin eintragen / einsehen", 657, 401, 193, 125)
    GUISetBkColor(0xB4B4B4)
    $ListView1 = GUICtrlCreateListView("Datum|Uhrzeit|Treffpunkt|Art der Fahrt|Klasse", 4, 4, 649, 201)
    GUICtrlSendMsg(-1, 0x101E, 0, 150)
    GUICtrlSendMsg(-1, 0x101E, 1, 100)
    GUICtrlSendMsg(-1, 0x101E, 2, 150)
    GUICtrlSendMsg(-1, 0x101E, 3, 150)
    GUICtrlSendMsg(-1, 0x101E, 4, 75)
    $Date1 = GUICtrlCreateDate("2009/05/26 14:44:47", 12, 247, 186, 21)
    $Label1 = GUICtrlCreateLabel("Datum der Fahrt", 12, 232, 80, 15)
    $Label2 = GUICtrlCreateLabel("Uhrzeit", 12, 282, 37, 17)
    $Input[0] = GUICtrlCreateInput("0", 12, 300, 46, 21)
    GUICtrlSetLimit(-1, 23)
    $Updown1 = GUICtrlCreateUpdown(-1)
    GUICtrlSetLimit(-1, 23, 0)
    $Input[1] = GUICtrlCreateInput("0", 59, 300, 46, 21)
    GUICtrlSetLimit(-1, 23)
    $Updown2 = GUICtrlCreateUpdown(-1)
    GUICtrlSetLimit(-1, 59, 0)
    $Label3 = GUICtrlCreateLabel("Std.", 12, 320, 23, 17)
    GUICtrlSetFont(-1, 5, 400, 0, "MS Sans Serif")
    $Label4 = GUICtrlCreateLabel("Min.", 60, 320, 24, 17)
    GUICtrlSetFont(-1, 5, 400, 0, "MS Sans Serif")
    $Label5 = GUICtrlCreateLabel("Treffpunkt", 12, 352, 53, 15)
    $Input[2] = GUICtrlCreateInput("", 12, 368, 186, 21)
    $Label6 = GUICtrlCreateLabel("Art der Fahrt", 248, 232, 100, 15)
    $Input[3] = GUICtrlCreateInput("", 248, 248, 161, 21)
    $Label7 = GUICtrlCreateLabel("Klasse", 248, 282, 35, 15)
    $Input[4] = GUICtrlCreateInput("", 248, 296, 69, 21)
    $Button1 = GUICtrlCreateButton("Termin eintragen", 256, 364, 111, 25, 0)
    $Group1 = GUICtrlCreateGroup("Termin eintragen", 4, 212, 413, 185)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    GUIDelete ($Form5)
    ExitLoop
    Case $Button1
    Dim $Read[6]
    For $i = 0 To 4 Step 1
    $Read[$i] = GUICtrlRead ($Input[$i])
    Next
    $DateRead = GUICtrlRead ($Date1)
    _Add ($Read[0], $Read[1], $Read[2], $Read[3], $Read[4], $DateRead, $ListView1)
    EndSwitch
    WEnd
    EndFunc ;==> _Eintragen
    Func _Add ($Read1, $Read2, $Read3, $Read4, $Read5, $Read6, $Read7)
    GUICtrlCreateListViewItem ($Read6 & "|" & $Read1 & ":" & $Read2 & "|" & $Read3 & "|" & $Read4 & "|" & $Read5, $Read7)
    EndFunc

    [/autoit]

    Es sid noch lange nicht alle funktionen vorhanden, die es mal geben sollen.
    Der status steht bei etwa 30%

  • Hallo Commander21,

    Aufgefallen ist mir das die SectionNames der Ini gleich dem Vornamen sind, hier wäre meines Erachtens die ID besser angebracht (Dies hat aber nur m Rande) Der Befehl GUICtrlCreateListViewItem ist richtig umgesetzt, wenn auch die Namenswahl unglücklich ist. Überhaupt wäre das Progamm leichte lesbarer wenn deine Variablen einen Bezug zur Verwendung hätten.
    Ich komme mit der Bedienung oder Logik nicht zurecht, schaffe es auch nicht dass die Func _add angesprungen wird.

    Da du schreibst erst zu 30% fertig zu sein wäre es mehr als eine Überlegung wert, ob du nicht gleich auf eine Dazenbank z.B. SQLite umsteigst oder wenigstens Text-Files mit "|" als Feldtrennzeichen,

    mfg (Auto)Bert

  • Hatte mir auch erst überlegt, es mit SQLite zu machen, aber wie ich dann entsprechenden stellen in der Hilfe zu SQLite gesehn habe, ist es mir i.wie vergangen :rofl:

    Ich werd mich aber später nochmal damit auseinander setzen.

    Was meinst du damit, du kannst _Add nicht anspringen, versteh das grad nich so ganz ^^

    Wegen der Namensgebung der Variablen:
    Wie ich die Variablen benenne, kommt i.wie auf meine stimmung an, und ich hab grad ganz schön Kopfschmerzen, da ich
    fast den ganzen tag schon an dem Script sitze.

    Im Moment mache ich es so, dass ich für jede neue GUI ein eigenes Script mache ( Mit Koda ) und dieses dann erst später ins Hauptprogramm einfüge, so komme ich leichter vorran :)

    Zum Thema, das Problem hab ich jetz auf ne mehr oda weniger altmodische Art und Weise gelöst ^^
    Aber egal, hauptsache es geht jetz.

  • Hey,

    würde mich jetzt schon interessieren wie du das genau gelöst hast.
    Gerade die Verbindung zwischen einem angelegten User und den Terminen?

    Ich würde wahrscheinlich eine .txt Datei für alle User anlegen und eine .txt Datei pro User für die jeweiligen Termine. Die Verknüpfung ergäbe sich das aus dem User Namen und der ID (automatisch fortlaufend wäre wohl sinnvoll).
    Ist zumindest mein Konzept für ein ähnliche Skript, aber vielleicht hast du ja was besseres auf Lager?