Delphi-PRAXiS
Seite 2 von 2     12   

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)

Luckie 24. Sep 2005 15:02

Re: AV - Warum?
 
Free setzt nicht automatisch den Zeiger auf nil. Das heißt beim zweiten mal versuchst du einen Node freizugeben der im Speicher nicht mehr existiert, weil der Zeiger noch gültig ist schlöagt die Prüfung auf nil fehl. Setz mal den Zeiger noch auf nil nach dem Freigeben des Speichers.

Christian Seehase 24. Sep 2005 15:13

Re: AV - Warum?
 
Moin Gereon,

Zitat:

Zitat von glkgereon
ich kann die Nodes ja nicht "in" der TreeView selber speichern, oder?

doch, geht.
Jeder Node hat die Eigenschaft Data.
Dort kannst Du Pointer zu anderen Objekten speichern, und hast so, fast, direkt Zugriff auf Daten, die zu einem Node gehören.

Aber nicht vergessen, dass diese Objekte dann auch wieder freigegeben werden müssen ;-)

glkgereon 24. Sep 2005 15:31

Re: AV - Warum?
 
Aber:

In dem Array KANN es keine Objekte geben die nicht Erstellt sind.
Es gibt nur Objekte die Ordnungsgemäß erstellt wurden.

nirgendwo sonst wird auf dieses Array in irgendeiner weise zugegriffen.

also wird auch nichts zum zweiten mal freigegeben....

xaromz 24. Sep 2005 15:54

Re: AV - Warum?
 
Hallo,

ich sehe gerade das:
Delphi-Quellcode:
begin
  { ... Daten holen etc. ... } 
  FTree.Items.Clear; // <------ 
  for i:=0 to Length(FNodes)-1 do //Nodes plattmachen
    if FNodes[i]<>nil then FNodes[i].Free;
Durch das FTree.Items.Clear werden doch schon die TreeNodes gelöscht (Vorausgesetzt, im Array sind auch die Nodes von FTree).

Danach steht in deinem Array nur noch ein Pointer ins nichts.

Gruß
xaromz

glkgereon 24. Sep 2005 16:14

Re: AV - Warum?
 
achsooo....

wäre es möglich einfach nur die Nodes zu Free'n und das Clear wegzulassen?

das wird wohl der Fehler sein...

Neutral General 24. Sep 2005 16:17

Re: AV - Warum?
 
Warum willst du sie denn Free'n ? Clear sie einfach und fertig.

Ist doch viel einfacher...

Luckie 24. Sep 2005 16:20

Re: AV - Warum?
 
Und was ist mit dem belegten Speicher?

marabu 24. Sep 2005 18:02

Re: AV - Warum?
 
Zitat:

Zitat von glkgereon
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?

Nodes werden NUR in der TreeView gespeichert, Daten NIE.

Hinzufügen geschieht so:

Delphi-Quellcode:
with TreeView.Items.AddChild(parentNode, nodeText) do
begin
  Data := Pointer(DataSet.RecNo);
  // alternativ kannst du den primary key an Data zuweisen
  ...
end;
Auf diese Weise verknüpfe ich eine Gliederung, die ich in einer Datenbanktabelle abgelegt habe, mit der TreeView. Liegen deine Daten nicht in einer Datenbank, dann verwaltest du sie vielleicht in einer Liste (TList, TObjectList, ...) oder einem array of pointer. Du kannst dann der Data property eines Nodes den Zeiger auf dein DataItem zuweisen und im Ereignis TTreeNode.OnDeletion gibst du den Speicher dann wieder frei:

Delphi-Quellcode:
procedure TDemoForm.TreeViewDeletion(Sender: TObject; Node: TTreeNode);
begin
  if Assigned(Node.Data) then
    TStringList(Node.Data).Free;
end;
marabu


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

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