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
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.291 Beiträge
 
Delphi 12 Athens
 
#1

AW: TVirtualStringTree AddChild access violation

  Alt 9. Dez 2019, 09:21
Das wird erzählt, weil man die Daten im besten Fall in einer Liste speichert.
Was ich damit sagen will: Es gibt Fälle, wo die Erzeugung und Verwaltung einer Liste nur Overhead produziert, aber keinen Mehrwert. Der klassische Anwendungsfall vom VST waren dynamisch erzeugte Records. Der VST verwaltete Zeiger darauf, die Nodes im Baum waren in sich selbst eine Liste. Die einzelnen Records kann man z.B. auch per Zeiger verketten. In dem Fall nützt dir eine Liste herzlich wenig. Deshalb würde ich nicht vom "besten Fall" sprechen. Vielmehr muss man sich fallspezifisch damit auseinander setzen, was Sinn macht und was nicht.

Im vorliegenden Fall hast du eine Dateisystem-Struktur. Willst du jetzt für jeden Ordner, jedes Laufwerk und jeden Symlink ein extra Objekt instantiieren und in einer ObjectList verwalten, nur damit du dir ein bisschen Arbeit beim Freenode sparen kannst?

Ich möchte am Beispiel des Erstposters dezent darauf hinweisen, dass ein TSearchRec bereit ein Record ist. Warum nicht den gleich an den Node beppen, wenn er denn schon mal da ist? Subnodes würde ich gar nicht initial mit erzeugen sondern erst on-demand wenn der Anwender einen Ordner-Node aufklappt. So macht das auch der Explorer. Sonst würde das Öffnen auf einer normalen Windows-Installation ja jedesmal 5 Minuten dauern, weil ein komplettes rekursives Listing gemacht werden müsste

@EricMeyer: Die Zugriffsverletzung in deinem Codebeispiel kommt daher, dass du zuerst versuchst, den Node zu erzeugen und danach erst NodeDataSize zuweist. NodeDataSize brauchst du in deinem Fall nur ein einziges Mal zuweisen und zwar bevor du überhaupt in deine Repeat-Schleife gehst. Der Hinweis mit dem TTreeData statt PTreeData war übrigens richtig. Man kann übrigens auch völlig verschiedene Records innerhalb des selben VST benützen. Deshalb speichert jeder PVirtualNode die NodeDataSize auch separat. Für solche Fälle gibt es das Event OnGetNodeDataSize, das z.B. von der Methode GetNodeData aufgerufen wird.
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber. I und E zu vertauschen hätte den selben negativen Effekt, würde aber eher dem Betriebsklima schaden

Geändert von Codehunter ( 9. Dez 2019 um 09:29 Uhr)
  Mit Zitat antworten Zitat
EricMeyer

Registriert seit: 31. Mai 2012
Ort: Berlin
23 Beiträge
 
#2

AW: TVirtualStringTree AddChild access violation

  Alt 9. Dez 2019, 10:20
  TreeView2.NodeDataSize := SizeOf(PTreeData); natürlich muss hier TTreeData rein. Sorry ich hatte rumgespielt mit diesem Punkt, um zu schauen, ob es daran liegt und es dann falsch zurück verbessert.

Und dank des Tipps hier, habe ich herausgefunden woran es lag. Die Zeile
  TreeView2.NodeDataSize := SizeOf(TTreeData); habe ich noch vor das Beginupdate des Treeviews gesetzt und dann lief es.

Und jetzt macht auch alles Sinn. Es ist abgeschmiert, als ich zum Parent zurückgekommen bin. Der hatte seine Daten verloren. Ich finde es immer noch etwas seltsam, dass der Parent in der ersten Iteration funktioniert hat, dann aber später, als er von tieferen Rekursionen zurück zur obersten gekommen ist, nicht mehr. Es erklärt auch, warum der Node assigned war, nur eben die Daten nicht. Dennoch denke ich mir, eigentlich müsste er doch dann beim Zugriff auf die Daten und nicht beim addchildnode abschmieren. Weil der ursprüngliche Speicherplatz des Nodes doch mindestens ausreichen müsste, damit der Node selbst erkannt wird. Aber ich kenne mich mit Pointern nicht genug aus.

Trotzdem vielen Dank!
  Mit Zitat antworten Zitat
generic

Registriert seit: 24. Mär 2004
Ort: bei Hannover
2.416 Beiträge
 
Delphi XE5 Professional
 
#3

AW: TVirtualStringTree AddChild access violation

  Alt 9. Dez 2019, 14:16
 TreeView2.NodeDataSize := SizeOf(TTreeData); Das solltest du nach der Formular-Erzeugung einmalig machen.
z.B. im Form.OnCreate
Am besten bevor du irgend etwas anderes im Baum anstellst.
  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 01:24 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