2 Textfelder (Werte in Datei speichern und wieder einlesen)
-
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