Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Initialisierung über Stringlist vereben (https://www.delphipraxis.net/40308-initialisierung-ueber-stringlist-vereben.html)

Flogo 14. Feb 2005 06:10


Initialisierung über Stringlist vereben
 
Hi alle :hi:

Ich initailisiere ein Objekt über Stringlisten. ungefähr so:
Delphi-Quellcode:
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;
Das Problem entsteht, wenn ich diese Klasse ableiten und erweitern will:

Delphi-Quellcode:
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;
Im Moment fallen mir nur zwei Lösungen ein:
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?

jim_raynor 14. Feb 2005 06:39

Re: Initialisierung über Stringlist vereben
 
Warum eine extra Funktion EndInitialize? Benutze den Destructor.
Delphi-Quellcode:
destructor destroy;override;
Und warum public? Für soetwas nutzt man den private Block. Die Datei zweimal einzulesen, halte ich für eine sehr unsaubere Lösung.

Du kannst natürlich auch neben Initialisiere eine weitere virtuelle Methode machen DatenLesen. Diese wird dann die StringList übergeben.

Delphi-Quellcode:
procedure TBase.Initialisiere(Dateinname: string);
var SL: TSringlist;
begin
  SL := TSringlist.Create;
  SL.LoadFromFile(Dateiname);
  DatenLesen(SL);
  SL.Free;
end;
In Datenlesen werden dann die Variablen gefüllt und diese Funktion kann in abgeleiteten Klassen überschrieben werden.

Ist meiner Meinung nach die sauberste Lösung.

Sprint 14. Feb 2005 07:30

Re: Initialisierung über Stringlist vereben
 
Zitat:

Zitat von Flogo
Das Problem entsteht, wenn ich diese Klasse ableiten und erweitern will

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;

Flogo 14. Feb 2005 12:28

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:

Hansa 14. Feb 2005 12:48

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.

jim_raynor 14. Feb 2005 13:11

Re: Initialisierung über Stringlist vereben
 
Zitat:

Zitat von Hansa
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.

100% Zustimmung. Hatte in dem Moment nicht an Protected gedacht. Also die neue Procedure DatenLesen in protected rein. Dann bekommst du keine probleme, wenn du den Nachfahren deiner Basisklasse in eine andere Unit packst.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:20 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz