Editfelder speichern und in einer StringGrid list abrufen
-
Halloooo allerseits,
ich habe vier Edit felder & ein Label + 1 Memo, so ich möchte jetzt gerne die sachen speichern, die ich dort eingegeben habe, z.B. Edit1 mit dem Text "Blablala" usw..., so das will ich alles mit einem Button in eine Txt datei speichern, die ich dann wieder in einer StringGrid abrufen kann.
Kann mir da wer helfen? ich habs soweit hinbekommen, das er das in die entsprechende datei abspeichert, doch wenn ich in die txt-datei gucke, seh ich gar nichts vondem, was ich abgespeichert habe, desweiteren sollen die editfelder in der text datei durch ";" abgegrenzt sein, also z.B. Name(Edit1Feld);Vorname(Edit2Feld) usw...
-
Alle deine Probleme lassen sich durch Benutzung der BB-Hilfe lösen

Ich geb nur mal nen Tipp:
StringList->Strings[0] = Edit1->Text+ ";" + Edit2->Text + usw.; Stringlist->SaveToFile("BALABALABA");
-
Statt:
StringList->Strings[0] =Nimm:
StringList->Add("Shdg");
-
Hallo
schau in die BCB-FAQ hier in Forum, gleich in der TOP 3 ganz oben ist das speichern in Dateien erklärt.
Das Auseinandertrennen beim Laden kannst du mit den AnsiString-Methoden machen, insbesondere Pos() und SubString().
Zu StringGrid findest du auch in der FAQ und der BCB-Hilfe einiges.bis bald
akari
-
ich brauche jetzt nur noch nen code dafür, dass er dann in der zweiten zeile weiterschreibt!
also dass das in der txt-file so aussieht:
Name1;Vorname1;
Name2;Vorname2;
...er sollte also einen Zeilenumbruch machen,sobald ich einen anderen Namen & Vornamen eingebe und auf speichern klicke
-
Hallo
Zeilenumbruch? Ich denke du willst das in ein StringGrid schreiben, also must du eine neue Zeile anfügen. Das mast du mit
StringGrid->RowCount++;bis bald
akari
-
RowCount ist kein object von TStringlist überleg hmmmmm

-
ach habs schon selber...dankeschön !
-
Also das funktioniert soweit, er macht schon ne zweite zeile auf wenn ich auf speichern klicke, nur er schreibt mir jetzt in der textdatei nicht in die zweite zeile, also er schreibt trotzdem nur wieder in eine zeile!
-
TStringList *PatientenListe = new TStringList; PatientenListe->Add(Form2->Edit3->Text+";" + Form2->Edit4->Text+ ";" + Form2->Label22->Caption+ ";" + Form2->Edit6->Text+ ";" + Form2->Edit2->Text+ ";" + Form2->Memo1->Text+ ";"); PatientenListe->SaveToFile("PatientenListe.txt"); Form4->StringGrid1->RowCount++;
-
Du speicherst hier doch nur eine Zeile in die Datei. Warum überhaupt der Umweg übder die Datei? Du kannst doch direkt in das StringGrid schreiben.
Du könntest vielleicht auch noch den Code zum Schreiben in das StringGrid zeigen.
-
Wenne mir sagst wie ich das geht, mach ich das gerne !
hier der code
void __fastcall TForm4::FormShow(TObject *Sender) { TStringList* pStrings = new TStringList; pStrings->LoadFromFile(ExtractFilePath(ParamStr(0))+"PatientenListe.txt"); StringGrid1->RowCount = pStrings->Count+1; for(int ilLine = 0; ilLine < pStrings->Count; ilLine++) { for(int ilCol = 0; ilCol < 6; ilCol++) StringGrid1->Cells[ilCol][ilLine+1] = ExtractFieldContents(pStrings->Strings[ilLine], ";", ilCol+1); } } //--------------------------------------------------------------------------- AnsiString ExtractFieldContents(AnsiString slInputStr, AnsiString slSeparator, int ilField) { // falls Feldnummer oder Separator ungültig, leeren String zurückgeben: if(ilField < 1 || slSeparator == EmptyStr) return EmptyStr; // Nummer des letzten Buchstaben des gesuchten Teilstrings: int ilLastChar = 0; // Falls gesuchtes Feld gleich als erstes kommt: if(ilField == 1) { // Falls keine Trennzeichen im Hauptstring vorhanden: if(slInputStr.Pos(slSeparator) < 1) // ganzer String ist unser: ilLastChar = slInputStr.Length(); else // ansonsten letzten Buchstaben merken: ilLastChar = slInputStr.Pos(slSeparator) - 1; } // falls nicht 1. Feld gesucht: else { // in Schleife nach den Trennzeichen suchen for(int ilFieldNo = 1; ilFieldNo < ilField; ilFieldNo++) { // Falls Trennzeichen gefunden: if(slInputStr.Pos(slSeparator) > 0) { // nicht benötigtes Feldes killen: slInputStr = slInputStr.SubString(slInputStr.Pos(slSeparator)+ slSeparator.Length(), slInputStr.Length() - slInputStr.Pos(slSeparator) + 1 - slSeparator.Length()); } // Falls keine Trennzeichen mehr, obwohl welche da sein sollten, // String killen: else slInputStr = EmptyStr; } // Falls im geköpften String keine Leerzeichen mehr vorhanden, // ganzen String nehmen if(slInputStr.Pos(slSeparator) < 1) ilLastChar = slInputStr.Length(); // ansonsten letzten Buchstaben merken: else ilLastChar = slInputStr.Pos(slSeparator) - 1; } // falls überhaupt noch irgendetwas vom Hauptstring übrig: if(slInputStr.Length() > 0 && ilLastChar <= slInputStr.Length()) // Feldinhalt herausschneiden und zurückgeben return slInputStr.SubString(1, ilLastChar); else // ansonsten leeren String zurückgeben: return EmptyStr; }bissl langer text, aber ich denke es geht !
Edit:
Ruhig mal die 'C/C++'-Tags verwenden!
-
Wirf doch mal einen Blick auf den FAQ-Eintrag zum Laden/Speichern eines StringGrids.
Mit TStringList::CommaText bzw. (ab BCB6) DelimitedText lässt sich das schön vereinfachen.
-
Also so ganz verstehe ich das nicht! er speichert mir jetzt die sachen, aber komischerweise nur alles in
EINE
spalte!hier der code in der form, wo sich das StringGrid verbirgt:
void __fastcall TForm4::FormShow(TObject *Sender) { // StringGrid laden // Liste, die das Abbild der Datei enthalten wird TStringList *list2 = new TStringList(); // Liste aus Datei laden list2->LoadFromFile("balblalb.txt"); // Zeilen- und Spaltenzahl setzen StringGrid1->RowCount = list2->Count - 1; StringGrid1->ColCount = list2->Strings[0].ToInt(); // Werte zeihlenweise aus der Liste übertragen for (int y = 1; y < list2->Count; y++) StringGrid1->Rows[y - 1]->CommaText = list2->Strings[y]; // nicht vergessen, den Speicher wieder freizugeben delete list2; } //--------------------------------------------------------------------------- AnsiString ExtractFieldContents(AnsiString slInputStr, AnsiString slSeparator, int ilField) { // falls Feldnummer oder Separator ungültig, leeren String zurückgeben: if(ilField < 1 || slSeparator == EmptyStr) return EmptyStr; // Nummer des letzten Buchstaben des gesuchten Teilstrings: int ilLastChar = 0; // Falls gesuchtes Feld gleich als erstes kommt: if(ilField == 1) { // Falls keine Trennzeichen im Hauptstring vorhanden: if(slInputStr.Pos(slSeparator) < 1) // ganzer String ist unser: ilLastChar = slInputStr.Length(); else // ansonsten letzten Buchstaben merken: ilLastChar = slInputStr.Pos(slSeparator) - 1; } // falls nicht 1. Feld gesucht: else { // in Schleife nach den Trennzeichen suchen for(int ilFieldNo = 1; ilFieldNo < ilField; ilFieldNo++) { // Falls Trennzeichen gefunden: if(slInputStr.Pos(slSeparator) > 0) { // nicht benötigtes Feldes killen: slInputStr = slInputStr.SubString(slInputStr.Pos(slSeparator)+ slSeparator.Length(), slInputStr.Length() - slInputStr.Pos(slSeparator) + 1 - slSeparator.Length()); } // Falls keine Trennzeichen mehr, obwohl welche da sein sollten, // String killen: else slInputStr = EmptyStr; } // Falls im geköpften String keine Leerzeichen mehr vorhanden, // ganzen String nehmen if(slInputStr.Pos(slSeparator) < 1) ilLastChar = slInputStr.Length(); // ansonsten letzten Buchstaben merken: else ilLastChar = slInputStr.Pos(slSeparator) - 1; } // falls überhaupt noch irgendetwas vom Hauptstring übrig: if(slInputStr.Length() > 0 && ilLastChar <= slInputStr.Length()) // Feldinhalt herausschneiden und zurückgeben return slInputStr.SubString(1, ilLastChar); else // ansonsten leeren String zurückgeben: return EmptyStr; }und jetzt der "speicher-button", mit den edit feldern(die in die ich in der tabelle speichern will) in der anderen form!
void __fastcall TForm2::Button2Click(TObject *Sender) { // StringGrid speichern // Liste, die das Abbild des StringGrids enthalten wird TStringList *list = new TStringList(); // Spaltenzahl speichern list->Add(Form4->StringGrid1->ColCount); // Werte zeilenweise in die Liste übertragen for (int y = 6; y < Form4->StringGrid1->RowCount; y++) list->Add(Form2->Edit3->Text+";" + Form2->Edit4->Text+ ";" + Form2->Label22->Caption+ ";" + Form2->Edit6->Text+ ";" + Form2->Edit2->Text+ ";" + Form2->Memo1->Text+ ";"); // Liste in Datei speichern list->SaveToFile("balblalba.txt"); // nicht vergessen, den Speicher wieder freizugeben delete list; }Frage: wieso übernimmt er nicht die spalten und speichert dort die entsprechenden informationen & wieso sind aufeinmal die Bezeichnungen der Spalten weg ?
StringGrid1->Cells[0][0] = "Name"; StringGrid1->Cells[1][0] = "Vorname"; ...mfg andy5000
-
Das alles in eine Spalte kommt, liegt wohl daran, dass CommaText Kommas oder Spaces als Trennzeichen erlaubt. Du nimmst Semikolons.
Bei deiner Speicherfunktion sehe ich auch noch Probleme. Du speicherst dort StringGrid1->RowCount-6 mal die gleichen EditFelder ab. Ist das so gewollt?
-
das mit dem RowCount-6 hatte ich nur testweise eingegeben!
also reicht jetzt ein "," anstatt ";" ?
-
So, das hab ich jetzt schon, jetzt nur noch folgendes problem!
http://home.arcor.de/jr_vize_president_b-baron/Pixx/C++%20Problem.JPG
ich versteh einfach nicht, wieso der den eintrag sooft vervielfältigt wird !?! ich drücke doch nur EINMAL drauf !
und totaler schwachsinn ist auch, dass er jetzt meine überschriften einfach wegmacht!

-
Die Überschriften löschst du doch damit
for (int y = 1; y < list2->Count; y++) StringGrid1->Rows[y - 1]->CommaText = list2->Strings[y];selber weg. Rows[0] ist deine Überschriftenzeile. Also mach das -1 da weg.
Hast du dein list->Add(... in der Speichernfunktion immernoch in einer Schleife? Warum eigentlich. Du mußt doch bei jedem Klick nur einmal speichern.
Wie schon einmal gesagt, schreib doch direkt in den StringGrid.void __fastcall TForm2::Button2Click(TObject *Sender) { // StringGrid speichern StringGrid1->RowCount++; int row = StringGrid1->RowCount-1; StringGrid1->Cells[0][row] = Form2->Edit3->Text; StringGrid1->Cells[1][row] = Form2->Edit4->Text; StringGrid1->Cells[0][row] = orm2->Label22->Caption; // usw. }Wenn du das Ganze dann in eine Datei Speichern willst mach das direkt aus dem StringGrid.
-
joa danke, jetzt funktionierts, jetzt muss ich das nur noch so hinbekommen, das er es in eine dateispeichert, also das es nachm neustart wieder abrufbar ist ! ma sehn ob ich das alleine hinbekomme!

-
sagtmal, würde das auch gehen, wenn ich diesen registry eintrag da mache ?
hier sowas? http://www.marquardtnet.info/cecke/quickies.1/1_quicky_15.html
-
Was für einen Registry-Eintrag. In dem verlinkten Beitrag geht es um globale Variablen und die solltest du auf jedem Fall vermeiden. Bei dir ist sowas auch nicht nötig.