Einzelnen Beitrag anzeigen

Master-of-Magic

Registriert seit: 24. Jul 2006
37 Beiträge
 
Delphi 2005 Personal
 
#1

Flexible(re) Ladeprozedur

  Alt 17. Mär 2007, 11:07
Erstmal hoff ich, dass ich die richtige Spart erwischt hab. Es gibt ja kein extra Unterforum für Dateien & Co - falls doch, dann sponsort mir eine Brille

Folgendes: Ich habe ein Tool das seit einiger Zeit entwickelt wird und wo ab und zu neue Versionen herauskommen (wer hätte es gedacht *g*). Da sich dadurch die Speicherstruktur ändert, muss ich ältere Dateien abwärts kompatibel einlesen können. Meine Datei enthält deshalb einen Integer für die Version und dann mein Array of Record.

Eingelesen hab ich es bisher mit 'nem Filestream und einer case Abfrage nach dem Motto:

Delphi-Quellcode:
case version of
1: Einlesen und an aktuellen Record anpassen
2: Einlesen und an aktuellen Record anpassen
3: Einlesen und an aktuellen Record anpassen
4: Direkt Einlesen, da aktuelle Version
Das Prinzip sollte klar sein. Aber es hat einen großen Nachteil: Für jede neue Version muss ich alle cases anpassen, wenn sich die Speicherstruktur verändert hat.


Daher hab ich mir momentan folgende Variante überlegt:

1. Datei in Filestream (fs) einlesen und Version auslesen
2. fs in Memorystream (ms) kopieren
3.
Delphi-Quellcode:
if version=1 then
begin
  ms an Record von Version 2 (!) anpassen und in Temp-Memorystream (temp) kopieren
  temp wieder nach ms zurückkopieren
  version auf 2 setzen
end;
if version=2 then
begin
  ms an Record von Version 3 (!) anpassen und in Temp-Memorystream (temp) kopieren
  temp wieder nach ms zurückkopieren
  version auf 3 setzen
end;
if version=3 then
begin
  ms an Record von Version 4 (!) anpassen und in Temp-Memorystream (temp) kopieren
  temp wieder nach ms zurückkopieren
  version auf 4 setzen
end;
[...usw...]
if version=4 then
begin
  ms direkt in Speicher einlesen
end;
Ich hoffe der Pseudo-Code ist verständlich und vermittelt meine Idee. Mit der Variante muss ich immer nur einen neuen If-Block für eine neue Speicherstruktur einbauen, was das Handling vereinfacht. Ältere Versionen steigen entsprechend früher in den Code ein und werden angepasst.
Allerdings muss ich mich so mit drei Streams herumschlagen die die Datei enthalten -> nicht gerade Ressourcenfreundlich.

Hat mir da jemand Tipps/Verbesserungsvorschläge? Die Datei hat zwar nur 50K, aber hier gehts ums Prinzip
Oder gibts einen völlig anderen Weg?
  Mit Zitat antworten Zitat