![]() |
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.
|
Re: AV - Warum?
Moin Gereon,
Zitat:
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 ;-) |
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.... |
Re: AV - Warum?
Hallo,
ich sehe gerade das:
Delphi-Quellcode:
Durch das FTree.Items.Clear werden doch schon die TreeNodes gelöscht (Vorausgesetzt, im Array sind auch die Nodes von FTree).
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; Danach steht in deinem Array nur noch ein Pointer ins nichts. Gruß xaromz |
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... |
Re: AV - Warum?
Warum willst du sie denn Free'n ? Clear sie einfach und fertig.
Ist doch viel einfacher... |
Re: AV - Warum?
Und was ist mit dem belegten Speicher?
|
Re: AV - Warum?
Zitat:
Hinzufügen geschieht so:
Delphi-Quellcode:
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:
with TreeView.Items.AddChild(parentNode, nodeText) do
begin Data := Pointer(DataSet.RecNo); // alternativ kannst du den primary key an Data zuweisen ... end;
Delphi-Quellcode:
marabu
procedure TDemoForm.TreeViewDeletion(Sender: TObject; Node: TTreeNode);
begin if Assigned(Node.Data) then TStringList(Node.Data).Free; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:39 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz