Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   VST, Suche SelectItem-ähnliches Event. OnChange scheitert an FocusedNode.GetData (https://www.delphipraxis.net/200015-vst-suche-selectitem-aehnliches-event-onchange-scheitert-focusednode-getdata.html)

Bünni 12. Mär 2019 00:56


VST, Suche SelectItem-ähnliches Event. OnChange scheitert an FocusedNode.GetData
 
Im TListView gibt es ein Event SelectItem. Das wird auch aktiviert, wenn man bei dauerhaft gedrückter Maustaste Listview-Items im Report-Stil markiert.

Gibt es sowas auch für das VirtualStringTree?
Ich möchte mehrere Nodes mit gedrückter Maustaste selektieren und in der Caption des Programms ausgeben wieviele selektiert sind.

Es gibt zwar OnChange, aber da bekomme ich beim dem Aufruf eine Zugriffsverletzung wenn man vorher nicht mindestens 1x einen Node angeklickt hat.
Delphi-Quellcode:
 if VST.SelectedCount = 1 then
  Data := VST.FocusedNode.GetData<TData>;
Und genau diesen TData-Daten brauche ich leider genau da, damit ich weiß über welchen Node (wenn einer selektiert ist) ich gerade mit meiner Multi-Selektierung (gedrückte linke Maustaste) fahre.

Klaus01 12. Mär 2019 07:39

AW: VST, Suche SelectItem-ähnliches Event. OnChange scheitert an FocusedNode.GetData
 
.. ich denke Du wirst nicht umhin kommen , die Mouseposition in einen Index umzurechnen.

Stichhworte: Mouse.CursorPos und ScreenToClient

Grüße
Klaus

Aviator 12. Mär 2019 08:38

AW: VST, Suche SelectItem-ähnliches Event. OnChange scheitert an FocusedNode.GetData
 
Schau dir mal OnAddToSelection und OnRemoveFromSelection an.

Bünni 12. Mär 2019 12:39

AW: VST, Suche SelectItem-ähnliches Event. OnChange scheitert an FocusedNode.GetData
 
Ich konnte das ganze Problem jetzt noch durch eine Art Schummelei ausgleichen.
Wenn ich Nodes mit dem Selektierungs-Kasten markiere, werden bestimmte Elemente der Benutzeroberfläche aktiviert oder deaktiviert.

Das Problem war, dass wenn man einen Node selektiert hat alles abläuft wie gewünscht. Beim zweiten (mit dem selben gedrückten Mausklick) auch.
De-selektiert man jetzt einen Node (noch immer im selben gedrückten Mausklick), dann weiß das VST zwar, dass nur noch 1 Node selektiert ist aber der übergebene Node an OnChange ist immer nil. Wahrscheinlich weil er selektiert war und sich danach nicht mehr ändert.

Repariert habe ich dieses Verhalten, indem ich am Ende meiner OnChange-Prozedur nun prüfe
Delphi-Quellcode:
 if (NodeSelectedCount = 1) then
  begin
   // FIX
   if SelectedNode = nil then // Wenn der Node nil ist, obwohl er selektiert ist ...
    SelectedNode := VST.GetFirstSelected; // ... hole den letzten verbleibenden selektierten Node
   // /FIX
Ob das aber das Gelbe vom Ei ist weiß ich nicht. Anders habe ich es noch nicht hinbekommen.
Das scheint ein Problem im OnChange mit dem letzten selektierten Node zu sein. SelectedCount funktioniert wie es soll hingegen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:52 Uhr.

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