![]() |
Initialisierung über Stringlist vereben
Hi alle :hi:
Ich initailisiere ein Objekt über Stringlisten. ungefähr so:
Delphi-Quellcode:
Das Problem entsteht, wenn ich diese Klasse ableiten und erweitern will:
type
TBase = class(TObject) VariableA: Integer; VariableB: string; procedure Initialisiere(Dateinname: string); end; [...] procedure TBase.Initialisiere(Dateinname: string); var SL: TSringlist; begin SL := TSringlist.Create; SL.LoadFromFile(Dateiname); VariableA := StrToInt(SL.Values['VarA']); VariableB := SL.Values['VarB']; SL.Free; end;
Delphi-Quellcode:
Im Moment fallen mir nur zwei Lösungen ein:
type
TDerived = class(TBase) VariableC: string; procedure Initialisiere(Dateinname: string); override; end; [...] procedure TDerived.Initialisiere(Dateinname: string); begin inherited; //hier sollte VariableC ausgelesen werden end; 1) Den Text nochmal in eine Stringlist laden. 2) Die Stringlist unter public deklarieren und mit einer procedure EndInitialize wieder freigeben Beide Lösungen finde ich nicht besonders sauber/schön. Gibts da vielleicht was eleganteres? |
Re: Initialisierung über Stringlist vereben
Warum eine extra Funktion EndInitialize? Benutze den Destructor.
Delphi-Quellcode:
Und warum public? Für soetwas nutzt man den private Block. Die Datei zweimal einzulesen, halte ich für eine sehr unsaubere Lösung.
destructor destroy;override;
Du kannst natürlich auch neben Initialisiere eine weitere virtuelle Methode machen DatenLesen. Diese wird dann die StringList übergeben.
Delphi-Quellcode:
In Datenlesen werden dann die Variablen gefüllt und diese Funktion kann in abgeleiteten Klassen überschrieben werden.
procedure TBase.Initialisiere(Dateinname: string);
var SL: TSringlist; begin SL := TSringlist.Create; SL.LoadFromFile(Dateiname); DatenLesen(SL); SL.Free; end; Ist meiner Meinung nach die sauberste Lösung. |
Re: Initialisierung über Stringlist vereben
Zitat:
Delphi-Quellcode:
type
TBase = class(TObject) private FStringList: TStringList; FVariableA: Integer; FVariableB: String; public constructor Create(const FileName: String); destructor Destroy; override; end;
Delphi-Quellcode:
type
TDerived = class(TBase) private FValueC: String; public constructor Create(const FileName: String); end;
Delphi-Quellcode:
constructor TBase.Create(const FileName: String);
begin inherited Create; FStringList := TStringList.Create; with FStringList do begin LoadFromFile(FileName); FVariableA := StrToInt(Values['VarA']); FVariableB := Values['VarB']; end; end; destructor TBase.Destroy; begin FStringList.Free; inherited; end;
Delphi-Quellcode:
constructor TDerived.Create(const FileName: String);
begin inherited; FValueC := FStringList.Values['VarC']; end; |
Re: Initialisierung über Stringlist vereben
Ähmm ja private meinte ich. War wohl doch noch zu früh heut morgen. Im Prinzip meinte ich mit Variante 2 genau das, was Sprint geschrieben hat. Das kam mir nur unsauber vor, weil dann die Stringlist die ganze Zeit mitgeführt wird. Die Extraprozedur schafft da ja Abhilfe. Vielen Dank für den Tipp ich hab mich an dem Problem ewig im Kreis gedreht. :love:
|
Re: Initialisierung über Stringlist vereben
wegen so etwas brauche ich des öfteren protected. Public ist zu viel und private zu wenig des Guten. 8) Protected bedeutet, daß der Code nur in der Klasse direkt und davon abgeleiteten zugreifbar ist. Deshalb in diesem Fall besser als public.
|
Re: Initialisierung über Stringlist vereben
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:20 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