Autor Beitrag
Hein Blöd
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 51



BeitragVerfasst: Fr 13.02.04 19:52 
Ich bin noch ein Anfänger und noch weniger weiss ich über Klassen. Was ich brauche ist ein Record mit drei Stringlist. Da aus jedem Stringlist ein Objekt erstellt werden muss bedutet das, dass ich jedes mal drei mal Crate machen muß und drei mal Free. Das ganze dann zig mal im Programm. Da ich dazu aber zu faul bin so dachte ich mir, daß ich einfach eine Klasse erstellen könnte. Die hat einen Constructor und einen Destructor. Wenn ich als den Create Teil in den Constructor lege und den Free Teil in den Destructor, dann spare ich mir jede menge Arbeit. Da ich aber keine Ahnung von Klassen habe wollte ich fragen ob ich es richtig gemacht habe. Kann man das so machen oder fehlt noch was.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
type
  TListen = class(TObject)
    Liste1: TStringList;
    Liste2: TStringList;
    Liste3: TStringList;
  public
    constructor Create;
    destructor Free;
  end;

constructor TListen.Create;
begin
  Liste1 := TStringList.Create;
  Liste2 := TStringList.Create;
  Liste3 := TStringList.Create;
end;

destructor TListen.Free;
begin
  Liste1.Free;
  Liste2.Free;
  Liste3.Free;
end;


Moderiert von user profile iconPeter Lustig: Code- durch Delphi-Tags ersetzt
KidPaddle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 351

WinXP,Linux
D7 Prof, XE7
BeitragVerfasst: Fr 13.02.04 20:14 
Ich würde die Klasse wie folgt aufbauen:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
type 
  TListen = class(TObject) 
   protected
     fListe1: TStringList; 
     fListe2: TStringList; 
     fListe3: TStringList; 
   public 
     constructor Create; 
     destructor destructoroverride;
     property Liste1: TStringList read fListe1;
     property Liste2: TStringList read fListe2;
     property Liste3: TStringList read fListe3;
  end

constructor TListen.Create; 
begin 
  inherited Create;

  fListe1 := TStringList.Create; 
  fListe2 := TStringList.Create; 
  fListe3 := TStringList.Create; 
end

destructor TListen.Destroy;
begin 
  FreeAndNil(fListe1); 
  FreeAndNil(fListe2); 
  FreeAndNil(fListe3); 

  inherited Destroy;
end;


Ein paar Bermerkungen:
Destructor Free sollte nicht überschrieben werden, da Free intern Destroy aufruft. Das override hinter dem Destroy; ist notwendig, da sonst dein Destructor niemals aufgerufen wird, wenn das Objekt freigegeben wird.

Objekte sollten, wenn vorhanden, mit FreeAndNil(Objekt) freigegeben werden. Mit dieser Funktion wird das Objekt aus dem Speicher entfernt und gleichzeit die übergebene Variable auf NIL gesetzt. Dadurch kann schnell festgestellt werden, ob das Objekt noch gültig ist.

Die Variablen wurden in den Protected - Abschnitt verschoben, um einen direkt Zugriff zu verhinden. Über die Properties kann ich einen Schreibzugriff verhindern und damit ein potentielle Gefahrenquelle vermeinden.

Wenn Methoden überschrieben werden, hier Create und Destroy, wird in den meisten Fällen die Vorgängermethode mit inherited aufgerufen, da diese Daten für das Objekt reservieren oder freigeben. Machst Du das nicht, können fehlerhaft initializierte Objekt enstehen.

So, das wars von meiner Seite.

Gruß
KidPaddle