Editfelder speichern und in einer StringGrid list abrufen
-
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.
-
achso okay,kann ich denn die daten speichern ? also beim speichern wird dann ein ordner erstellt (in dem verzeichnis wo die exe ist) bspw. DATA und dann eine datei die verschlüsselt ist, also keine normale text datei, die jeder einsehen kann?! ginge sowas?
-
Andy5000 schrieb:
achso okay,kann ich denn die daten speichern ? also beim speichern wird dann ein ordner erstellt (in dem verzeichnis wo die exe ist) bspw. DATA und dann eine datei die verschlüsselt ist, also keine normale text datei, die jeder einsehen kann?! ginge sowas?
also das mit dem verschlüssel das brauch ich jetzt nicht mehr, mir geht es jetzt nur noch darum, die "gespeicherten" daten in der StringGird in eine txt-file zuspeichern.
hab es schonmal so probiert, aber es funktioniert nicht richtig!
Also, ich habe einen Button mit ner MessageBox ("Wollen Sie vor dem Beenden speichern?") Wenn YES, dann Close(); Wenn NO, dann soll er SaveDialog öffnen und dann ne Fileauswählen kann (txt-file) und die dann einfach abspeichert und beim nächstenmal wenn man die Form4 öffnet, soll er die automatisch reinladen...[b]if[/b]... [b]else[/b](Form4->SaveDialog1->Execute() ==true) Form4->StringGrid1->Cells->SaveToFile(SaveDialog1->FileName);
-
Hallo
schau dir doch bitte mal an, was für ein Typ hinter Form4->StringGrid1->Cells steht, und ob dieser überhaupt eine solche Methode anbietet.
-
akari schrieb:
Hallo
schau dir doch bitte mal an, was für ein Typ hinter Form4->StringGrid1->Cells steht, und ob dieser überhaupt eine solche Methode anbietet.
Nein tut er leider nicht, da steht das es kein Element von TStringGrid sei.
Und nun?

-
Hallo
du must jeden einzelnen EIntrag in Cells manuell auslesen und in einem passenden Format zusammenfügen und speichern.
Tip : Schau in die BCB-FAQ hier im Forum, gleich ganz oben in der TOP3 ist ein Beispeil für Speichern beliebiger Werte. Dumust nur die Werte einer Zeile mit TAB getrennt aneinanderhängen. Diese Strings kannst du dann an die StringList anhängen.
Beim Auslesen ist es andersrum auszuführen.bis bald
akari
-
Man muss hier nicht unbedingt Cells bemühen. Sowohl Rows als auch Cols sind vom Typ TStrings. Es würde also reichen eine neue StringList zu erstellen und dann nacheinander mit AddStrings die Rows dort einzufügen. Zum Schluß muß man dann nur diese Liste mit SaveToFile speichern. Rückwärts ist es natürlich etwas schwieriger.
-
ich komm einfach nicht weiter...
TStringList* Speichern = new TStringList; Speichern->Form4->StringGrid1->Cols[0] [row] Form4->StringGrid1->Cols[1] [row]das mit dem AddString versteh ich nicht, sry, bin noch ein Anfänger!
gib mir mal nen anfangstipp bitte
mfg
andy5000
-
Siehe FAQ unter "StringGrid".