Textdatei in ListBox einlesen, spezielles Problem
-
Hi erst mal,
Hab da ne ListBox mit der ich eine Textdatei einlese das funktioniert dank der SuFu in eurem Forum auch Prima
, aber ich hab in der Textdatei 2 Namen pro Zeile die ich irgendwie trennen will so das nur der erste Name in der ListBox angezeigt wird.
Hatte da schon alles mögliche probiert aber er zeigt dann immer die komplette Zeile an.
Gibs da nen speziellen Befehl oder geht das villeicht garnicht? Hoffe ihr könnt mir helfenmfg
-
Hallo
Du must mit der AnsiString-Methode Pos das Trennzeichen in der Zeile suchen und mit der AnsiString-Methode SubString den Text bis zum Trennzeichen kopieren und in die ListBox einfügen.
bis bald
akari
-
Hi irgendwie komm ich damit nicht zurecht, habs jetz 3tage hintereinander versucht zu verstehen aber als anfänger komm ich da nicht weit, hab das ganze jetz so gemacht:
String i; TStringList *test = new TStringList(); test->LoadFromFile("test.txt"); i = (test->Strings[0]); delete test; AnsiString alles, teil; alles = i; teil = alles.SubString(alles.LastDelimiter(","),alles.Length()); ListBox1->Items->LoadFromFile(teil);aber wenn ich das ganze dann starte sagt er, er kann die datei ", blablablabla" nicht öffnen und diese datei enspricht halt dem letzen teil des inhalts der test.txt
-
Hallo
Du hast den zewiten Parameter von SubString falsch verstanden. Er gibt nicht an bis zu welchem Zeichen gelesen werden soll sondern wieviel Zeichen gelesen werden sollen
String alles; TStringList *test = new TStringList(); test->LoadFromFile("test.txt"); alles = test->Strings[0]; delete test; AnsiString teil; int pos = alles.LastDelimiter(","); teil = alles.SubString(pos,alles.Length() -pos); ShowMessage(teil);bis bald
akari
-
Hi
so klappt das auch irgendwie auch nicht, der gibt wieder das gleiche aus nur das er jetzt noch das letzte Zeichen löscht.
und gibt es dann noch die Möglichkeit den veränderten String in der ListBox wieder auszugeben?mfg
Hideki
-
Hallo
Hab nur nicht an das Trennzeichen gedacht. Aber das hier geht Problemlos, fehlt nur noch die Fehlerbehandlung wenn kein Trennzeichen gefunden wurde.
AnsiString Lang = "Name1,Name2"; int Pos = Lang.LastDelimiter(","); ShowMessage("Pos : " + IntToStr(Pos)); AnsiString Kurz = Lang.SubString(Pos +1, Lang.Length() - pos); ShowMessage("Kurz : " + Kurz);Das kannst du nun als Zerlegung einer Zeile umbauen.
Ansonsten wirst du keine weitere sinnvolle Hilfe bekommen können solange du nicht einen relevanten Auszug aus der besagten Datei hier mal postest und dazu noch eventueller Fehlermeldungen bzw. fehlerhafte Ausgaben.
"klappt irgendwie nicht" ist nicht aussagekräftig und wir sind keine Hellseher./Edit : Korrigiert
bis bald
akari
-
Hi,
akari schrieb:
AnsiString Lang = "Name1,Name2"; int Pos = Lang.LastDelimiter(","); ShowMessage("Pos : " + IntToStr(Pos)); AnsiString Kurz = Lang.SubString(Pos +1, Lang.Length() - pos); ShowMessage(Kurz : " + Kurz);Da fehlt ein Anführungszeichen

(Zeile 5)mfg
Jakel
-
Hideki schrieb:
Hi
und gibt es dann noch die Möglichkeit den veränderten String in der ListBox wieder auszugeben?Ja, so:
ListBox1->Items->Strings[0] = veraenderterstring;(veraenderterstring muss dein geänderter String sein)
mfg
Jakel
-
Hi
ich wünscht ich könnte bisschen mehr zeigen aber ich hab nicht mehr, ich befinde mich ganz am Anfang
Also ich sag mal was das evtl mal werden soll, ich will sone art Lesezeichen machen für Internet seiten, ich weis das gibs im Browser^^ aber ich will das machen um bisschen C++ zu lernen, also hab ich da eine ListBox mit Bezeichnungen für die Seite und wenn ich dann auf starten Klicke soll er mir den Browser mit dem Link öffnen.
So und ich bin da ganz am anfang, das reinschreiben geht teilweise aber er überschreibt immer die erste Zeile, aber das is jetz erstma das kleinere Problem, ich will halt nur nicht das in der ListBox Google,www.google.de sondern nur Google.
Hoffe es ist verständlich erklärt
Und den Code versteh ich nicht akari, der sagt mir beim start dann Pos: 6 wobei wenn dass das Komma anzeigen soll eigentlich 10 sein sollte und dann sagt der Kurz: Name2mfg
Hideki
-
Auf welche Art und Weise soll denn das Reinschreiben funktionieren?
Soll das gehen wenn das Programm schon kompiliert ist und man macht das dann auf dem Form mit zum Beispiel einem Edit oder schreibt man das alles vorher in eine Textdatei oder was?mfg
Jakel
-
Hi
also das wird über eine 2te Form gemacht da sind 2 Edit-Felder wo man das eintragen kann.
also das wär der Code der funktioniert auch ganz gut bis auf das er immer die erste Zeile überschreibt
String name; name = (Edit1->Text); String adresse; adresse = (Edit2->Text); String fertig; fertig =(name + ", " + adresse); if (Edit1->Text != "") { TStringList *list2 = new TStringList(); list2->Insert(1,fertig); //list2->Add(fertig); list2->SaveToFile(ExtractFilePath(ParamStr(0))+ "realmlist.txt"); delete list2; Form2->Close(); } else Form2->Close();mfg
Hideki
-
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 AnsiStringmfg
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; //--------------------------------------------------------------------------- #endifUnit1.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 kannmfg
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