Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   

Die mobilen Seiten von c++.de:
http://m.c-plusplus.de
Infos hier [BETA]

  
c++.de :: FAQ - C++ Builder (VCL/CLX) ::  StringGrid - komplett abspeichern/einlesen     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
dukelc4
Mitglied

Benutzerprofil
Anmeldungsdatum: 03.10.2001
Beiträge: 33
Beitrag dukelc4 Mitglied 16:36:00 01.01.2002   Titel:   StringGrid - komplett abspeichern/einlesen            Zitieren

Hallo,
ich bin Anfänger in C++ und möchte als Schulprojekt eine kleine CD-Verwaltung programmieren. Dazu würde ich gerne eine komplette Tabelle eines StringGrid in einer Datei speichern und auch wieder auslesen. Mit hilfe der Borland-Hilfe habe ich es nun geschafft die Zeilen-/Spaltenanzahl und die Strings in der Tabelle in eine Datei zu schreiben. Nun schaffe ich es aber nicht ganz diesen Quellcode so umzuschreiben, das die Werte auch wieder in die korrekte Zelle der Tabelle geschrieben werden. Hier sind noch meine beiden Quellcode für einlesen/ausgeben. Wäre nett wenn mir da jemand weiterhelfen könnte.

[snip]

Ich habe das ganze vorher mit diesen Funktionen versucht:
Laden:
StringGrid1->Rows[StringGrid1->Row]->LoadFromFile("\\cds.txt");

Speichern:
StringGrid1->Rows[StringGrid1->Row]->SaveToFile("\\cds.txt");

Aber damit überschreibt er mir immer die Datei sobald eine neue Zeile gespeichert wird. Gibt es vielleicht eine Möglichkeit das umzuschreiben?


cu
Patrick www.mp3-fiesta.de

[ Dieser Beitrag wurde am 04.01.2002 um 18:56 Uhr von Jansen editiert. ]
Werbeunterbrechung
Peter
Mitglied

Benutzerprofil
Anmeldungsdatum: 18.08.2000
Beiträge: 2476
Beitrag Peter Mitglied 23:18:00 01.01.2002   Titel:              Zitieren

Ist doch klar, dass es nicht so funktionieren kann. SaveToFile kann keinen Fileappend. Musst Dir halt ne entsprechende Speicher-/Ladefunktion selber schreiben. So schwierig ist das doch nicht. Hier ein kleiner Lösungsvorschlag ;)

Speichern eines StringGrids:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
FILE *fp;
int row, rowcount;
 
rowcount=StringGrid1->RowCount;
 
// Datei zum Schreiben öffnen
if((fp=fopen("c:\\Data.txt", "w"))==NULL)
{   ShowMessage("Datei konnte nicht geöffnet werden");
    return;
}
// Header und Anzahl Zeilen/Spalten schreiben
fprintf(fp, "StringGridData\n%d\n%d\n", rowcount, StringGrid1->ColCount);
 
// Griddaten schreiben
for(row=0; row<rowcount; row++)
{   fputs(StringGrid1->Rows[row]->CommaText.c_str(), fp);
    fputc('\n', fp);
}
 
fclose(fp);

StringGrid laden:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#define SIZEOF_BUFFER 1024
FILE *fp;
int row;
char *buffer=new char[SIZEOF_BUFFER];
 
// Datei zum Lesen öffnen
if((fp=fopen("c:\\Data.txt", "r"))==NULL)
{   ShowMessage("Datei konnte nicht geöffnet werden");
    delete buffer;
    return;
}
 
// Header einlesen und prüfen ob die richtige Datei vorliegt
fgets(buffer, SIZEOF_BUFFER, fp);
if(memcmp(buffer, "StringGridData", 14)!=0)
{   ShowMessage("Keine StringGrid Datendatei !");
    fclose(fp);
    delete buffer;
    return;
}
 
// Anlahl Rows einlesen und in StringGrid setzen
fgets(buffer, SIZEOF_BUFFER, fp);
StringGrid1->RowCount=atoi(buffer);
 
// Anlahl Cols einlesen und in StringGrid setzen
fgets(buffer, SIZEOF_BUFFER, fp);
StringGrid1->ColCount=atoi(buffer);
 
// Griddaten einlesen
for(row=0; fgets(buffer, SIZEOF_BUFFER, fp); row++)
    StringGrid1->Rows[row]->CommaText=buffer;
 
fclose(fp);
delete buffer;


[ Dieser Beitrag wurde am 01.01.2002 um 22:20 Uhr von Peter editiert. ]


Zuletzt bearbeitet von Jansen am 18:17:00 05.08.2003, insgesamt 2-mal bearbeitet
Jansen
Moderator

Benutzerprofil
Anmeldungsdatum: 30.04.2001
Beiträge: 14626
Beitrag Jansen Moderator 00:26:00 02.01.2002   Titel:              Zitieren

Ahem, ich denke wir sind hier im VCL-Forum, oder nüch? ;)
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
// StringGrid speichern
 
// Liste, die das Abbild des StringGrids enthalten wird
TStringList *list = new TStringList();
 
// Spaltenzahl speichern
list->Add(StringGrid1->ColCount);
 
// Werte zeilenweise in die Liste übertragen
for (int y = 0; y < StringGrid1->RowCount; y++)
   list->Add(StringGrid1->Rows[y]->CommaText);
 
// Liste in Datei speichern
list->SaveToFile("c://test.txt");
 
// nicht vergessen, den Speicher wieder freizugeben
delete list;
 
 
// StringGrid laden
 
// Liste, die das Abbild der Datei enthalten wird
TStringList *list2 = new TStringList();
 
// Liste aus Datei laden
list2->LoadFromFile("c://test.txt");
 
// Zeilen- und Spaltenzahl setzen
StringGrid2->RowCount = list2->Count - 1;
StringGrid2->ColCount = list2->Strings[0].ToInt();
 
// Werte zeihlenweise aus der Liste übertragen
for (int y = 1; y < list2->Count; y++)
   StringGrid2->Rows[y - 1]->CommaText = list2->Strings[y];
 
// nicht vergessen, den Speicher wieder freizugeben
delete list2;

_________________
Jansen (Mod nur im BCB-Forum)


Zuletzt bearbeitet von Jansen am 18:17:30 05.08.2003, insgesamt 1-mal bearbeitet
Peter
Mitglied

Benutzerprofil
Anmeldungsdatum: 18.08.2000
Beiträge: 2476
Beitrag Peter Mitglied 00:38:00 02.01.2002   Titel:              Zitieren

:):):) @Jansen
Klar geht das so auch ...
VCL heisst aber nicht, dass man mit aller Gewalt VCL Kompos verwenden muss, oder ? [img]images/smiles/icon_wink.gif[/img]
Warum denn alles nochmal innen Speicher lutschen bzw. zusammenstellen und dann erst schreiben, wenn man das gleich erledigen kann ? Microsoft ist doch schon dem (Haupt-) Speicherwahn verfallen, warum sollen wir dem mit aller Gewalt folgen :D:D:D


Zuletzt bearbeitet von Jansen am 18:18:35 05.08.2003, insgesamt 1-mal bearbeitet
Jansen
Moderator

Benutzerprofil
Anmeldungsdatum: 30.04.2001
Beiträge: 14626
Beitrag Jansen Moderator 00:53:00 02.01.2002   Titel:              Zitieren

VCL heisst aber nicht, dass man mit aller Gewalt VCL Kompos verwenden muss, oder ?

Doch, unbedingt!!! :D

Naja, ein Vorteil der StringList wäre noch , dass sie "exception safe" (?) ist, man also bequem mit try/catch arbeiten kann. Und das eingebaute Sortieren und Suchen kann man auch immer gebrauchen. :-)

Du siehst schon, ein Programmierer der alten Schule, der um jedes Byte kämpft wird aus mir nicht mehr. :eek: :)

_________________
Jansen (Mod nur im BCB-Forum)


Zuletzt bearbeitet von Jansen am 18:37:52 05.08.2003, insgesamt 2-mal bearbeitet
Peter
Mitglied

Benutzerprofil
Anmeldungsdatum: 18.08.2000
Beiträge: 2476
Beitrag Peter Mitglied 01:10:00 02.01.2002   Titel:              Zitieren

@Jansen
Hast recht, es kommt imemr auf den einzelnen Fall drauf an.
Ich hab halt noch auf einem 6502 mit 4kb Hauptspeicher geprogged, da konnte man nicht so grosszügig mitm Speicher umgehen. Irgendwie steckt das immer noch in mir drinnen :D


Zuletzt bearbeitet von Jansen am 18:38:22 05.08.2003, insgesamt 1-mal bearbeitet
c++.de :: FAQ - C++ Builder (VCL/CLX) ::  StringGrid - komplett abspeichern/einlesen   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können keine Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum nicht antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.