Ini datei schreiben und auslesen bei TListView



  • hi leutz,
    ichwill aus der listview strings usw aus einer ini rauslesen

    TIniFile *ini;
       ini = new TIniFile(ChangeFileExt( Application->ExeName, ".INI" ) );
       ListView1->Items->Item->Caption=ini->ReadString("Server","ServerName", 100);
       ListView1->Items->Item->SubItems->Add(ini->ReadString("Server","IP", 168));
       ListView1->Items->Item->SubItems->Add(ini->ReadString("Server","PORT", 100));
       delete ini;
    

    das steht bei mir in der form_create
    das steht bei mir in dem button5

    TIniFile *ini;
       ini = new TIniFile(ChangeFileExt( Application->ExeName, ".INI" ) );
       ini->WriteInteger("Server","count",Form1->ListView1->Items->Count);
       ini->WriteString( "Server", "ServerName", Form1->ListView1->Items->Item->Caption);
       ini->WriteString( "Server", "IP", Form1->ListView1->Items->Item[0]->SubItems->Strings[0]);
       ini->WriteString ( "Server", "PORT", Form1->ListView1->Items->Item[0]->SubItems->Strings[1] );
       ini->UpdateFile();
       delete ini;
    

    so mein problem ,
    ich kann zwar die ini schreiben aber die ini wird nur ueberschrieben und es geht auch nicht ganz mit dem String

    ini->WriteString("Server","ServerName", Form1->ListView1->Items->Item->Caption);
    

    ich weis echt nicht wie das richtig geht



  • Hallo

    Form1->ListView1->Items->Item
    

    ist ein Array, dessen Größe durch

    Form1->ListView1->Items->Count
    

    zu ermitteln ist. Welchen Eintrag du willst, mußt du wissen, den Index schreibst du dann so

    Form1->ListView1->Items->Item[Index]->Caption
    

    Wenn du gleich den ausgewählten Eintrag haben willst, kannst du gleich

    if (Form1->ListView1->Selected != NULL)
      Form1->ListView1->Selected->Caption
    

    nehmen.

    /Edit : btw, wenn du diese Aktionen von Funktionen des Form1 selber ausführst, brauchst (oder besser solltest) du das "Form1->" nicht zu verwenden.

    bis bald
    akari



  • hi
    ich glaub du hast mich falsch verstanden...
    ich wollte bei OnClose ALLE Items + 2 Subitems in die ini speichern.
    Und bei formcreate die ini wieder auslesen



  • Die Antworten waren schon richtig, nur du bist völlig auf dem Holzweg. 😉
    Deine Codebeispiele lassen sich wegen des erwähnten fehlenden Indexes doch nichtmal compilieren.

    Davon abgesehen ist dein ListView beim Programmstart ja leer, da sind keine Items drin, denen dann nur noch Strings zugewiesen werden müssten.
    Für das Befüllen mit Items bist du selbst zuständig, und dabei erfolgt dann auch gleich die Zuweisung der Inhalte.

    TListItem *pItem = ListView1->Items->Add();
      pItem->Caption = "aus der Ini lesen";
      pItem->SubItems->Add("auch aus der Ini lesen");
      pItem->SubItems->Add("und nochmal ...");
    

    Allerdings halte ich eine Ini-Datei hier für weniger geeignet, da es nur sehr umständlich möglich ist (wenn überhaupt), die Einträge in eine Schleife auszuwerten.
    Besser wäre eine einfache Textdatei, bei der z.B. in jeder Zeile die Daten eines Items nebst SubItems stehen (per Semikolon getrennt, CSV eben). So eine Datei lässt sich mittels TStringList leicht in einer Schleife schreiben bzw. lesen.



  • jo is mir schon klar...
    aber wie gesagt ich will das wenn mehrere items in ter ListView sind alles in die ini speichern und das beim neustart wieder ReadString das die ListView wieder gefüllt wird



  • Hallo

    das beim neustart wieder ReadString das die ListView wieder gefüllt wird

    Da solltest du kein TIniFile nehmen, sondern wie Jansen geschrieben jat, eine eigene Datei aufmachen. Schau dir mal TFileSTream an.

    ]aber wie gesagt ich will das wenn mehrere items in ter ListView sind alles in die ini speichern

    Dazu mußt du das Array durchgehen

    for (int Lv = 0; Lv < Form1->ListView1->Items->Count; Lv++)
    {
      // speichere Form1->ListView1->Items->Item[Lv]->Caption in Datei
      }
    

    bis bald
    akari



  • cool mit dem speichern klappt jetzt alles!!THX!!
    ABER: ich bekomms immer boch nicht ausgelesen.
    ich probier es zur zeit erstmal mit etwas einfacheren und zwar
    Schreiben

    TIniFile *ini;
    ini = new TIniFile ("C:\\settings.ini");
    ini->WriteString("Pfad_cscrack", "Pfad", Edit1->Text);
    

    lesen

    TIniFile *ini;
    ini =new TIniFile ("C:\\settings.ini");
    ini->ReadString( "Pfad_cscrack", "Pfad", Form4->Edit1->Text);
    

    =
    Fehler

    Zugriffsverletzung bei adresse 0040213d in modul "bla.exe".Lesen von adresse 000002f0
    

    könnt ihr mir bitte helfen



  • Hallo

    da du nicht genau geschrieben hast, bei welcher Methode der Fehler kommt, kann ich dir nur mal denn Tip geben, Edit1 und Form4 zu untersuchen.
    Sieht so aus, als ob eines von beiden NULL ist.
    Siehe auch Debugger.

    bis bald
    akari



  • sry ich versteh das nicht ganz
    was meinst dumit NULL 😕



  • Hallo

    ich meine damit, das diese Pointer einen ungültigen Wert haben, weil sie auf kein gültige Instanz zeigen.
    Las dir vor dem WriteString mal den zu speicherden Wert irgendwo anzeigen.

    Übrigens halte ich

    ini->ReadString( "Pfad_cscrack", "Pfad", Form4->Edit1->Text);
    

    für verdächtig. meinst du vielleicht eher

    Form4->Edit1->Text = ini->ReadString( "Pfad_cscrack", "Pfad", "LEER");
    

    bis bald
    akari



  • jo danke klapt jetzt ich darf das nur nicht über formcreate laufen lassen.
    aber jetzt zu dem nächsten, und zwar listview das klappt noch nicht

    TListItem *NeuItem;
    NeuItem = Form1->ListView1->Items->Add();
    NeuItem->Caption = ini->ReadString("Server_"+ListView1->Items->Count,"Name", NULL);
    NeuItem->SubItems->Add(ini->ReadString("Server_"+ListView1->Items->Count,"Ip", NULL));
    

    kommt zwar kein fehler aber es passiert nichts



  • Steht denn überhaupt das richtige in deiner Ini-Datei? Findet sie dein Programm auch?



  • 1. kannst du den in das inifile reinschreiben?
    2. benutz doch mal den 3. parameter bei ReadString um fehler abzufangen...¨

    BigNeal


Anmelden zum Antworten