Autor |
Beitrag |
rizor
      
Beiträge: 209
WIN XP
Delphi 2005 PE, Visual C++
|
Verfasst: So 15.04.07 12:50
Hi,
Ich bin im moment dabei ein kleines spiel zu programmieren und versuche gerade das Abspeichern und Laden zu programmieren.
Die Daten, die gespeichert werden sollen, befinden sich in Records.
Wie lässt sich das nun am einfachsten bewerkstelligen, dass man das speichern kann.
Ich dachte da an SaveDialogs, weiß aber nicht genau wie das geht.
Kann mir da jemand helfen?
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: So 15.04.07 13:39
Moin!
Schau mal nach TFILESTREAM, damit sollte sich das lösen lassen.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Christian V.
      
Beiträge: 311
Win Xp Prof
Turbo Delphi 2005
|
Verfasst: So 15.04.07 13:41
Kannst du vielleicht mal die Definition deines Records posten?
So könnten wir dir besser weiterhelfen.
_________________ Hardware runs the world, software controls the hardware, code generates software - Have You already coded today?
|
|
rizor 
      
Beiträge: 209
WIN XP
Delphi 2005 PE, Visual C++
|
Verfasst: So 15.04.07 17:15
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| type Gesellschaft = record NameB: string; GeTag: integer; GeMonat: integer; GeJahr: integer; NameComp: string; Gruendung: integer; Kapital: integer; Flughafen: string; end; |
So sieht mein Record aus.
Wie kann ihc dass nun am besten speichern?
|
|
Christian V.
      
Beiträge: 311
Win Xp Prof
Turbo Delphi 2005
|
Verfasst: So 15.04.07 17:31
Die Suchfunktion ist schon toll:
www.delphi-library.d...ighlight=tfilestream
Das sollte eigentlich alles erklären.
_________________ Hardware runs the world, software controls the hardware, code generates software - Have You already coded today?
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: So 15.04.07 18:27
Moin!
Ich würde dir zu einem Tag-basierten Dateiformat raten, wie zum Beispiel Ini-Files es anbieten TINIFILE
Du solltest besser keine typisierten Dateien nehmen, das ist (wenn man noch nicht soo viel Erfahrung damit hat) leider nicht ganz einfach; abgesehen davon in deinem Fall auch gar nicht möglich, weil du lange Strings (= Stringund nicht ShortString) verwendest.
Fazit: wenn es nicht viele Daten sind (<64KB gesamt), dann versuch´s doch erstmal mit den Ini-Dateien. Falls du damit an Grenzen stößt, kannst du später sicher auch noch eine andere Lösung wählen, wenn du dein Programm geschickt planst (zwei entsprechende Prozeduren, die den gesamten Vorgang abwickeln -> dann brauchst du später nur hier zu ändern). Mit den Ini-Dateien kommst du aber auf jeden Fall jetzt erstmal weiter.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Jann1k
      
Beiträge: 866
Erhaltene Danke: 43
Win 7
TurboDelphi, Visual Studio 2010
|
Verfasst: So 15.04.07 20:40
hmm, also ich denk auch als anfänger kommt man mit tfilestream und ein bisschen hilfe hier und da recht schnell zu recht.
er braucht ja nur die parameter zum erstellen des filestreams, die prozeduren write und read und jemand muss ihm sagen, dass er den filestream nach dem speichern/laden schliesst und das er statt strings shortstrings benutzen muss(daran bin ich damals gescheitert)
|
|
Corpsman
      
Beiträge: 228
KUbuntu 10.4
Lazarus
|
Verfasst: So 15.04.07 20:46
Na wenn er doch so Anfänger ist dann schreibt ihm doch geschwind wie's aussieht.
Er fragt dann den teil den er net Versteht und hats auch gelernt.
Delphi-Quelltext 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:
| type Gesellschaft = record NameB: string; GeTag: integer; GeMonat: integer; GeJahr: integer; NameComp: string; Gruendung: integer; Kapital: integer; Flughafen: string; end;
Procedure Save(Filename:String;data:Gesellschaft); var f:Tfilestream; begin f:= Tfilestream.create(Filename,fmcreate or fmopenwrite); f.write(data,sizeof(data)); f.free; end;
Function Load(Filename:String):Gesellschaft; var f:Tfilestream; begin f:= Tfilestream.create(Filename,fmopenread); f.read(result,sizeof(result)); f.free; end; |
Oh da sehe ich gerade das du Ja strings in deinem Record hast.
Evtl must du die Strings anders speichern.
Das machst du dann Zeichenweise.
Also zuerst ein Integer Variable schreiben die die Anzahl der Zeichen im String.
Dann die einzelnen Chars
Beim laden liest du zerst den Integer und weist ja dann wie viele Chars der zu Ladende String lang ist.
_________________ --
Just Try it.
|
|
Jann1k
      
Beiträge: 866
Erhaltene Danke: 43
Win 7
TurboDelphi, Visual Studio 2010
|
Verfasst: So 15.04.07 20:57
er kann statt strings einfach shortstrings nehmen oder er begrenzt den string mit
gesellschaft:string[20]
|
|
rizor 
      
Beiträge: 209
WIN XP
Delphi 2005 PE, Visual C++
|
Verfasst: So 15.04.07 22:30
Super, danke.
Die Strings habe ich mitlerweile begrenzt.
Nun habe ihc aber zwei Fragen.
1. Wie mache ich das nochmal mit den Zeichen? die Länge kenne ich ja nicht.
Bei NameB woher weiß ich, dass der nun NameB ausgelesen hat und nicht schon weiter
gegangen ist?
2. Wenn ich die Sachen nun lade, schiebt er die dann automatisch in das record?
Damit meine ich, wenn ich nun zwei Gesellschften habe, passt er dass dann auch
automatisch an, wie bei anderen Files (z.B file of Gesellschaft)?
cu
rizor
|
|
Corpsman
      
Beiträge: 228
KUbuntu 10.4
Lazarus
|
Verfasst: Di 17.04.07 09:57
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23:
| Procedure WriteStringToStream( Const M:Tstream; Data:String); var I:integer; c:Char; begin i := Length(Data); m.write(i,sizeof(i)); for i := 1 to Length(data) do begin c := data[i]; m.write(c,sizeof(c)); end; end;
function ReadStringFromStream( Const M:Stream):String; var I,j:integer; c:Char; begin Result := ''; m.read(i,sizeof(i)); for j := 1 to i do begin m.read(c,sizeof(c)); Result := Result + c; end; end; |
So da ahbe ich dir mal so "Blind" die Laden speichern Routinen mit Strings reingecoded.
Das Ausprogrammieren für deien Record must aber selbst machen. ( Als Tipp du must nun die Felddaten im Record einzeln von hand speichern )
und deine 2. Frage verstehe ich nicht.
_________________ --
Just Try it.
|
|
rizor 
      
Beiträge: 209
WIN XP
Delphi 2005 PE, Visual C++
|
Verfasst: Di 17.04.07 18:59
Frage 2 hat sich erledigt.
Danke für eure Hilfe.
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mo 23.04.07 20:44
Moin!
Jann1k hat folgendes geschrieben: | hmm, also ich denk auch als anfänger kommt man mit tfilestream und ein bisschen hilfe hier und da recht schnell zu recht. |
Soviel dazu Nächster Thread...
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|