Textdatei in ListBox einlesen, spezielles Problem



  • Lies doch einfach vorher die .txt-Datei ein, dann füge den String fertig mit ->Add hinzu und dann speichere sie ab.

    Das sähe dann ungefähr so aus:

    String name;
    name = (Edit1->Text);
    String adresse;
    adresse = (Edit2->Text);
    String fertig;
    fertig =(name + ", " + adresse);
    
    if (Edit1->Text != "")
    {
    TStringList *list2 = new TStringList();
        String pfad = (ExtractFilePath(ParamStr(0));
        list2->LoadFromFile(pfad + "realmlist.txt");
        list2->Add(fertig);
        list2->SaveToFile(pfad+ "realmlist.txt");
        delete list2;
    Form2->Close();
    }
    else
    Form2->Close();
    

    Habs noch nicht getestet, sollte aber funktionieren.

    mfg
    Jakel



  • jup das funktioniert jetzt, danke
    aber hab jetzt immer noch Probleme mit dem AnsiString

    mfg
    Hideki



  • Was für Probleme mit welchem AnsiString?

    mfg
    Jakel



  • Das Problem weshalb ich eigentlich den Thread gemacht hab 😉 also das der den Inhalt der Textdatei nur bis zum Komma in die ListBox ausgibt.

    mfg
    Hideki



  • Unit1.h

    //---------------------------------------------------------------------------
    
    #ifndef Unit1H
    #define Unit1H
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    #include <OleCtrls.hpp>
    #include "SHDocVw_OCX.h"
    
    //---------------------------------------------------------------------------
    class TForm1 : public TForm
    {
    __published:	// Von der IDE verwaltete Komponenten
       TListBox *ListBox1;
       TCppWebBrowser *browser;
       void __fastcall FormCreate(TObject *Sender);
       void __fastcall FormCloseQuery(TObject *Sender, bool &CanClose);
       void __fastcall ListBox1Click(TObject *Sender);
    private:	// Anwender-Deklarationen
    public:		// Anwender-Deklarationen
       __fastcall TForm1(TComponent* Owner);
       TStringList *li;
       void __fastcall Lade_Liste(AnsiString Filename);
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm1 *Form1;
    //---------------------------------------------------------------------------
    #endif
    

    Unit1.cpp

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma link "SHDocVw_OCX"
    #pragma link "SHDocVw_OCX"
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
       : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
       li = new TStringList();
       Lade_Liste("liste.txt");
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Lade_Liste(AnsiString Filename)
    {
       li->LoadFromFile(Filename);
       ListBox1->Clear();
       AnsiString lang;
       for(int i=0;i<li->Count;i++)
       {
          lang=li->Strings[i];
          ListBox1->Items->Add(lang.SubString(1,lang.Pos(",")-1));  
       }
    }
    void __fastcall TForm1::FormCloseQuery(TObject *Sender, bool &CanClose)
    {
       delete li;
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::ListBox1Click(TObject *Sender)
    {
       AnsiString lang=li->Strings[ListBox1->ItemIndex];
       const short pos=lang.Pos(",");
       browser->Navigate(WideString(lang.SubString(pos+1,lang.Length()-pos)));
    }
    


  • Yeah, funktioniert super, vielen dank euch allen für die Hilfe,aber ma ne andere Frage, wars bei euch auch so das ihr anfangs nicht genau wusstet wie ihr mit was beginnen sollt, weil bei mir is das so das wenn ich quellcode lese kann ich mir vorstellen was das teil wie genau macht aber selber schreiben fällt mir noch schwer, wenn ihr dieses Problem auch hatte, wodurch habt ihr es dann gelöst? 😉

    Nochmal Danke alle 👍

    mfg
    Hideki



  • Hallo

    Hideki schrieb:

    aber ma ne andere Frage, wars bei euch auch so das ihr anfangs nicht genau wusstet wie ihr mit was beginnen sollt

    Deshalb wird ja auch Anfängern empfohlen erstmal ein Tutorial zu den C++ Grundlagen zu machen. Und erstmal mit der Konsole anzufangen bevor man sich in die GUI stürzt.

    bis bald
    akari



  • Also ich hab den Teil mit den Konsolen-Programmen übersprungen 😃

    mfg
    Jakel



  • ich mag keine Konsolen Programme 😃 aber das Tutorial finde ich geil, das werde ich auch machen, danke nochmal für die gute Hilfe aber ich hab da noch ne Frage,
    ich will einen Eintrag über die ListBox entfernen also der soll dann in der ListBox und in der Textdatei entfernt werden, wie kann ich das machen?
    Wenn ich es über ListBox->Items->Delete mache will der nen Integer und selbst dann weis ich nicht wie ich es in der Textdatei entfernen kann

    mfg
    Hideki



  • Hallo

    Wenn ich es über ListBox->Items->Delete mache will der nen Integer

    Das ist auch vollkommen korrekt. Du solltest intern auch immer nur mit Indexen arbeiten, das beseitigt das Problem der Behandlung von Textdupletten.

    und selbst dann weis ich nicht wie ich es in der Textdatei entfernen kann

    Du must nach jedem Löschen oder Einfügen natürlich die Textdatei aus den Daten in der ListBox bzw. Speicher neu erstellen.

    bis bald
    akari



  • Hi hab das jetz so gemacht aber der sagt mir "Der Index der Liste überschreitet das Maximum (-1);

    int i=ListBox1->ItemIndex;
    ListBox1->Items->Delete(i);
       AnsiString lang=li->Strings[ListBox1->ItemIndex];
       TStringList *kla = new TStringList();
       for(int a=0;a<ListBox1->Items->Count;a++)
        {
         kla->Add(lang);
        }
        kla->SaveToFile("kla.txt");
        delete kla;
    

    mfg
    Hideki



  • Hi,

    mal ins blaue vermutet:

    int i=ListBox1->ItemIndex; 
    ListBox1->Items->Delete(i); 
    AnsiString lang=li->Strings[ListBox1->ItemIndex]; // siehe unten!
    

    ListBox1->ItemIndex ist -1 weil du vorher das Item mit dem Index gelöscht hast und es somit nicht mehr selektiert ist. Wenn du aber vorher schon den Index im Zwischenspeicher (i) hast, verwende doch einfach das 🙂

    Und ist es wirklich richtig das nach dem Speichern immer ein und derselbe Wert in der Textdatei (kla.txt) steht?

    eingelesene Textdatei:
    wert_1
    wert_2 // den löschen
    wert_3

    Ausgabe in kla.txt:
    wert_2
    wert_2
    wert_2

    mfg, Micha



  • RandomAccess85 schrieb:

    Wenn du aber vorher schon den Index im Zwischenspeicher (i) hast, verwende doch einfach das 🙂

    versteh ich nicht ganz, hab das jetzt so gemacht

    int i=ListBox1->ItemIndex;
    ListBox1->Items->Delete(i);
       AnsiString lang=li->Strings[ListBox1->ItemIndex];
       TStringList *kla = new TStringList();
       for(int i=0;i<ListBox1->Items->Count;i++)
        {
         kla->Add(lang);
        }
        kla->SaveToFile("kla.txt");
        delete kla;
    

    aber er bringt immer noch den gleichen Fehler

    RandomAccess85 schrieb:

    Und ist es wirklich richtig das nach dem Speichern immer ein und derselbe Wert in der Textdatei (kla.txt) steht?

    eingelesene Textdatei:
    wert_1
    wert_2 // den löschen
    wert_3

    Ausgabe in kla.txt:
    wert_2
    wert_2
    wert_2

    eigentlich nicht :D, ich glaub da hab ich bisschen falsch gemacht, das soll eigentlich so aussehen:
    eingelesene Textdatei:
    wert_1
    wert_2 // den löschen
    wert_3

    Ausgabe in kla.txt:
    wert_1
    wert_3

    mfg
    Hideki



  • Geh doch einfach mal mit dem Debugger durch und schau dir an welchen Index du verwenden willst.



  • Hi
    also der Debugger meckert an der Stelle wo ich die neue StringList erstelle aber auch nur dann wenn ich nicht das löschen aus der ListBox auskommentiere, dann funktioniert es relativ fehlerfrei.
    realtiv heist das er keinen Fehler bringt aber nicht das macht was ich will aber daran ist der code nicht schuld 😃

    mfg
    Hideki



  • Hallo,

    int i=ListBox1->ItemIndex;  // ItemIndex >= 0, sofern eins ausgewählt ist
    ListBox1->Items->Delete(i); // ItemIndex = -1
    AnsiString lang=li->Strings[ListBox1->ItemIndex]; // ItemIndex immernoch -1 aber an -1 existiert kein Item ... aber du wirst bald merken das die Zeile  sowieso überflüssig ist ^^
    

    btw. du musst auch keine neue StringList erstellen wenn du schon eine hast in der alle relevanten Werte stehen 🙂 .. schau dir in der Hilfe mal die Methoden und Eigenschaften der TStringList an.

    mfg, Micha!



  • Na endlich habs geschaft^^
    Danke eucht für die Hilfe und die Hinweise, hier ma meine Lösung:

    int i=ListBox1->ItemIndex;
    ListBox1->Items->Delete(i);
       AnsiString lang=li->Strings[i];
        li->Delete(i);
        li->SaveToFile("kla.txt");
    

    bis denne
    Hideki



  • Mir ist immer noch nicht klar, warum du zwei Stringlisten verwendest.
    Das hier geht doch auch.

    int i=ListBox1->ItemIndex;
    if( i > -1 ) //Für den fall, dass nichts selektiert ist
      ListBox1->Items->Delete(i);
    ListBox1->Items->SaveToFile("kla.txt");
    


  • Hi
    1. ich wusste nicht das das

    ListBox1->Items->SaveToFile
    

    exestiert^^
    2. das funktioniert nicht weil ich in die textdatei beide teile schreiben muss, also Name1,Name2 aber in der ListBox wird nur Name1 ausgegeben und somit dann auch nur Name1 gespeichert.
    Aber das

    if( i > -1 ) //Für den fall, dass nichts selektiert ist
    

    kann ich gut gebrauchen 😃

    mfg
    Hideki



  • TListBox::Items ist vom Typ TStrings. Das hatte aber auch RandomAccess85 schon angedeutet.


Anmelden zum Antworten