2 Textfelder (Werte in Datei speichern und wieder einlesen)
-
Grüße an alle!
Bevor jemand meckert, hab schon in der Suche nach geschaut...vergebens.
Ich habe 2 Textfelder, per Buttonklick sollen dann, deren Werte in eine Textdatei geschrieben werden (untereinander oder getrennt durch Komma, Leerzeichen, keine Ahnung, was ist besser/einfach?) Wenn das klappt, möchte ich die Werte aus der Datei auch wieder in genau dieselben Textfelder einlesen, wie ist das möglich? Ist mein erstes (Schul-)Projekt in C++ und es wäre genial, wenn ich das hinbekommen könnte. Kann mir nicht jemand helfen?
MfG. Ramona K.
-
hmmm TIniFile ist hier wohl dein Freund... Sieh dich etwas in den Methoden und Eigenschaften von TIniFile in der Hilfe um...
Ansonsten könnte ich TFileStream empfehlen. Wenns denn völlig VCL-Los sein soll, dann wär fstream das Mittel der Wahl. Ich persönlich würde aber auf IniFile tendieren (o;
-junix
-
hm,
ich mag sowas eigentlich lieber
-
schreib doch die files der textboxen in eine listbox machst savetofile(textfile.txt) und lädst das dann später wieder mit loadfromfile rein (Edit1->Text=ListBox1->Items->Strings[0]; und Edit2->Text=ListBox1->Items->Strings[1];)
oder so ähnlich wars ich habs nicht ganz genau im kopf aber du dürftest ja verstehen, was ich meine... die listbox muss ja nicht visible sein
-
So könntest du es abspeichern:
TStringList *Eingaben; const String Datei = "Eingaben.txt"; Eingaben = new TStringList; try //Prüfen, ob Datei vorhanden ist. Wenn ja dann laden: { Eingaben->LoadFromFile(Datei); } catch(...) // Wenn nein dann neue Datei anlegen: { Eingaben->SaveToFile(Datei); } Eingaben->Add(Edit1->Text); Eingaben->Add(Edit2->Text); Eingaben->SaveToFile(Datei); delete Eingaben;
Und so könntest du das ganze wieder einlesen:
TStringList *Eingaben; const String Datei = "Eingaben.txt"; Eingaben = new TStringList; try //Prüfen, ob Datei vorhanden ist. Wenn ja dann Laden: { Eingaben->LoadFromFile(Datei); for(int i = 0; i<Eingaben->Count; i++) //Gesamte Datei durchlaufen... { Edit1->Text = Eingaben->Strings[i]; i = i+1; Edit2->Text = Eingaben->Strings[i]; //...und aktuellsten Einträge laden. } } catch(...) {} //Wenn nein dann Abbruch.
-
Und am Schluss wieder:
delete Eingaben;Hab ich vergessen
Eine Noch sichere Art und Weise wäre natürlich, nach den Einträgen zu suchen.
Dazu müsstest du Sie jedoch noch vor dem Abspeichern mit irgendetwas markieren://! Steht für Edit1, $ Steht für Edit2:
Eingaben->Add("!"+Edit1->Text);
Eingaben->Add("$"+Edit2->Text);Und beim Einlesen:
String Zeile;
for(int i = 0; i<Eingaben->Count; i++)
{
Zeile = Eingaben->Strings[i];
if(Zeile[1] == '!')
{
Zeile.Delete(1,1);
Edit1->Text = Zeile;
}
if(Zeile[1] == '$')
{
Zeile.Delete(1,1);
Edit2->Text = Zeile;
}
}
delete Eingaben;
-
Vielen Dank Jungs, ich denke mal nu wirds kein Problem mehr sein, dat hinzubasteln! ;o)
-
Als vertretter der "FSTREAMS" muss ich auch noch eine Lösung posten
// #include "fstream.h" fstream d; char puffer[2000]; // Schreiben d.open( "c:\\test.txt" ,ios::out ); d << Edit1->Text.c_str(); d << Edit2->Text.c_str(); d.close(); // Lesen d.open( "c:\\test.txt", ios::in ); d.getline( puffer, 2000 ); Edit1->Text = AnsiString( puffer ); d.getline( puffer, 2000 ); Edit1->Text = AnsiString( puffer ); d.close();
-
Also, irgendwie klappt das bei mir alles nicht...das Catch funktioniert auch net und beim FStram Beispiel da werden die Einträge nicht Zeilweise gespeichert, komischerweise auch irgendwie abstrakt eingelesen...hm, das Beispiel von Andist war schon ganz gut, nur klappen tuts leider net, wat nu?
-
wenn du beim fstream ein \n hinzufügst wird das zeilenweise gespeichert.
also file<<"hallo\nzeile2\nzeile3";
jetzt kann man es denke ich deiner Kreativität anvertrauen das fstream Beispiel so umzubauen das es richtig speichert.und das catch funktioniert nur ausserhalb der Entwicklungsumgebung(also dem BCB) oder wenn du das deaktivierst das da trotzdem Exceptions kommen.
-
Ich glaube ich schnall es einfach nicht. Die FStream Methode gefällt mir nicht wirklich, klappt aber eher als der erste Vorschlag. Ich möchte doch einfach nur die Werte aus den Textfeldern zeilenweise in eine Datei abspeichern und dann irgendwann wieder einlesen. Dabei soll natürlich jeder Wert auch wieder in das Feld geladen werden, in der es vorher stand. Ich verzweifle!!!
-
// Speichern TStringList *list = new TStringList(); for (int i = 0; i < Form1->ControlCount; i++) { TEdit *tmp_edit = dynamic_cast<TEdit*>(Form1->Controls[i]); if (tmp_edit) list->Add(tmp_edit->Text); } list->SaveToFile("c:\\editlist.txt"); delete list; // Laden TStringList *list = new TStringList(); list->LoadFromFile("c:\\editlist.txt"); for (int i = 0, j= 0; i < Form1->ControlCount; i++) { TEdit *tmp_edit = dynamic_cast<TEdit*>(Form1->Controls[i]); if (tmp_edit) tmp_edit->Text = list->Strings[j++]; } delete list;
Es werden alle Elemente auf der Form abgefragt, ob sie vom Typ TEdit sind. Wenn ja wird entsprechend der Text in die StringList geschrieben bzw. daraus gelesen.
-
Hi,
is aber nicht so schwer, das mit dem ini-file war doch ein guter tip.schreiben:
WritePrivateProfileString("Feldwerte", "Feld1",Edit1->Text.c_str(), "c:\\Werte.ini");lesen:
char* buffer = new char[255];
GetPrivateProfileString("Feldwerte", "Feld1", "", buffer, 255, "c:\\Werte.ini");
Edit1->Text = String(buffer);
delete [] buffer;das für alle deine text felder und alles is schön ordentlich und nachvollziebar, auch in der ini-datei
-
Danke, für den vorletzten Beitrag, unglaublich, mit so wenig Quelltext einwandfrei genau das, was ich wollte. Eine Frage bleibt jedoch: Wie speichere ich die Ini-Datei in demselben Verzeichnis, in dem auch die ausführbare *.exe liegt? Momentan speichert er alles unter "C:\\Eingaben.ini", wenn ich nur den Dateinamen eingebe, speichert er die Datei in den WinNT Ordner.
-
Über TApplication::ExeName und die verschiedenen ExtractFile...-Funktionen kannst du das Programmverzeichnis ermitteln. Nächstes Mal aber bitte die Suchfunktion benutzen.
-
Wenns doch nur so einfach wäre....er meckert, wenn ich schreibe:
String FileName = ExtractFileName(Application->ExeName); WritePrivateProfileString("Feldwerte", "Feld1",Edit1->Text.c_str(), Filename;
Es sei eine Konvertierung von AnsiString nach const char * nicht möglich!
-
Vergleich mal die Verwendung von Edit->Text und Filename, dann fällt dir hoffentlich etwas auf.
Und reite nicht ständig auf den blöden API-Funktionen rum, dafür gibt's TIniFile!
-
Soll ich mal ganz ehrlich sein? Da fällt mir nix auf. Würde jetzt gerne den Wert Filename gegen den Wert des Edit20 Feldes ersetzten, also
WritePrivateProfileString(Edit20->Text, "Feld1",Edit1->Text.c_str(), "C:\\Eingaben.ini");
Aber auch das geht nicht, da AnsiString nach const char irgendwie nicht möglich ist? Was ist da eigentlich der Unterschied und wie zum Himmel bekomme ich den Fehler weg? Immer wieder neue Probleme, wahnsinn, aber doch faszinierend...C halt! ;o)
-
Original erstellt von <unknown user>:
Konvertierung von AnsiString nach const char * nicht möglichSiehe FAQ unter "AnsiString".
-
Original erstellt von <unknown user>:
String FileName = ExtractFileName(Application->ExeName); WritePrivateProfileString("Feldwerte", "Feld1",Edit1->Text.c_str(), Filename;
Hi,
ExtractFileName ist wohl nicht richtig!
Zwischen Filename und dem ; fehlt noch eine Klammer zu!
Und wenn in Filename der Pfad (endl. Path) der *.exe steht´, was fehlt dann noch??? (ich meine ich nenne meine Datei auch nicht: "C:\\Windows\")
MFG
Alexander Sulfrian