![]() |
VirtualTreeView: Alle Knoten freigeben
Hallo.
Ich habe ein VirtualTreeView welchen ich befülle. Nun kann es sein, dass ich diesen irgendwann mal mit anderen Daten neu befüllen muss. Also mache ich VST.clear. Jetzt ist die Anzeige zwar leer, aber die Daten liege ja noch im Speicher. Ich habe Code Beispiele gesehen um einen Knoten freizugeben. Aber wie komme ich nacheinander an jeden Knoten? Bei einer TList würde man es ja glaube ich so machen:
Delphi-Quellcode:
Aber so gehts beim VST nicht. Wie mache ich es richtig?
for i := 0 to MyList.Count - 1 do
begin MyItem := MyList.Items[i]; FreeAndNil(begin); end; Vielen Dank |
Re: VirtualTreeView: Alle Knoten freigeben
AFAIK gibt es beim VST doch das Event OnFreeNode. Da könntest Du das Objekt freigeben.
[edit] Siehe dazu ![]() |
Re: VirtualTreeView: Alle Knoten freigeben
Zitat:
|
Re: VirtualTreeView: Alle Knoten freigeben
Zitat:
Zitat:
|
Re: VirtualTreeView: Alle Knoten freigeben
Das Event wird ausgelöst, wenn ein Knoten gelöscht wird. Irgendwo gab es doch mal ein brauchbares Tut zum VST, da stand das auch drin. Und was spaxxn meint: willst Du wirklich das Objekt "begin" freigeben? ;)
[edit] Hab das ![]() |
Re: VirtualTreeView: Alle Knoten freigeben
Hallo,
zeige doch mal deinen Code beim OnFreeNode. Ich benutze das OnFreeNode übrigens nicht, weil ich alle Daten eh schon in einer TList (genauer, davon abgeleitet) habe. Vor dem TV.Clear mache ich ein List.ClearList (eigene Methode), die die Liste leert und die Einträge freigibt. Eine Falle gibt es: Im FormDestroy wird die List nicht nur per Free, sondern per FreeAndNIL freigegeben. Im TV.OnGetText prüfe ich beim Start auf List<>NIL. Es passiert mir manchmal, dass nach dem FormDestroy noch OnGetTetx aufgerufen wird ... Heiko PS: FreeAndNIL(begin) ist Unsinn ..., warum willst du begin free'n ? |
Re: VirtualTreeView: Alle Knoten freigeben
Zitat:
Delphi-Quellcode:
procedure TMainForm.VirtualStringTreeConsoleFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode);
var ParsedData: TParsedData; begin if assigned(node) then begin ParsedData := TParsedData(Sender.getnodedata(node)^); if Assigned(ParsedData) then FreeAndNil(ParsedData); // <-- AccessViolation end; end; Zitat:
Allderings kommt bei FreeAndNil eine Exception: --------------------------- Benachrichtigung über Debugger-Exception --------------------------- Im Projekt ParserDelphi2006.exe ist eine Exception der Klasse EAccessViolation mit der Meldung 'Zugriffsverletzung bei Adresse 00403F64 in Modul 'RS422LogParserDelphi2006.exe'. Lesen von Adresse 333A342D' aufgetreten. --------------------------- Anhalten Fortsetzen Hilfe --------------------------- Zitat:
Meine natürlich
Delphi-Quellcode:
:drunken:
FreeAndNil(MyItem);
Zitat:
|
Re: VirtualTreeView: Alle Knoten freigeben
Was passiert, wenn Du nicht dereferenzierst?
Delphi-Quellcode:
ParsedData := TParsedData(Sender.getnodedata(node));
|
Re: VirtualTreeView: Alle Knoten freigeben
Hallo,
der Code mit ^ ist schon korrekt. Das
Delphi-Quellcode:
kannst du dir sparen,
if Assigned(ParsedData) then
falls ParsedData schon freigegeben wurde. ParsedData steht in einer TList ? Ist die denn noch aktuell, oder wird sie vor dem TV.Clear gelöscht ? Heiko |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:01 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