AGB  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein VirtualSourceTree selektierte Nodes löschen?

VirtualSourceTree selektierte Nodes löschen?

Ein Thema von SneakyBagels · begonnen am 17. Jun 2017 · letzter Beitrag vom 20. Jun 2017
Antwort Antwort
Seite 1 von 4  1 23     Letzte » 
SneakyBagels
(Gast)

n/a Beiträge
 
#1

VirtualSourceTree selektierte Nodes löschen?

  Alt 17. Jun 2017, 21:57
Ich habe folgenden Code geschrieben, um selektierte Nodes zu löschen
Delphi-Quellcode:
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;
Das funktioniert wunderbar. Aber selektiert man nun auch den ersten Node, dann geht das in die Hose.
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;

Geändert von SneakyBagels (17. Jun 2017 um 23:06 Uhr)
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.207 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#2

AW: VirtualSourceTree selektierte Nodes löschen?

  Alt 17. Jun 2017, 23:37
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 DeleteSelectedNodes() Funktion an. Dort wird das auch gemacht.

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:
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.
Warum das Rad immer wieder neu erfinden wenn es doch schon Funktionen dafür gibt? 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 TBaseVirtualTree.GetSortedSelection() an. Die wird auch intern im Tree verwendet wenn du DeleteSelectedNodes() aufrufst.
  Mit Zitat antworten Zitat
SneakyBagels
(Gast)

n/a Beiträge
 
#3

AW: VirtualSourceTree selektierte Nodes löschen?

  Alt 17. Jun 2017, 23:49
Zitat:
Warum das Rad immer wieder neu erfinden wenn es doch schon Funktionen dafür gibt?
Ich muss im fertigen Code nicht nur den Eintrag löschen sondern noch ein paar mehr Dinge machen (z.B. ggf. den ObjectList-Eintrag löschen)
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.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
6.572 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#4

AW: VirtualSourceTree selektierte Nodes löschen?

  Alt 18. Jun 2017, 00:29
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.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Benutzerbild von ConnorMcLeod
ConnorMcLeod

Registriert seit: 13. Okt 2010
Ort: Bayern
389 Beiträge
 
Delphi 2007 Enterprise
 
#5

AW: VirtualSourceTree selektierte Nodes löschen?

  Alt 19. Jun 2017, 10:05
Ich mach das immer so:
  1. alle Nodes durchlaufen
  2. wenn selektiert, dann herausfinden, welche Daten zugrunde liegen und diese Daten vernichten
  3. den Tree neu aufbauen
  4. den vorher gemerkten Treenode wieder fokussieren bzw wenn er gelöscht wurde, dessen nächsten Sibling oder den vorigen Sibling
Das halte ich für am saubersten.
Nr.1 Delphi-Tool: [F7]
  Mit Zitat antworten Zitat
madas

Registriert seit: 9. Aug 2007
188 Beiträge
 
#6

AW: VirtualSourceTree selektierte Nodes löschen?

  Alt 19. Jun 2017, 10:36
Ich muss im fertigen Code nicht nur den Eintrag löschen sondern noch ein paar mehr Dinge machen (z.B. ggf. den ObjectList-Eintrag löschen)
Ich möchte neben dem VST noch eine ObjectListe führen, welche die Daten hält.
Bei der Objectliste OwnsObjects auf false setzen und im OnFreeNode vom VST das Object der Liste freigeben.
Bei DeleteNode wird dann OnFreeNode aufgerufen.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
5.199 Beiträge
 
Delphi 10.2 Tokyo Architect
 
#7

AW: VirtualSourceTree selektierte Nodes löschen?

  Alt 19. Jun 2017, 10:56
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;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
SneakyBagels
(Gast)

n/a Beiträge
 
#8

AW: VirtualSourceTree selektierte Nodes löschen?

  Alt 19. Jun 2017, 14:45
(Siehe Edit)

Ungefähr so?
=> ObjectList OwnObjects auf Fale
=> Änderung von Uwe eingebaut

und
Delphi-Quellcode:
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;
Danach wird mir noch immer "Count: N ausgegeben" (N = die Anzahl der Nodes vor dem Löschen)
ShowMessage('Count: ' + IntToStr(aVSTDataClasses.Count));


Edit
Dummheit muss bestraft werden. aVSTDataClasses.Delete(idx); und nicht aVSTDataClasses.Items[idx].Free; .

Geändert von SneakyBagels (19. Jun 2017 um 14:49 Uhr)
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.207 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#9

AW: VirtualSourceTree selektierte Nodes löschen?

  Alt 19. Jun 2017, 14:58
Auch wenn das aVSTDataClasses.Items[idx].Free; an der Stelle nicht passt hier noch ein kleiner Tipp:

Du kannst das .Items getrost weglassen und einfach aVSTDataClasses[idx].Free; schreiben. Items ist die Standardeigenschaft einer Liste. Somit ist das überflüssig.

Und die Vorteile die du davon hast sind:
  • Keine unnötige Schreibarbeit
  • Übersichtlicherer SourceCode
  • Du kannst so eine Zeile ganz schnell mal für die Benutzung mit einem Array verwenden (auch wenn das jetzt vielleicht nicht so häufig vorkommt)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
26.551 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#10

AW: VirtualSourceTree selektierte Nodes löschen?

  Alt 19. Jun 2017, 15:00
Dummheit muss bestraft werden. aVSTDataClasses.Delete(idx); und nicht aVSTDataClasses.Items[idx].Free; .
Und wo wird jetzt die Instanz wieder freigegeben?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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:

Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:07 Uhr.
Powered by vBulletin® Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2017 by Daniel R. Wolf