Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Problem bei TStringlist Freigabe (https://www.delphipraxis.net/59310-problem-bei-tstringlist-freigabe.html)

Master of the Wind 20. Dez 2005 14:57


Problem bei TStringlist Freigabe
 
Hallo erstmal...
Also ich habe ein inzwischen doch umfangreiches Programm geschrieben, weswegen die Fehlersuche noch etwas schwerer wird. Für euch wahrscheinlich auch. Naja ..Also ich hab ein Problem mit dem Freigeben. Zum Aufbau: Ich ein Grundobjekt. In dem kommen wieder Instanzen von anderen objekten vor und in denen nun eine TStringlist. So ich hab nun zu jedem Objekt eine Methode geschrieben, die die (noch manuell) die zuerst mit create erstellten Objekte wieder frei gibt. Das geht auch so weit, nur bei einer Stringlist nicht. dazu mal ein Beispiel

Delphi-Quellcode:
TObjekt1=class(TComponent)
Stringlist1:TStringlist;
Stringlist2:TStringlist;
Stringlist3:TStringlist;
public
procedure init;
procedure makefree;
end;

TObjekt2=class(TForm);
inhalt:TObjekt1;
procedure init;
procedure beenden;


procedure TObjekt1.init;
begin
  Stringlist1:=TStringlist.create;
  Stringlist2:=TStringlist.create;
  Stringlist3:=TStringlist.create;
end;

procedure TObjekt1.makefree;
begin
  Stringlist1.free;
  Stringlist2.free; //Hier kommt die Zugriffsverletzung
  Stringlist3.free;
end;

procedure TObjekt2.init
begin
  inhalt:=TObjekt1.create;
  inhalt.init;
end;

procedure TObjekt2.beenden;
begin
  inhalt.makefree;
  inhalt.free;
  self.close;
end;
Ich hoffe ihr könnt damit etwas anfangen, aber der Gesamte Code wäre zu groß...denke ich.
Schon mal vielen dank im voraus.

mfg

Angel4585 20. Dez 2005 15:06

Re: Problem bei TStringlist Freigabe
 
Probiers mal mit

Delphi-Quellcode:
if Assigned(Stringlist) then
 FreeAndNil(StringList);//Oder StringList.Free;

Khabarakh 20. Dez 2005 15:14

Re: Problem bei TStringlist Freigabe
 
Zitat:

Ich ein Grundobjekt.
:mrgreen:

An deinem Code kann ich keinen Fehler erkennen. Es gibt die Möglichkeit, dass du erstens irgendwo anders den Speicherbereich der ersten StringList (wahrscheinlich bezieht sich die Fehlermeldung auf die Zeile über dem Cursor) überschreibst oder - zweitens - MakeFree mehrmals aufrufst, das wäre natürlich fatal. Für 1. solltest du die Bereichsprüfung aktivieren, dann kann schonmal nicht mehr so viel schiefgehen. Für 2. reicht es, wenn du einen Breakpoint auf die erste Zeile der Routine setzt und die Vermutung überprüfst. Verhindern kannst du das Problem mit Delphi-Referenz durchsuchenFreeAndNil. Gibt es eigentlich einen Grund, dass du nicht einfach Kon- und Destruktor statt Init und MakeFree benutzt?

[add]Pff, ich schreibe zu langsam :P .
Zitat:

Delphi-Quellcode:
if Assigned(Stringlist) then
 FreeAndNil(StringList);//Oder StringList.Free;

Mit FreeAndNil reicht schon
Delphi-Quellcode:
FreeAndNil(StringList);
Das Assigned ist überflüssig, da es schon in TObject.Free überprüft wird.
Und
Delphi-Quellcode:
// "Oder"-Teil
if Assigned(Stringlist) then
 StringList.Free;
wird nie funktionieren.[/quote]

Master of the Wind 20. Dez 2005 15:17

Re: Problem bei TStringlist Freigabe
 
Schade das von Angel4585 funktioniert nicht..es kommt immernoch "ungültige Zeigeroperation"

Master of the Wind 20. Dez 2005 15:22

Re: Problem bei TStringlist Freigabe
 
Also mit Konstruktor und Destruktor da hab ich immer so meiner Probleme wann override oder sonstwas naja. Deswegen hab ich das mal so gemacht. Die Stringlisten gebe ich nirgendwo anders Frei das steht fest. Das einzige was es noch sein kann ist:

Es gibt ein DLL procedure die auf alles zugreifen kann per zeiger auf das Oberste Objekt. Diese wird immer "ONIDLE" aufgerufen aber nur wenn die Variable initialized auf TRUE steht. Bevor ich aber alles objekte wieder Freigebe und das Programm beende, dann setze ich initialized auf FALSE.

Kann es das sein?

Zacherl 20. Dez 2005 15:25

Re: Problem bei TStringlist Freigabe
 
Ändert das etwas:
Delphi-Quellcode:
TObjekt1 = class(TComponent)
  public
    Stringlist1:TStringlist;
    Stringlist2:TStringlist;
    Stringlist3:TStringlist;

    constructor Create(AOwner: TComponent) override;
    destructor Destroy override;
  end;
[...]

Delphi-Quellcode:
constructor TObjekt1.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  Stringlist1:=TStringlist.create;
  Stringlist2:=TStringlist.create;
  Stringlist3:=TStringlist.create;
end;

destructor TObjekt1.Destroy;
begin
  Stringlist1.free;
  Stringlist2.free; //Hier kommt die Zugriffsverletzung
  Stringlist3.free;
  inherited Destroy;
end;
Auch noch die Create und Destroy Methoden hinzugefügt.

Florian

Christian Seehase 20. Dez 2005 15:27

Re: Problem bei TStringlist Freigabe
 
Moin Zusammen,

nicht zu vergessen inherited beim constructor und destructor aufzurufen... ;-)

Zacherl 20. Dez 2005 15:28

Re: Problem bei TStringlist Freigabe
 
Hab mal ein Beispiel mit Create und Destroy gepostet.
Die Deklaration von TObject1 habe ich auch geändert. Vielleicht funktioniert es so.

Master of the Wind 20. Dez 2005 15:33

Re: Problem bei TStringlist Freigabe
 
Muss nochmal Fragen. Kann man im Konstruktor schon auf alle Variablen des Objektes Zugreifen?

Zacherl 20. Dez 2005 15:39

Re: Problem bei TStringlist Freigabe
 
Nach inherited denke ich schon. Auf die selbstdefinierten StringListen erst nach deren Erzeugung mit Create.

Florian


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:36 Uhr.
Seite 1 von 3  1 23      

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