Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Große Probleme mit VirtualStringTree (https://www.delphipraxis.net/193070-grosse-probleme-mit-virtualstringtree.html)

jaenicke 17. Jun 2017 11:27

AW: Große Probleme mit VirtualStringTree
 
Was hast du denn für eine Delphiversion und woher hast du den VST heruntergeladen?
Richtig wäre hier ausgecheckt:
https://github.com/Virtual-TreeView/Virtual-TreeView

SneakyBagels 17. Jun 2017 11:32

AW: Große Probleme mit VirtualStringTree
 
Liste der Anhänge anzeigen (Anzahl: 1)
Tokyo und VST Version 7, die neueste.
Fehlt in Unit2 nicht SetData und GetData?

SneakyBagels 17. Jun 2017 11:35

AW: Große Probleme mit VirtualStringTree
 
Zitat:

Zitat von SneakyBagels (Beitrag 1374749)
Tokyo und VST Version 7, die neueste.

Fehlt in Unit2 nicht SetData und GetData?

EDIT es funktioniert jetzt... ich musste nur meinen alten VST-Ordner mit den Units drin löschen.
Ich bastel dann später mal weiter. Danke bisher! Und Aviator, deinen Beitrag lese ich mir noch in Ruhe durch.

SneakyBagels 17. Jun 2017 15:27

AW: Große Probleme mit VirtualStringTree
 
So da bin ich wieder.
Ich habe noch ein bisschen rumgespielt und herausgefunden, dass wenn ich das VST mit Clear leere, wohl auch die Datenklassen in den Nodes automatisch freigegeben werden.
Ein im ..ObjectList..Free im FormDestroy führt aber zu einem "Ungültige Zeigeroperation".
Im VSTOnFree habe ich
Delphi-Quellcode:
VST.GetNodeData<TVSTData>(Node).Free;
hinzugefügt.
Ist es nicht normaler so, wie man Instanzen von etwas freigibt? Im OnDestroy meine ich?

DeddyH 17. Jun 2017 17:35

AW: Große Probleme mit VirtualStringTree
 
Das klingt so, als hättest Du Mehrfach-Referenzen auf Deine Objekte. Wenn man da nicht aufpasst, schafft man sich ganz schnell wilde Zeiger, was zu den geschilderten Problemen führt. Also entweder dafür sorgen, dass beim Zerstören der Objekte alle Referenzen genilt werden oder einfach Interfaces verwenden.

SneakyBagels 17. Jun 2017 17:48

AW: Große Probleme mit VirtualStringTree
 
Wollte gerade antworten :P

1. TObjectList habe ich durch TList ausgetauscht. Denn TObjectList UND die VST haben die Objekte.... "ge-owned" :?: gehabt... glaube ich jedenfalls.

2. Folgende Änderung im OnFreeNode
Delphi-Quellcode:
procedure TForm2.VSTFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode);
begin
 VST.GetNodeData<TVSTData>(Node).Free;
 aVSTDataClasses.Delete(Node.Index); // <== das hier habe ich hinzugefügt
end;
Das funktioniert jetzt soweit.

- VST.Clear
VST leeren, Nodes löschen und TList-Objekte freigeben

- aVSTDataClasses.Free
Am Ende des Programms Liste freigeben

NUR ich kann mir gut vorstellen, dass meine Änderung oben mit Delete(Nodex.Index) richtig in die Hose geht, wenn man das VST um-sortiert (von Z nach A statt A nach Z).
Bzw. wenn man im VST nur ein paar Nodes und nicht alle angezeigt (Stichwort "Suche") dann ginge das auch echt in die Hose.
Oder sehe ich das falsch?

Und habe dabei gerade noch ein anderes Problem gefunden... ein VST.Clear räumt mir leider auch die TList leer, was ich nicht möchte.

DeddyH 17. Jun 2017 17:57

AW: Große Probleme mit VirtualStringTree
 
Das siehst Du schon richtig, machst es Dir aber auch unnötig schwer. Ich an Deiner Stelle würde die Objekte speichertechnisch weiterhin von der Objektliste verwalten lassen und eine Referenz in den Knoten ablegen, wie Du es ja vorher hattest. Wird nun ein Knoten gelöscht, merkst Du Dir die Referenz, holst Dir deren Index aus der Objektliste und löschst dann diesen Index aus der Liste. Steht dort OwnsObjects auf true, wird das Objekt automatisch freigegeben. Im OnFreeNode darfst Du das Objekt dann natürlich nicht freigeben, das ist ja schon weg.

SneakyBagels 17. Jun 2017 18:00

AW: Große Probleme mit VirtualStringTree
 
Das ich das Projekt nochmal als Anhang schicken? Verstehe sonst nur Bahnhof, ob ich das jetzt richtig habe oder nicht.

Aviator 17. Jun 2017 18:12

AW: Große Probleme mit VirtualStringTree
 
Du könntest einfach das OnFreeNode Event weglassen. Dann gibt dir der Tree auch nichts frei was du nicht freigeben willst. Und dann eben eine TObjectList nutzen (wie von DeddyH vorgeschlagen). Bei mir funktioniert das so schon seit Jahren.

Der Tree bekommt immer nur eine Referenz zu dem Objekt, wird aber niemals der Besitzer.

EDIT: Häng dein Projekt einfach mal an. Dann können wir mal drüberschauen.

DeddyH 17. Jun 2017 18:12

AW: Große Probleme mit VirtualStringTree
 
Das müssen sich dann aber andere anschauen, ich sitze gerade am Tablet. Aber eine andere Frage: wird die Liste noch anderweitig benutzt, oder dient sie lediglich der Speicherverwaltung? Im letzteren Fall könntest Du doch komplett darauf verzichten.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:25 Uhr.
Seite 2 von 4     12 34      

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