Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Frage zu .free bei Klassen (https://www.delphipraxis.net/50101-frage-zu-free-bei-klassen.html)

Wuaegner 20. Jul 2005 17:25


Frage zu .free bei Klassen
 
Ich habe eine Klasse TStringManager, die unter anderem das hier enthält:
Delphi-Quellcode:
type
  TStringManager = class(TObject)    // Kapselt
  private                            // Stringverarbeitung
   FNummernListe : TStringlist;      // Liste aller Nummern
   FOrteListe: TStringList;
   FDatumsListe: TStringList;        // Liste aller Daten
   
   procedure Initialize;             // Listen werden erstellt
   procedure Close;
Initialize erzeugt die Listen, z.B FNummernListe:= TStringList.Create;
In der Prozedur Close; wollte ich nich diese Listen wieder freigeben mit FNummernListe.Free usw.

Im OnCreate meiner Form wird StrMg:= TStringManager.Create; aufgerufen und im OnClose meiner Form:
Delphi-Quellcode:
StrMg.Close;  // <== Ist das hier nötig, die Listen innerhalb der Klasse zu löschen oder
        StrMg.Free;   // reicht diese Zeile ?
Lasse ich StrMg.Close nämlich weg geht es ohne Fehlermeldung, mit der Zeile kommt eine AV.

Dax 20. Jul 2005 17:27

Re: Frage zu .free bei Klassen
 
Tu dein Zeug in den Constructor und den Destructor, dann hast du wenigstens was davon und musst nicht ewig oft mit diesen sinnlosen Extramethoden rumfummeln.

Wuaegner 20. Jul 2005 17:29

Re: Frage zu .free bei Klassen
 
Kannst du posten wie das dann aussähe?

Dax 20. Jul 2005 17:32

Re: Frage zu .free bei Klassen
 
Delphi-Quellcode:
type
  TStringManager = class
  private
    {Felder}
  public
    constructor Create;
    destructor Destroy; override;
  end;

constructor TStringManager.Create;
begin
  // Felder erstellen
  // also der Initialize-Code
end;

destructor TStringManager.Destroy;
begin
  // der Close-Code
  inherited;
end;
Das sollte man als OOPer aber wissen.

Wuaegner 20. Jul 2005 17:33

Re: Frage zu .free bei Klassen
 
Habe noch nicht viel Erfahrung mit OOP , drum danke.

Wuaegner 20. Jul 2005 17:55

Re: Frage zu .free bei Klassen
 
Ok habe es jetzt so gemacht, das Problem besteht aber weiterhin.
Muss ich im destructor die einzelnen Listen ".free" en oder nicht? Wenn ich es mache kommt eine AV, wenn nicht geht es.

Dax 20. Jul 2005 17:58

Re: Frage zu .free bei Klassen
 
Wurden die Listen vielleicht schon vorher freigegeben, oder verwendest du vielleicht sogar ein nicht instanziiertes Objekt? Anders ist dieses Verhalten nicht erklärbar.

Tip: Statt .Free lieber FreeAndNil nehmen ;) Tut nix anderes, aber ein erneutes Free dafür nix mehr, also keine AVs (falls es daran lag)

Wuaegner 20. Jul 2005 18:08

Re: Frage zu .free bei Klassen
 
Verwende jetzt FreeAndNil() aber der Fehler kommt immernoch. Es muss also daran liegen
Zitat:

ein nicht instanziiertes Objekt?
Ich erzeuge die Listen mit liste:= TStringList.Create; , füge mit Add() neue Items hinzu und lösche wieder welche usw. , muss ich noch etwas beachten?

malo 20. Jul 2005 18:09

Re: Frage zu .free bei Klassen
 
Zitat:

Zitat von Dax
Tip: Statt .Free lieber FreeAndNil nehmen ;) Tut nix anderes, aber ein erneutes Free dafür nix mehr, also keine AVs (falls es daran lag)

Naja, der Unterschied von FreeAndNil zu .Free ist ja, dass bei FreeAndNil das Objekt freigegeben und die Zeiger auf Nil gesetzt werden (wie der Name schon sagt). Also entspricht FreeAndNil folgemdem Code:
Delphi-Quellcode:
MyObj.Free;
MyObj := nil;
Ob man jetzt die entsprechende Prozedur nutzt oder es selbst macht (oder den Destructor verwendet) bleibt jedem selbst überlaseen.

Dax 20. Jul 2005 18:10

Re: Frage zu .free bei Klassen
 
Ein bisschen mehr Code könnte ein bisschen mehr helfen ;) Oder ist dein Projekt fürs Militär? :mrgreen:


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:00 Uhr.
Seite 1 von 2  1 2      

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