AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Initialisierung über Stringlist vereben

Ein Thema von Flogo · begonnen am 14. Feb 2005 · letzter Beitrag vom 14. Feb 2005
Antwort Antwort
Benutzerbild von Flogo
Flogo

Registriert seit: 24. Mär 2003
Ort: Freiburg im Breisgau
317 Beiträge
 
Delphi 7 Professional
 
#1

Initialisierung über Stringlist vereben

  Alt 14. Feb 2005, 06:10
Hi alle

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?
If one coincidence can occur, then another coincidence can occur. And if one coincidence happens to occur just after another coincidence, then that is just a coincidence.
DNA

www.Anyxist.de
  Mit Zitat antworten Zitat
Benutzerbild von jim_raynor
jim_raynor

Registriert seit: 17. Okt 2004
Ort: Berlin
1.251 Beiträge
 
Delphi 5 Standard
 
#2

Re: Initialisierung über Stringlist vereben

  Alt 14. Feb 2005, 06:39
Warum eine extra Funktion EndInitialize? Benutze den Destructor.
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.
Christian Reich
Schaut euch mein X-COM Remake X-Force: Fight For Destiny ( http://www.xforce-online.de ) an.
  Mit Zitat antworten Zitat
Benutzerbild von Sprint
Sprint

Registriert seit: 18. Aug 2004
Ort: Edewecht
712 Beiträge
 
Delphi 5 Professional
 
#3

Re: Initialisierung über Stringlist vereben

  Alt 14. Feb 2005, 07:30
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;
Ciao, Sprint.

"I don't know what I am doing, but I am sure I am having fun!"
  Mit Zitat antworten Zitat
Benutzerbild von Flogo
Flogo

Registriert seit: 24. Mär 2003
Ort: Freiburg im Breisgau
317 Beiträge
 
Delphi 7 Professional
 
#4

Re: Initialisierung über Stringlist vereben

  Alt 14. Feb 2005, 12:28
Ä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.
If one coincidence can occur, then another coincidence can occur. And if one coincidence happens to occur just after another coincidence, then that is just a coincidence.
DNA

www.Anyxist.de
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#5

Re: Initialisierung über Stringlist vereben

  Alt 14. Feb 2005, 12:48
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.
Gruß
Hansa
  Mit Zitat antworten Zitat
Benutzerbild von jim_raynor
jim_raynor

Registriert seit: 17. Okt 2004
Ort: Berlin
1.251 Beiträge
 
Delphi 5 Standard
 
#6

Re: Initialisierung über Stringlist vereben

  Alt 14. Feb 2005, 13:11
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.
Christian Reich
Schaut euch mein X-COM Remake X-Force: Fight For Destiny ( http://www.xforce-online.de ) an.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:49 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