![]() |
Filehandle-Operationen zusammenfassen
Hallo!
Ich bin gerade dabei ein kleines Spiel zu programmieren und möchte dabei auch eine "Speichern und Laden"-Funktionalität anbieten. Bei jedem Speichern von einem Spielstand, muss ich zwei Dateien auf die Festplatte schreiben. (Spielstand & Benutzerdaten) Da ich für beide Dateien verschiedene Typen verwende, kann ich logischer weise nicht die gleichen Methoden für die Filehandleoperationen benutzen... Deshalb suche ich nun nach Ideen, wie ich dieses Problem am besten löse!? -> Momentan habe ich noch zwei verschiedene Units mit mehr oder weniger den selben Methoden für jede Datei, die sich oft nur durch den Datei-Typen unterscheiden. :oops: Gruss, Steffen :hi: |
Welche Typen ?
|
Die Datei-Typen:
Delphi-Quellcode:
TUserDateiData = record
Bezeichnung : String[128]; // Populationstitel StartColor : TColor; // Anfangsfarbwert einer lebenden Zelle StartSize : TSpielfeld; // Anfangsspielfeldgrösse (in Feldern) MaxGeneration : Cardinal; // Maximale Simulationszyklen (0 = unendlich) Generation : Cardinal; // Aktueller Geneationszyklus end; TUserDatei = file of TUserDateiData; // Der Dateityp
Delphi-Quellcode:
Das sind nun also die Typen, die ich verwende, um die Spieldaten auf die Festplatte zu schreiben...
TLifeDateiData = record
Position : TSpielfeld; // Die Position der Zelle Age : Cardinal; // Das Alter der Zelle end; TLifeDatei = file of TLifeDateiData; // Der Dateityp |
Wie sehen denn deine Speichern-Prozeduren aktuell aus? Dann kann man sie besser auseinandernehmen und anders zusammensetzen :).
Grundsätzlich würde ich sagen, kannst du doch der Speichern-Prozedur einen Wert mitgeben, die ihr sagt was gespeichert werden soll und diese dann z.B. per case-Anweisung zwischen den Aufgaben trennt und den Rest einheitlich macht. |
Momentan siehts so aus:
Delphi-Quellcode:
Un hier die Variante, um die "LifeDatei" zu schreiben:
var
UserDatei : TUserDatei; // Global Filehandle Function DateiAnlegen(const Path : String) : Boolean; var Tmp : Integer; begin if DateiRewriteable(Path) then begin try AssignFile(UserDatei,Path); If FileIsReadOnly(Path) then Tmp := FileSetAttr(Path,FileGetAttr(Path) - faReadOnly); Rewrite(UserDatei); except on EInOutError do ShowMessage('Fehler beim anlegen der Datei `' + ExtractFileName(Path) + '`!') end; DateiAnlegen := True; end else DateiAnlegen := False; end; procedure DatensatzAnhaengen(const Path : String; const Datensatz : TUserDateiData); begin Try Seek(UserDatei,FileSize(UserDatei)); Write(UserDatei,Datensatz); Except On EInOutError do ShowMessage('Schreiben in die Datei `' + ExtractFileName(Path) + '` fehlgeschlagen!') end end;
Delphi-Quellcode:
(Die beiden Codes liegen, wie schon gesagt, in zwei verschiedenen Units)
var
LifeDatei : TLifeDatei; Function DateiAnlegen(const Path : String) : Boolean; var Tmp : Integer; begin if DateiRewriteable(Path) then begin try AssignFile(LifeDatei,Path); If FileIsReadOnly(Path) then Tmp := FileSetAttr(Path,FileGetAttr(Path) - faReadOnly); Rewrite(LifeDatei); except on EInOutError do ShowMessage('Fehler beim anlegen der Datei `' + ExtractFileName(Path) + '`!') end; DateiAnlegen := True; end else DateiAnlegen := False; end; procedure DatensatzAnhaengen(const Path : String; const Datensatz : TLifeDateiData); begin Try Seek(LifeDatei,FileSize(LifeDatei)); Write(LifeDatei,Datensatz); Except On EInOutError do ShowMessage('Schreiben in die Datei `' + ExtractFileName(Path) + '` fehlgeschlagen!') end end; Wie man unschwer erkennen kann sind die Proceduren identisch, bis auf die Typen... Gruss, Steffen :hi: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:26 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz