Checkbox in ini Datei speichern

  • Hallo, ich beschäftige mich im Moment viel mit dem Thema ini.

    Ich habe eine Checkbox erstellt, die eine Funktion hat, diese soll aber nach dem Schließen gespeichert bleiben, ich schreibe einfach ein wert ist ja egal was dort rein in diese ini Datei.

    Dann sag ich, wenn ich starte, soll er abfragen, die ini zb. (Wenn 1 dann Harken rein, andernfalls wenn 2 dann Harken raus.) Das Problem ist jetzt, dass er immer den Harken setzt egal was drin steht, als würde er den Text was drin steht gar nicht interessieren.

    Es ist bestimmt ein denk Fehler von mir, warum das nicht geht oder das ganze Konstrukt funktioniert so nicht mit dem Abspeichern von Werten in der ini :/

    Code: in der while wenn ich auf die Checkbox klicke.

    Code
            Case $LadeImmer
                If GUICtrlRead($LadeImmer) = $GUI_CHECKED Then
                IniWrite($ini, "001", "HarkenOn/Off Von Laden Immer", "1")
                IniDelete ($ini, "002")
                Else
                IniWrite($ini, "002", "HarkenOn/Off Von Laden Immer", "2")
                IniDelete ($ini, "001")
                EndIf

    Code: über der while wenn gestartet wird lesen der ini Datei

    Code
    If IniRead($ini, "001","HarkenOn/Off Von Laden Immer", "1") Then
    GUICtrlSetState($LadeImmer, $GUI_CHECKED)
    ElseIf IniRead($ini, "001","HarkenOn/Off Von Laden Immer", "2") Then
    GUICtrlSetState($LadeImmer, $GUI_UNCHECKED)
    EndIf

    PS der obere Quellcode klappt ohne Probleme aber der zweite ist das Hauptproblem


    Gruß: Whitey

  • Wenn GUICtrlRead($LadeImmer) = $GUI_CHECKED ist, dann schreibst Du den Wert 1 in die Sektion [001] der .ini und löscht die Sektion [002].

    Andernfalls (also $GUI_UNCHECKED) schreibst Du den Wert 2 in die Sektion [002] der .ini und löscht die Sektion [001].

    Bei If IniRead ... fragst Du aber nur die Sektion [001] ab. Diese wurde in Fall von $GUI_UNCHECKEDaber gelöscht. Es greift also die Vorbesetzung 1 und liefert immer CHECKED.

    EDIT WhiteHorse :

    Zudem liefert If IniRead($ini, "001","HarkenOn/Off Von Laden Immer", "1") Then ...  immer TRUE, egal ob beim Value= "1" oder "2" steht.

    In beiden Fällen ist der String besetzt, und nur das wird hier geprüft.

    Warum verwendest Du überhaupt zwei Sektionen ([001] und [002]) ? Eine würde doch völlig ausreichen.

    P.S. : Haken , nicht Harken ;)

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

    2 Mal editiert, zuletzt von Musashi (29. Mai 2023 um 17:49) aus folgendem Grund: Antwort erweitert

  • Ich habe eine Checkbox erstellt, die eine Funktion hat, diese soll aber nach dem Schließen gespeichert bleiben, ich schreibe einfach ein wert ist ja egal was dort rein in diese ini Datei.

    Beim Beenden den Wert der Checkbox in der INI speichern und beim Start diesen auswerten. Brauchst du keine extra Werte definieren.

    Bsp.:

  • Ja habe ich auch gerade bemerkt :/ , wenn 1 dann Haken rein, wenn nichts drin steht dann raus Sektionen [001] und wird somit gelöscht.

    Beim Beenden den Wert der Checkbox in der INI speichern und beim Start diesen auswerten. Brauchst du keine extra Werte definieren.

    Bsp.:


    Danke BugFix,

    Ich habe es mir zusammen gebaut mit deinen Code und es klappt :)

    ich danke Euch!

    Gruß Whitey

  • Das wäre auch noch eine Lösung

    Spoiler anzeigen

    Lieben Gruß,
    Alina

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

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

  • AutoIt
    If Not FileExists($INI_FILE) Then         ; INI-Datei erstellen, wenn sie nicht existiert         
        Local $hFile = FileOpen($INI_FILE, 2)         
        FileClose($hFile)     
    EndIf

    Alina, das ist tatsächlich überhaupt nicht erforderlich. Wenn beim ersten Versuch von IniWrite die INI nicht existiert, wird sie sowieso erstellt. ;)

    BTW: Das Mixen von GuiGetMsg- und OnEvent- Mode ist keine gute Idee. :rolleyes:

  • Hauptsache es wird jetzt bei mir abgespeichert :D

    Ich hätte aber noch eine Frage, ist es denn möglich zb. wenn ich was in einer ini abspeichere.

    IniWrite($ini, "1", "Text", GUICtrlRead($Input)) In das Input feld schreibe ich jetzt zb. ein Text oder eine Zahl

    Dieser Text oder diese Zahl soll aber in eine Variable $TEST gespeichert werden? Damit man sie später wieder abrufen kann.

  • Du verwendest doch den Befehl bereits beim Ini-Schreiben, musst ihn nur auf die Variable ändern und dort einfügen wo du es brauchst:

    $TEST = GUICtrlRead($Input)

  • BugFix : Müsste das mit dem Auselesen des Ini-Wertes und Setzen für die Checkbox nicht noch einfacher gehen:

    AutoIt
    ;Deins:
    If BitAND(IniRead($Ini, 'checkbox', 'status', $GUI_UNCHECKED), $GUI_CHECKED) Then
        GUICtrlSetState($check, $GUI_CHECKED)
    EndIf
    
    ;Meins:
    GUICtrlSetState($check, IniRead($Ini, 'checkbox', 'status', $GUI_UNCHECKED))

    Es ist in der Ini ja der bool wert gespeichert (sollte zumindest) und den kann man doch direkt anwenden, anstatt ihn nochmal und zu Verknüpfen. Zumindest meine Test waren erfolgreich. Oder sehe ich den Vorteil deiner Methode gerade nicht?

  • Du verwendest doch den Befehl bereits beim Ini-Schreiben, musst ihn nur auf die Variable ändern und dort einfügen wo du es brauchst:

    $TEST = GUICtrlRead($Input)

    Danke das ist das was ich meinte, bedeutet wenn man was in eine Variable speichern will, schreibt man erst die Variable und dann was es macht, in dem Fall $TEST = GUICtrlRead($Input) und nicht GUICtrlRead($Input) = $TEST :D

    vielen Dank, ich lerne immer mehr dazu :)

    Gruß Whitey

  • BugFix : Laut Hilfe sollte das egal sein:

    "For Checkbox and Radio controls only the $GUI_CHECKED (1), $GUI_UNCHECKED (4) or $GUI_INDETERMINATE (2) states are returned so the value can be used directly."

    Nur bei ListView und Treeview sollte man das BitAnd nutzen. Wobei mich das $GUI_INDETERMINATE ein wenig irritiert.

  • Wobei mich das $GUI_INDETERMINATE ein wenig irritiert.

    Wenn du ein Checkbox mit Tristate Attribut verwendest, ist die Box weder checked noch unchecked, sondern nur grau.

    Nur bei ListView und Treeview sollte man das BitAnd nutzen.

    Stimmt, CB und Radio sind eindeutig. Aber es ist mir schon so in Fleisch und Blut übergegangen, dass ich jeden Status so prüfe. Auf jeden Fall die Variante, die definitiv keine Fehler zulässt. ;)

  • Naja das "ausgegraute" habe ich immer als "Disabled" gesehen (und könnte auch im ausgegrauten Zustand (un)checked sein).

    So kenne ich das zumindest von Lazarus/Delphi. Sprich du hast auch da nur 2 mögliche Zustände (checked = true / false) + Enabled = true (normal, Benutzer kann es ändern) / false (ausgegraut, Benutzer kann es nicht ändern).

  • Naja das "ausgegraute" habe ich immer als "Disabled" gesehen (und könnte auch im ausgegrauten Zustand (un)checked sein).

    Wenn du diese Checkboxen in einem Treeview setzt, gibt es Tristate:

    • alle Unterelemente checked: Status CHECKED

    • alle Unterelemente unchecked: Status UNCHECKED

    • Unterelemente kein einheitlicher Status: INDETERMINATE (ausgegraut aber ENABLED)

    Wird i.A. dann so genutzt, dass mit Markierung des ausgegrautem Item alle Unterelemente auf denselben Status gesetzt werden, die ehemals ausgegraute Box zeigt diesen dann ebenfalls an.

    P.S.

    Falls du jetzt um die Ecke kommst mit: Treeview ist ja was anderes als eine Checkbox, dann würde ich sagen: He - es gibt gar keine Checkbox! Das ist ein stinknormaler Button mit einem besonderen Style. :P

  • :P Nein alles gut. Im Sinne der Treeview und deinem beschriebenen Verhalten macht es durchaus Sinn. Nur halt (aus meiner Sicht) für die einzelne Checkbox nicht.