Einzelnen Beitrag anzeigen

Aviator

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

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