ListBox Items dauerhaft anlegen



  • Für den Umgang mit IniFiles: http://home.t-online.de/home/mario_kluge/index.html

    Ansonsten schau dir mal genau WriteString() an.
    Dort gibst du als ersten Parameter ja auch die Sektion an.
    Wenn die Sektion noch nicht besteht, dann wird sie automatisch erstellt!



  • hey super. Die Seite hilft mir echt weiter.
    Nun habe ich noch ein kleines Problem bei dem ReadSectionValues.
    Es funktioniert nicht ganz so wie ich es möchte. Mein Code sieht so aus:

    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
           StatusBar1->Panels->Items[0]->Text ="Ready";
    
            TIniFile *lkIniFile = new TIniFile("NetBomb.ini");
            lkIniFile->ReadSectionValues("History", ListBox1->Items);
            delete lkIniFile;
    
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::FormDestroy(TObject *Sender)
    {
            String history = "history";
            TIniFile *lkIniFile = new TIniFile("NetBomb.ini");
            for (int i = 0; i < ListBox1->Items->Count; i++)
            {
                    lkIniFile->WriteString("History",history + i , ListBox1->Items->Strings[i]);
    
            }
    
            delete lkIniFile;
    

    Beim Laden steht in der ListBox aber nicht nur der Value, sondern der komplette String, also history1=Aufgabe erledigt!
    Was mach ich falsch?



  • Entweder musst du nach ReadSection die einzelnen Strings parsen oder du verwendest eine Schleife und liest mit ReadString die jeweiligen Werte aus.

    [Zusatz]
    Ich würde als beim Laden die Werte der Sektion in eine Stringliste laden und dann die einzelnen Strings der Liste in einer Schleife parsen und mein Wert ermitteln und dann in die ListBox schreiben.

    Für das Parsen kannst du dir mal die AnsiString-Methoden SubString und Pos anschauen.
    [/Zusatz]

    [ Dieser Beitrag wurde am 06.02.2003 um 13:48 Uhr von JeGr editiert. ]



  • Du machst nichts falsch, du machst nur nicht das, was Du willst 😉

    Aus der Hilfe (sollte man mal gelesen haben:)

    Mit ReadSectionValues können Schlüssel und die Werte aller Schlüssel innerhalb eines Abschnitts der INI-Datei in eine String-Liste (TStrings-Nachkomme) eingelesen werden.

    Um nun nur den Wert zu bekommen, kannst Du jeweils den vorderen Teil abschneiden (siehe Methoden Substring, Pos von AnsiString), oder Du liest solange mit ReadString (ReadInteger...) die Schlüssel aus, bis Du als Rückgabewert den Defaultwert bekommst, also der Eintrag nicht existiert.



  • Du kannst auch beim Speichern die Anzahl der Einträge mitspeichern.
    Dann geht das Auslesen ohne große Probleme:

    Vor Deiner for-Schleife

    WriteInteger("History","ItemAnzahl",ItemAnzahl);

    Beim Einlesen dann halt eine Schleife bis ItemAnzahl.
    Nix Pharsen, Fertig.

    [ Dieser Beitrag wurde am 06.02.2003 um 14:06 Uhr von Bibo editiert. ]



  • Super, ich danke euch für eure Hilfen. Das einlesen klappt nun ohne Probleme. Nur wie kann ich es erreichen das die Einträge nicht doppelt abgespeichert werden?
    Jedesmal wenn ich das Prog beende, werden ja die Einträge in die ini gespeichert, egal ob sie schon da sind. Wie kann ich das am besten überprüfen?



  • SectionExists
    und
    EraseSection!



  • Ist das nicht sehr riskant?
    So wie ich es verstanden habe löscht EraseSection eine ganz Sektion. Was aber nun wenn das Prog abstürtz?
    Dann ist die Ini hin und die Daten sind weg.



  • Ich denke nicht, dass es ein Problem ist, wenn Du beim Beenden immer speicherst. Es werden die Daten ja nicht ein zweites Mal eingetragen, sondern nur die existierenden Werte überschrieben. D.h. die Datei wird nicht größer, es sei denn, es kommen neue Informationen hinzu.
    Nur wenn Du sehr Viele lange Einträge und hast (> 10.000 bei ca 80 Zeichen pro Schlüssel) wird das Speichern überhaupt bemerkbar. (Hängt natürlich auch vom der Systemgeschwindigkeit ab).

    Ansonsten kannst Du ja die Routine so umbauen, dass Du immer erst guckst, welcher Wert in der Ini steht und nur dann den Wert schreibst, wenn er sich geändert hat. So kannst Du auch Schlüssel, die zuviel sind wieder löschen.

    Ich denke aber nicht, dass Du soviel Aufwand treiben musst.



  • Es geht mir halt darum das wenn das Prog zm ersten Mal gestartet wird, das dann schon Einträge in den Listen stehen sollen. Diese stehen ja noch nicht in der ini. Wenn ich sie aber schon mal fest im objektinspektor anlege, dann stehen sie beim zweiten Programmstart doppelt in der Liste.



  • Wie wäre es denn mit TMemIniFile ? Die Daten werden solange im Speicher gehalten, bis TMemIniFile::UpdateFile aufgerufen wird. Sollte also vor UpdateFile der Rechner weg bröseln sind nur die Änderungen im Speicher futsch.



  • Mach es doch folgendermaßen:
    prüfe, ob deine Ini-Datei existiert.
    Wenn ja, lese die Ini ein, wenn nein, schreibe default-Einträge in die Liste.
    So hast Du kein Problem mit doppelten Einträgen.


Anmelden zum Antworten