ini Mehrfacheingabe und auslesen

  • Ich habe ein kleines Script gebastelt und klappt soweit auch.
    Es werden auch Daten in einen ini geschrieben.
    Die Daten werden beim naechsten Starten auch geladen.
    Nun moechte ich aber mehrere "Eintraege" (5) machen.
    Das heisst, das Script 5 mal starten und jedesmal werden die eintraege gespeichert und die letzten eintraege sollen angezeigt werden.
    Kann man das irgendwie mit einem Datum versehen?
    So hat man eine Sortierung in der ini und es wird immer die letzten EIntrage angezeigt.

    Der Grund ist, ich moechte dann noch eine Listview anlegen und dort diese Eintraege sehen.
    Somit kann man die Einstellungen aus den letzten 5 Starts direkt auswaehlen und muss nicht durch das ganze Script klicken.

    Einmal editiert, zuletzt von Perdix (12. September 2013 um 18:04)

  • Arbeite eben mit Sektionen in der Ini, also z.B. mit solch einem Aufbau:


    Code
    [Settings1]
    keyDatum=20130907
    keyA=value
    keyB=value
    ...
    [Settings2]
    keyDatum=20130912
    keyA=value
    keyB=value
    ...

    Für jeden neuen Datensatz wird eine neue Sektion angelegt. Wenn du das auf z.B. 5 beschränken willst musst du dir überlegen wie du das managen willst und wann welche Sektionen überschrieben werden oder gelöscht werden sollen. Wenn du das Datum reinbringen willst verwende die Datums Makros, also @Year, @MDay usw. und füge diesen Datumsstring als zusätzlichen Schlüssel in jede Sektion ein. So kannst du leicht ermitteln welche Sektion die älteste ist und von dir ersetzt werden soll. Du kannst das dann auch zur Sortierung des Listviews nutzen.

  • Hallo und Willkommen!
    Hier einige Beispiele:

    Spoiler anzeigen
    [autoit]


    #include <GUIConstantsEx.au3>

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

    Dim $data, $ini = @ScriptDir & "\config.ini"
    Dim $name = IniRead($ini, "Benutzerdaten", "Name", "Kein Fund")

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

    GUICreate("IniRead-IniWrite - Tut", 250, 150)
    GUICtrlCreateLabel("Name", 10, 12, 28, 17)
    $iptInput = GUICtrlCreateInput("", 48, 10, 107, 20)
    GUICtrlSetData(-1, $name)
    $btnSave = GUICtrlCreateButton("Speichern", 165, 10, 75, 22)
    $lblOut = GUICtrlCreateLabel("", 52, 45, 107, 17)
    $btnOut = GUICtrlCreateButton("Ausgabe", 165, 45, 75, 22)
    $btnSec = GUICtrlCreateButton("Sektion", 165, 77, 75, 22)
    $btnClose = GUICtrlCreateButton("Beenden", 165, 118, 75, 22)

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

    GUISetState(@SW_SHOW)

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

    While True
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE, $btnClose
    FileDelete($ini) ;i ini löschen
    ExitLoop
    Case $btnSave
    IniWrite($ini, "Benutzerdaten", "Name", GUICtrlRead($iptInput))
    $data = "PosX=300" & @LF & "PosY=200" & @LF & "Size=350"
    IniWriteSection($ini, "Position", $data)
    Case $btnOut
    $name = IniRead($ini, "Benutzerdaten", "Name", "Kein Fund")
    GUICtrlSetData($lblOut, $name)
    Case $btnSec
    $nameSec = IniReadSection($ini, "Position")
    If @error Then
    MsgBox(4096, "", "Ein Fehler ist aufgetreten, wahrscheinlich keine INI-Datei.")
    Else
    For $i = 1 To $nameSec[0][0]
    MsgBox(64, "IniReadSection", "Inhalt" & @CRLF & "Sektion: Position" _
    & @CRLF & "Anzahl der Einträge: " & $i & ' / ' & $nameSec[0][0] & @CRLF _
    & "Key: " & $nameSec[$i][0] & @CRLF & "Value: " & $nameSec[$i][1])
    Next
    EndIf
    EndSwitch
    WEnd
    ; Ende

    [/autoit]
  • Das mit Sectionen klingt sehr gut. Nur ergeben sich nun noch einige Fragen.
    Bisher kriege ich es nicht hin, das mehrere Sectionen angelegt werden.
    Die eine wird immer wieder ueberschrieben.
    Wie musst der Code aussehen, damit eine weiter Section angelegt wird?
    Wie wird automatisch der älteste Eintrag in der ini ueberschrieben?
    Leider stehe ich auch noch mit Listview auf Kriegsfuss.
    Da wuerde ich mich auch auf ein wenig Hilfe freuen.

    P.S.: Fange gerade erst an mit AutoIt und es sind die ersten Gehversuche.

  • Hi, die Sektionen in meinem Beispiel werden von mir beim schreiben festgelegt (siehe Benutzerdaten und Position ), sowie ein weiteres Beispiel mit Namen, Vornamen und Uhrzeit. ;)

    [autoit]


    IniWrite($ini, "Benutzerdaten", "Name", GUICtrlRead($iptInput))

    IniWriteSection($ini, "Position", $data)

    [/autoit]
    Spoiler anzeigen
    [autoit]


    Dim $data, $ini = @ScriptDir & "\My_ini.ini"

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

    GUICreate("IniRead-IniWrite - Tut", 300, 150)
    GUICtrlCreateLabel("VName", 5, 12, 40, 17)
    GUICtrlCreateLabel("NName", 5, 40, 40, 17)
    $iptVName = GUICtrlCreateInput("Max", 50, 10, 107, 20)
    $iptNName = GUICtrlCreateInput("Muster", 50, 40, 107, 20)
    $btnSave = GUICtrlCreateButton("Speichern", 165, 10, 75, 22)
    $btnOut = GUICtrlCreateButton("Ausgabe", 165, 45, 75, 22)
    $lblOut = GUICtrlCreateLabel("", 10, 130, 230, 17)

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

    GUISetState(@SW_SHOW)

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

    While True
    $time = @HOUR & ':' & @MIN & ':' & @SEC
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case -3
    FileDelete($ini) ;i ini löschen
    ExitLoop
    Case $btnSave
    IniWrite($ini, "Zeit", "Eintrag", $time)
    $data = "VName=" & GUICtrlRead($iptVName) _
    & @CRLF & "NName=" & GUICtrlRead($iptNName)
    IniWriteSection($ini, "Nutzer", $data)
    Case $btnOut
    GUICtrlSetData($lblOut, StringFormat('%s %s um %s eingetragen !', _
    IniRead($ini, "Nutzer", "VName", "Kein Fund"), _
    IniRead($ini, "Nutzer", "NName", "Kein Fund"), _
    IniRead($ini, "Zeit", "Eintrag", "Kein Fund")))
    EndSwitch
    WEnd
    ; Ende

    [/autoit]