AGB  ·  Datenschutz  ·  Impressum  







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

TVirtualStringTree AddChild access violation

Ein Thema von EricMeyer · begonnen am 28. Nov 2019 · letzter Beitrag vom 9. Dez 2019
Antwort Antwort
Seite 2 von 2     12   
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#1

AW: TVirtualStringTree AddChild access violation

  Alt 8. Dez 2019, 13:40
Teil 1:
Ich habe mich nochmal mit dem Code von unten auseinander gesetzt. Es schein am Befehl Size Of oder ValidateNode zu liegen. Wenn ich danach versuche wieder auf die Daten zuzugreifen, killt er sich.

Delphi-Quellcode:
              
              LData := (LNode.GetData);
              LData^.FPath := Directory+SearchRec.Name;
              LData^.FFolderName := SearchRec.Name;
              LData^.FFirstFolder := false;
              TreeView2.NodeDataSize := SizeOf(PTreeData);
              TreeView2.ValidateNode(LNode, False);
              LData := (LNode.GetData); //<--- Will nicht
Du setzt die NodeDataSize auf die Größe des Pointers. Also wahrscheinlich 4 Byte. Deine Struktur in der die Daten gespeichert werden ist aber sehr wahrscheinlich ungleich 4 Byte. Deshalb schmiert er bei ValidateNode() ab. Also einfach die NodeDataSize mit TreeView2.NodeDataSize := SizeOf(TTreeData); // <-- ACHTUNG: TTreeData nicht PTreeData initialisieren. Dann sollte das funktionieren.

Teil2:
Ich habe mich mit den Vorschlägen auseinander gesetzt, es über RootNodeCount zu lösen. Ich habe also ein Recusives Object erzeugt, in dem alle Daten sind, habe die Oberste Ebene fertig, aber muss ich jetzt wirklich in IniChild die Kinder erzeugen und dann davon die Kindeskinder? Muss ich das recusive aufrufen, oder wird nachdem ich ein Kind erzeugt habe für dieses, das wieder aufgerufen? Ich finde das ganze unglaublich aufwändig dafür, dass ich nur eine Ordnerstruktur abbilden will.
Das Event InitChildren wird immer dann aufgerufen, wenn dem Tree die Daten der ChildNodes bekannt sein muss. Im Normalfall erst dann, wenn man die Parent Node expandiert. Da du dann im InitChildren die ParentNode als Parameter übergeben bekommst, kannst du dir per GetNodeData() den Pointer auf das Objekt in deiner Liste geben lassen. In dem Objekt gibt es dann ja eine Liste mit Verzeichnissen. Die Liste hat eine bestimmte Anzahl an Verzeichnissen. Und diese Anzahl wird dem var Parameter ChildCount zugewiesen. Der Tree erstellt dann automatisch die Anzahl der Nodes auf dieser Ebene und ruft für jede Node das Event InitNode() auf. Im InitNode musst du dich dann immer an der ParentNode orientieren wenn der NodeLevel > 0 ist. Und so kannst du dir sehr schnell den Tree aufbauen. Ist eigentlich nicht wirklich aufwendig. Nur der erste Versuch klingt immer abschrecken.

Hoffe die Erklärung bringt dich weiter. Versuch einfach mal mit den Events zu arbeiten. Wenn du nicht weiter kommst, dann stell den SourceCode hier rein und wir schauen nochmal drüber.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 06:37 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