Entwickler-Ecke
Sonstiges (Delphi) - Abspeichern von Spielständen
rizor - So 15.04.07 12:50
Titel: Abspeichern von Spielständen
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 - So 15.04.07 13:39
Moin!
Schau mal nach
TFILESTREAM, damit sollte sich das lösen lassen. ;)
cu
Narses
Christian V. - So 15.04.07 13:41
Kannst du vielleicht mal die Definition deines Records posten?
So könnten wir dir besser weiterhelfen.
rizor - 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?
Narses - So 15.04.07 18:27
Moin!
Ich würde dir zu einem Tag-basierten Dateiformat raten, wie zum Beispiel Ini-Files es anbieten :arrow:
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. :idea:
cu
Narses
Jann1k - 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 - 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.
Jann1k - So 15.04.07 20:57
er kann statt strings einfach shortstrings nehmen oder er begrenzt den string mit
gesellschaft:string[20]
rizor - 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 - 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.
rizor - Di 17.04.07 18:59
Frage 2 hat sich erledigt.
Danke für eure Hilfe.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!