Textdatei in ListBox einlesen, spezielles Problem
-
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
-
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_3Ausgabe in kla.txt:
wert_2
wert_2
wert_2mfg, 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_3Ausgabe in kla.txt:
wert_2
wert_2
wert_2eigentlich 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_3Ausgabe in kla.txt:
wert_1
wert_3mfg
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