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 AV - Warum? (https://www.delphipraxis.net/53881-av-warum.html)

glkgereon 24. Sep 2005 13:51


AV - Warum?
 
Hi

ich habe eine TreeView die ich dynamisch befülle.
da das im laufe des Programms mehrmals vorkommen kann, habe ich mir folgendes überlegt:

Delphi-Quellcode:
procedure UpdateTreeView;
var i:Integer;
begin
  { ... Daten holen etc. ... }
  FTree.Items.Clear; //TreeView leeren
  for i:=0 to Length(FNodes)-1 do //Nodes plattmachen
    if FNodes[i]<>nil then FNodes[i].Free;
  SetLength(FNodes,FGruppen.Count+FLieder.Count); //Array setzen
  for i:=0 to Length(FNodes)-1 do //Nodes erstellen
    FNodes[i]:=TTreeNode.Create(FTree.Items);
  { ... Nodes setzen und in TreeView rein ... }
end;
aber beim Free'en der Nodes kommt es immer zu ner AV (Wenn sie schon exitieren)
wenn ich die schleife weglasse habe ich ein monster-Speicherleck was eigentlich nur daher kommen kann.

weiss einer was daran falsch ist? bzw wie ich es anders machen kann?

Edit: FNodes ist ein array of TTreeNode, FGruppen und FLieder TStringList und FTree eine TreeView.

Christian Seehase 24. Sep 2005 13:55

Re: AV - Warum?
 
Moin Gereon,

und an welcher Stelle kommt die AV?

glkgereon 24. Sep 2005 13:59

Re: AV - Warum?
 
Wenn diese Procedure das zweite mal durchlaufen wird (Also Length(FNodes)>0 bzw die Nodes erstellt sind) direkt beim ersten FNodes[i].Free;
Im codeausschnitt also Zeile 7

Zitat:

---------------------------
Benachrichtigung über Debugger-Problem
---------------------------
Im Projekt C:\Dokumente und Einstellungen\Administrator\Eigene Dateien\Borland Studio-Projekte\mp3Org\Project1.exe sind zu viele auseinanderfolgende Exceptions aufgetreten: ''Zugriffsverletzung bei 0x00000000: Lesen von Adresse 0x00000000''. Prozess wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen.
---------------------------
OK Hilfe
---------------------------
was mich wundert: Adresse 0x00.... sollte doch nil sein...also das Free gar nicht aufgerufen werden :gruebel:

Christian Seehase 24. Sep 2005 14:01

Re: AV - Warum?
 
Moin Gereon,

wenn FNodes[i] = nil ist darfst Du FNodes[i].Free nicht aufrufen, also vorher prüfen.

glkgereon 24. Sep 2005 14:04

Re: AV - Warum?
 
mach ich doch :wall:

Delphi-Quellcode:
for i:=0 to Length(FNodes)-1 do //Nodes plattmachen
  if FNodes[i]<>nil then FNodes[i].Free;
Ausserdem kommt ja gerade dann die exception wenn FNodes[i] ungleich nil ist...

Christian Seehase 24. Sep 2005 14:07

Re: AV - Warum?
 
Moin Gereon,

:oops:
hatte ich übersehen.

Was enthält denn FNodes[i]?
Wenn Du da im Einzelschritt durchgehst, kannst Du es Dir ja anzeigen lassen.

Das der Aufruf von Free den Inhalt nicht auf nil setzt ist klar?

glkgereon 24. Sep 2005 14:14

Re: AV - Warum?
 
da weiss ich ehrlich gesagt nicht wie ich da drankommen soll :(

es ist ein array of TTreeNode in einer Klasseninstanz dessen deklaration in ner anderen Unit steckt...geht das überhauot mit der "Liste überwachter Ausdrücke"?

JasonDX 24. Sep 2005 14:17

Re: AV - Warum?
 
Zitat:

Zitat von Christian Seehase
Das der Aufruf von Free den Inhalt nicht auf nil setzt ist klar?

Genau das könnte die Fehlerquelle sein
Dieser Code
Delphi-Quellcode:
with TObject.Create do
begin
  Free;
  Free;
end;
Bringt eine (wahrscheinlich die) exception.
Mögliche Lösung: Nicht TObject.Free verwenden, sondern FreeAndNil(TObject)

btw: if Obj <> nil then Obj.Free bringt nix. In Free selbst wird schon überprüft: if self <> nil then Destroy();

marabu 24. Sep 2005 14:19

Re: AV - Warum?
 
Hi Gereon,

hast du dynamisch angeforderten Speicher an deine Knoten geknüpft, dann kannst du diesen einfach und sicher im Ereignis OnDeletion() der TreeView wieder freigeben. Außerdem würde ich keine TreeNodes in einer externen Struktur speichern. Es genügt der Data-Ponter des TreeNode auf seine zugehörigen Daten in deiner externen Struktur.

Grüße vom marabu

glkgereon 24. Sep 2005 14:23

Re: AV - Warum?
 
hmm, also ich verstehe nicht so ganz was du meinst...

ich kann die Nodes ja nicht "in" der TreeView selber speichern, oder?
afaik müssen die ja in einem seperaten array abgelegt sein.
oder liegt da der denkfehler?


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:21 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