![]() |
Filestream Problem
Wie bereits in einem anderen Bereich schon geschrieben, sind wir gerade dabei, ein Grafikprogramm für die Schule zu erstellen. Wir bekommen allerdings Probleme, wenn wir die Sachen aus einem Filestream auslesen wollen:
Wir öffnen die Datei (kein Problem), malen etwas neues dazu, wollen die Datei wieder öffnen und bekommen einen Fehler und die Figuren der Datei werden falsch gezeichnet. Wenn wir das Programm jedoch im Einzelschrittmodus durchgehen, funktioniert es wunderbar.
Delphi-Quellcode:
Schöne Grüße,
procedure TFigurenContainer.OpenFile(Filename: string);
{Figuren aus einer Datei auslesen und zeichnen} var Dat: TFilestream; Figur: TFigur; Typ : TFigurTyp; begin clear; Dat := TFilestream.Create(Filename, fmOpenRead); while dat.Position < (dat.Size) do begin Dat.Read(Typ, sizeof(TFigurTyp)); case Typ of Strecke : begin Figur := TStrecke.create(Zeichenflaeche); Figur.SetFTyp(Strecke); end; Rechteck : begin Figur := TRechteck.create(Zeichenflaeche); Figur.SetFTyp(Rechteck); end; Ellips : begin Figur := TEllipse.create(Zeichenflaeche); Figur.SetFTyp(Ellips); end; Poly : begin Figur := TPolygon.create(Zeichenflaeche); Figur.SetFTyp(Poly); end; end; Figur.ReadObject(dat); If Typ<>Strecke then TFlaechenfigur(Figur).SetRegion; add(Figur); end; Dat.Free; end; Val |
Re: Filestream Problem
abgesehen von dem problem geht es auch noch eleganter, wenn man eine veralgemeinerung einführt:
Delphi-Quellcode:
MetaKlassen sind in delphi einfach nur praktisch :-D Und wichtig ist der virtuelle, bzw. abstrakte konstructor, damit die objekte vereinheitlicht erzeugt werden können.
type
TFigurBasis = class...// klasse von der die anderen alle abstammen! public Constructor Create(...); virtual; abstract; end; TFigurBasisClass = class of TFigurBasis; // meta klasse deklarieren TRechtek = class(TFigurBasis) Constructor Create(...); override; end; ... procedure TFigurenContainer.OpenFile(Filename: string); {Figuren aus einer Datei auslesen und zeichnen} var Dat: TFilestream; Figur: TFigur; Typ : TFigurTyp; const cClassReg:array[TFigur] of TFigurBasisClass = (TStrecke, TRechteck, TEllips, TPoly); begin clear; Dat := TFilestream.Create(Filename, fmOpenRead); while dat.Position < (dat.Size) do begin Dat.Read(Typ, sizeof(TFigurTyp)); // und hier der trick !!! // Aus der dem typ, über die classReg, die metaKlasse holen // und mit ihr das objekt instanzieren figur := cClassReg[typ].Create(zeichenfläche); Figur.SetFTyp(typ); Figur.ReadObject(dat); If Typ<>Strecke then TFlaechenfigur(Figur).SetRegion; add(Figur); end; Dat.Free; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:22 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