![]() |
VirtualSourceTree selektierte Nodes löschen?
Ich habe folgenden Code geschrieben, um selektierte Nodes zu löschen
Delphi-Quellcode:
Das funktioniert wunderbar. Aber selektiert man nun auch den ersten Node, dann geht das in die Hose.
var
Node, NodeTmp: PVirtualNode; i: Integer; begin Node := VST.GetFirst; while Assigned(Node) do begin if VST.Selected[Node] then begin NodeTmp := VST.GetPreviousSibling(Node); VST.DeleteNode(Node); Node := NodeTmp; end; Node := VST.GetNextSibling(Node); // ich brauche nur Toplevel Nodes end; end; Ich habe gelesen, dass man den aktuellen Node zwischenspeichern muss, um später GetNextSibling() ausführen zu können. Denn beim Löschen von Node geht die Referenz auf diesen verloren was zu einer AV führt. Gibt es eine schönere Möglichkeit durch alles Nodes zu laufen und die selektierten zu löschen? Wichtig ist, dass ich das alles per Hand machen muss. Einen Einzeiler kann ich, wenn es den gibt, leider nicht verwenden. 0815 wäre eventuell sogar noch... aber ist das noch konform?
Delphi-Quellcode:
var
Data: TVSTData; i: Integer; NodeArray: TNodeArray; begin NodeArray := VST.GetSortedSelection(False); for i := Low(NodeArray) to High(NodeArray) do begin VST.DeleteNode(NodeArray[i]); // Node "visuell" löschen end; |
AW: VirtualSourceTree selektierte Nodes löschen?
EDIT: Oha. Ich sollte deinen Beitrag komplett lesen. Da zeigst du ja primzipiell schon die (von dir als 0815 bezeichnet) Lösung mehr oder weniger auf. Schau mal die
Delphi-Quellcode:
Funktion an. Dort wird das auch gemacht.
DeleteSelectedNodes()
Um ehrlich zu sein habe ich noch nie Nodes in einer Schleife löschen müssen. Aber nichts desto trotz verstehe ich diese Aussage nicht: Zitat:
Delphi-Quellcode:
.
VirtualTreeView1.DeleteSelectedNodes
Zur Not schaust du dir die Funktion im SourceCode des Trees an und baust die nach. Ich kann nur wirklich nichts dazu sagen, ob dann wirklich Referenzen verloren gingen. Aber es wäre nur logisch. Aber schau dir mal die Funktion
Delphi-Quellcode:
an. Die wird auch intern im Tree verwendet wenn du
TBaseVirtualTree.GetSortedSelection()
Delphi-Quellcode:
aufrufst.
DeleteSelectedNodes()
|
AW: VirtualSourceTree selektierte Nodes löschen?
Zitat:
Ich möchte neben dem VST noch eine ObjectListe führen, welche die Daten hält. Denn ab und zu möchte ich nur gewisse Nodes anzeigen, trotzdem aber Zugriff auf alle haben und das geht nur mit einer Liste. GetSortedSelection mit einer for-Schleife ist interessant und, wie ich finde, besser als eine while-Schleife und Assigned()-Prüfung. Das funktioniert jetzt erstmal wunderbar. Ich danke für die Hilfe bisher (auch im anderen Thema). Mein Umbau von TListView zu VST wird sicher noch viel zeit in Anspruch nehmen und es werden sicher noch mehr Fragen auftauchen. Alles aber zu seiner Zeit. |
AW: VirtualSourceTree selektierte Nodes löschen?
Wenn du mit nicht immer alle anzeigen einen Filter meinst... Dafür gibt es Visible. Damit kannst du Knoten sichtbar und unsichtbar machen und damit extrem schnell live bei der Eingabe filtern.
|
AW: VirtualSourceTree selektierte Nodes löschen?
Ich mach das immer so:
|
AW: VirtualSourceTree selektierte Nodes löschen?
Zitat:
Bei DeleteNode wird dann OnFreeNode aufgerufen. |
AW: VirtualSourceTree selektierte Nodes löschen?
Ohne das jetzt probiert zu haben, wäre diese vereinfachte Form deines ursprünglichen Ansatzes nicht vollkommen ausreichend?
Delphi-Quellcode:
Node := VST.GetFirst;
while Assigned(Node) do begin NodeTmp := VST.GetNextSibling(Node); if VST.Selected[Node] then begin VST.DeleteNode(Node); end; Node := NodeTmp; end; |
AW: VirtualSourceTree selektierte Nodes löschen?
(Siehe Edit)
Ungefähr so? => ObjectList OwnObjects auf Fale => Änderung von Uwe eingebaut und
Delphi-Quellcode:
Danach wird mir noch immer "Count: N ausgegeben" (N = die Anzahl der Nodes vor dem Löschen)
procedure TForm2.VSTFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode);
var Data: TVSTData; idx: Integer; begin Data := Node.GetData<TVSTData>; idx := aVSTDataClasses.IndexOf(Data); if idx > -1 then aVSTDataClasses.Items[idx].Free; // Data.Free; end;
Delphi-Quellcode:
ShowMessage('Count: ' + IntToStr(aVSTDataClasses.Count));
Edit Dummheit muss bestraft werden.
Delphi-Quellcode:
und nicht
aVSTDataClasses.Delete(idx);
Delphi-Quellcode:
.
aVSTDataClasses.Items[idx].Free;
|
AW: VirtualSourceTree selektierte Nodes löschen?
Auch wenn das
Delphi-Quellcode:
an der Stelle nicht passt hier noch ein kleiner Tipp:
aVSTDataClasses.Items[idx].Free;
Du kannst das
Delphi-Quellcode:
getrost weglassen und einfach
.Items
Delphi-Quellcode:
schreiben. Items ist die Standardeigenschaft einer Liste. Somit ist das überflüssig.
aVSTDataClasses[idx].Free;
Und die Vorteile die du davon hast sind:
|
AW: VirtualSourceTree selektierte Nodes löschen?
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:07 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