Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi VirtualTreeView: Alle Knoten freigeben (https://www.delphipraxis.net/124797-virtualtreeview-alle-knoten-freigeben.html)

Viktorii 25. Nov 2008 13:06


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:
  for i := 0 to MyList.Count - 1 do
  begin
    MyItem := MyList.Items[i];
    FreeAndNil(begin);
  end;
Aber so gehts beim VST nicht. Wie mache ich es richtig?
Vielen Dank

DeddyH 25. Nov 2008 13:08

Re: VirtualTreeView: Alle Knoten freigeben
 
AFAIK gibt es beim VST doch das Event OnFreeNode. Da könntest Du das Objekt freigeben.

[edit] Siehe dazu hier [/edit]

spaxxn 25. Nov 2008 13:09

Re: VirtualTreeView: Alle Knoten freigeben
 
Zitat:

Zitat von Viktorii
Hallo.
Delphi-Quellcode:
    FreeAndNil(begin);

Denk darüber nochmal nach :)

Viktorii 25. Nov 2008 13:23

Re: VirtualTreeView: Alle Knoten freigeben
 
Zitat:

Zitat von DeddyH
AFAIK gibt es beim VST doch das Event OnFreeNode. Da könntest Du das Objekt freigeben.

[edit] Siehe dazu hier [/edit]

Ich habe den Code angepasst und dem Event zugeordnet. Aber wann tritt das Event ein bzw. wie löse ich es aus?


Zitat:

Zitat von spaxxn
Zitat:

Zitat von Viktorii
Hallo.
Delphi-Quellcode:
    FreeAndNil(begin);

Denk darüber nochmal nach :)

Was genau ist da falsch und wie würde man es richtig machen?

DeddyH 25. Nov 2008 13:29

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 Tut gefunden. [/edit]

hoika 25. Nov 2008 13:31

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 ?

Viktorii 25. Nov 2008 13:54

Re: VirtualTreeView: Alle Knoten freigeben
 
Zitat:

Zitat von hoika
Hallo,

zeige doch mal deinen Code beim OnFreeNode.

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:

Zitat von DeddyH
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.

Okay, ich glaube das habe ich jetzt verstanden. Wenn ich .claer ausführe, werden die Konten gelöscht und das Event OnFreeNode wird ausgelöst. Und dort kann ich dann den Knoten freigeben. Ist das richtig so? Habe löschen und freigeben bis jetzt immer schön in einen Topf geworfen :oops:

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:

Zitat von DeddyH
Und was spaxxn meint: willst Du wirklich das Objekt "begin" freigeben? ;)

Hoppla, da hat sich wohl der Copy&Paste-Fehlerteufel eingeschlichen :witch:

Meine natürlich

Delphi-Quellcode:
FreeAndNil(MyItem);
:drunken:


Zitat:

Zitat von DeddyH
[edit] Hab das Tut gefunden. [/edit]

Vielen Dank für den Link. Habe ich mir auch schon mal angeschaut....

DeddyH 25. Nov 2008 14:12

Re: VirtualTreeView: Alle Knoten freigeben
 
Was passiert, wenn Du nicht dereferenzierst?
Delphi-Quellcode:
ParsedData := TParsedData(Sender.getnodedata(node));

hoika 25. Nov 2008 16:31

Re: VirtualTreeView: Alle Knoten freigeben
 
Hallo,

der Code mit ^ ist schon korrekt.
Das
Delphi-Quellcode:
if Assigned(ParsedData) then
kannst du dir sparen,
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 15:46 Uhr.

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