AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

VirtualTreeView: Alle Knoten freigeben

Ein Thema von Viktorii · begonnen am 25. Nov 2008 · letzter Beitrag vom 25. Nov 2008
Antwort Antwort
Viktorii

Registriert seit: 19. Jul 2007
358 Beiträge
 
#1

VirtualTreeView: Alle Knoten freigeben

  Alt 25. Nov 2008, 14:06
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
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#2

Re: VirtualTreeView: Alle Knoten freigeben

  Alt 25. Nov 2008, 14:08
AFAIK gibt es beim VST doch das Event OnFreeNode. Da könntest Du das Objekt freigeben.

[edit] Siehe dazu hier [/edit]
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von spaxxn
spaxxn

Registriert seit: 19. Nov 2004
253 Beiträge
 
Delphi XE2 Enterprise
 
#3

Re: VirtualTreeView: Alle Knoten freigeben

  Alt 25. Nov 2008, 14:09
Zitat von Viktorii:
Hallo.
    FreeAndNil(begin);
Denk darüber nochmal nach
"Hey Süße,
hol mir mal was zu trinken! Du wirst schon wieder hässlich!"

Zitat eines Betrunkenen
  Mit Zitat antworten Zitat
Viktorii

Registriert seit: 19. Jul 2007
358 Beiträge
 
#4

Re: VirtualTreeView: Alle Knoten freigeben

  Alt 25. Nov 2008, 14:23
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 von spaxxn:
Zitat von Viktorii:
Hallo.
    FreeAndNil(begin);
Denk darüber nochmal nach
Was genau ist da falsch und wie würde man es richtig machen?
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#5

Re: VirtualTreeView: Alle Knoten freigeben

  Alt 25. Nov 2008, 14:29
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]
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#6

Re: VirtualTreeView: Alle Knoten freigeben

  Alt 25. Nov 2008, 14:31
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 ?
Heiko
  Mit Zitat antworten Zitat
Viktorii

Registriert seit: 19. Jul 2007
358 Beiträge
 
#7

Re: VirtualTreeView: Alle Knoten freigeben

  Alt 25. Nov 2008, 14:54
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 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

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 von DeddyH:
Und was spaxxn meint: willst Du wirklich das Objekt "begin" freigeben?
Hoppla, da hat sich wohl der Copy&Paste-Fehlerteufel eingeschlichen

Meine natürlich

FreeAndNil(MyItem);


Zitat von DeddyH:
[edit] Hab das Tut gefunden. [/edit]
Vielen Dank für den Link. Habe ich mir auch schon mal angeschaut....
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#8

Re: VirtualTreeView: Alle Knoten freigeben

  Alt 25. Nov 2008, 15:12
Was passiert, wenn Du nicht dereferenzierst?ParsedData := TParsedData(Sender.getnodedata(node));
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#9

Re: VirtualTreeView: Alle Knoten freigeben

  Alt 25. Nov 2008, 17:31
Hallo,

der Code mit ^ ist schon korrekt.
Das 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
Heiko
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:38 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