CheckBox-Zustand aus Datei auslesen



  • Hallo zusammen,
    ich habe folgendes Problem: Ich möchte den Zustand (0 oder 1) von Checkboxen von einem Formular in einer einfachen txt-Datei abspeichern und sie später wieder laden.
    Das abspeichern klappt soweit - die entsprechenden Werte der Checkboxen sind in der Datei enthalten.
    Beim Laden bekomme ich es allerdings nicht hin, dass dieser Wert (0 oder 1) als Wert der Eigenschaft "Checked" übergeben wird.

    //Deklaration der Variable
    char datbuffer[50];
    [...]
    //Initialisierung der Datei
    fstream datei2(OpenDialog1->FileName.c_str(),ios::in);
    [...]
    //Auslesen aus der Datei
    datei2.getline(datbuffer,50);
    Form1->CheckBox8->Checked=datbuffer;
    

    Die eigentlichen Werte (0 oder 1) kann ich z.B. mit einem Panel-Feld anzeigen lassen. Das heißt, dass das Abspeichern und Laden funktioniert.
    Ich habe auch noch Edit-Felder, die ich abspeichere und wieder lade. Bei denen klappt es ohne Probleme.
    Ich arbeitet mit dem Borland Builder 5



  • Ich würde ja vermuten, daß sich hinter Checked ein Boolean-Wert verbirgt, da solltest du auch mit Zahlen arbeiten:

    int check;
    ...
    datei2>>check;
    Form1->CheckBox8->Checked=check;
    


  • Man kann auch die Windows-API Funktionen "WritePrivateProfileString"
    und "GetPrivateProfileString" verwenden.
    Diese sind zwar veraltet aber funktionieren nach wie vor:

    char cWert[255]={0};
    
     //Zustand der Checkbox in Textdatei schreiben
     wsprintf(cWert, "%d", (int)CheckBox->Checked);
     WritePrivateProfileString("Einstellungen", "Schalter1", cWert, "c:\\MeineIniDatei.TXT");
    
    //Zustand der Checkbox aus Textdatei lesen
    
    GetPrivateProfileString("Einstellungen", "Schalter1", "", cWert,255, "c:\\MeineIniDatei.TXT");
    CheckBox->Checked=false; //default Wert
    if (cWert[0]){ //Es wurde etwas ausgelesen
       CheckBox->Checked=(bool) atoi(cWert);
    }
    


  • @CStoll: Danke für den Tipp! Ich hatte die Datentypen nicht berücksichtigt. Aber jetzt funktioniert es. 👍



  • Das Auslesen der Checkboxen klappt jetzt wunderbar, allerdings habe ich nun ein anderes Problem:
    Ich lese den Text eines Edit-Feldes in die Text-Datei ein. Soweit sogut.
    Wenn dieser Text allerdings Leerzeichen enthält, dann betrachtet es mein fstream als Trennzeichen und schreibt die Zeichen nach dem Leerzeichen in das nächste Feld.

    Wenn ich also z.b. Vorname und Name in einem Edit-Feld habe, liest er das auch so in die Text-Datei ein, aber beim auslesen, schreibt er den Vornamen in das erste Feld und den Nachnamen in das nächste Edit-Feld (obwohl dort z.b.die Straße stehen sollte).

    Wie kann ich denn festlegen, dass nicht das Leerzeichen, sondern nur der Zeilenumbruch als Trennzeichen verwendet wird?



  • Indem du nicht den Eingabe-Operator zum Lesen verwendest, sondern std::getline(). (der liest normalerweise bis zum Zeilenende, aber als letzten Parameter kannst du auch jedes andere Trennzeichen vorgeben)



  • Es klappt!
    Aber wenn ich Checkboxen und Edit-Felder in einer Anwendung auslesen will, habe ich das Phänomen, dass das erste Edit-Feld leer bleibt und der Inhalt, der eigentlich dort drin stehen müsste, ins nächste Feld rutscht.

    int check;
    string str;
    [...]
    datei2>>check;
    Form1->CheckBox1->Checked=check;
    datei2>>check;
    Form1->CheckBox2->Checked=check;
    getline(datei2,str);
    Form1->Edit1->Text=str.c_str();
    getline(datei2,str);
    Form1->Edit2->Text=str.c_str();
    

    In diesem Beispiel werden beide Checkboxen korrekt gesetzt, das Edit1-Feld bleibt leer und im Edit2-Feld steht der Inhalt, der eigentlich ins Edit1-Feld gehört.



  • Hast du hinter den Checkbox-Einträgen jeweils einen Zeilenwechsel in der Datei stehen? Wenn ja, steht der Lesezeiger nach Zeile 6 auf dem Zeilenende hinter dem letzten Checkbox-Eintrag - den Rest der Zeile müsstest du per ignore() überlesen.



  • In meiner Text-Datei wird nach jedem Eintrag ein Zeilenwechsel gemacht:

    datei<<Form1->CheckBox1->Checked<<endl;
    datei<<Form1->CheckBox2->Checked<<endl;
    datei<<Edit1->Text.c_str()<<endl;
    datei<<Edit2->Text.c_str()<<endl;
    

    Und so steht es dann auch in der Text-Datei:

    0
    1
    test1
    test2
    

    Wo/wie wird denn der ignore-Befehl verwendet? Ich bekomme eine Fehlermeldung, dass es eine undefinierte Funktion sei.



  • ignore() ist eine Methode der Stream-Klassen, das kannst du per datei2.ignore(); direkt vor der ersten String-Eingabe anwenden.


Anmelden zum Antworten