![]() |
Virtual Treeview MultiSelect/Onchange Event Problem
Hi Leute,
ich verwende den Virtual Treeview als Navigationshilfe durch ein Mehrschichtiges Dokument. Wird jetzt im Tree ein Node markiert, soll das ganze auch im Dokument entsprechend markiert werden. Dazu verwende ich den Event Onchange des Virtual Trees. In diesem Event wird der Node übergeben dessen Status sich ändert :
Delphi-Quellcode:
Das ganze funktioniert auch "wunderbar" das Event tritt immer ein wenn ein Node markiert wird.
procedure TXyzForm.vst_DocExplorerChange(Sender: TBaseVirtualTree; Node: PVirtualNode);
Var pNodeData : PTTreeData; begin pNodeData := vst_DocExplorer.GetNodeData(Node); if (Assigned(pNodeData)) and (Assigned(PNodeData^.Line)) then pNodeData^.Line.Selected := vst_DocExplorer.Selected[Node]; end; Allerdings bekomme ich nicht mit wenn die Markierung/Selektierung aufgehoben wird. Situation: Multiselect des Trees ist an, 2 Nodes sind markiert, es wird auf einen anderen Node geklickt. Annahme: 3 x das Event OnChange 2 x für die vorher selektierten und 1 x für den neuen selektierten. ^^ Das ist aber leider nicht der Fall, weiß jemand warum ? Oder bin ich im falschen Event ? Nachtrag: Das Event tritt immer nur 2 x ein, egal ob vorher 2,4 oder 8 Einträge selektiert waren. Greetz Data |
Re: Virtual Treeview MultiSelect/Onchange Event Problem
Für dein Problem würde ich eher die On...Focus-Ereignisse nutzen. Das trifft die Sache imho eher.
|
Re: Virtual Treeview MultiSelect/Onchange Event Problem
es gibt noch Ereignisse welche auf *ing Enden. Changeing, Focuschanging, Selectionchanging.
Schau mal da ob was für dich dabei ist. |
Re: Virtual Treeview MultiSelect/Onchange Event Problem
@ThaosBen:
Auch bein OnFocus weiß ich nicht, welche Nodes vorher beim Multi-Select markiert waren. @Generic: Gibts beim Virtual TreeView leider alle nicht. Greetz Data |
Re: Virtual Treeview MultiSelect/Onchange Event Problem
Aso ... das ist das Problem.
Ja, es gibt kein Event des Trees das dir sagt, was vorher selected war. Dazu muss du per GetFirstSelected und GetNextSelected durchlaufen. |
Re: Virtual Treeview MultiSelect/Onchange Event Problem
Hallo DataCool,
hier ist ein Vorschlag zur Lösung deines Problems:
Delphi-Quellcode:
Gruß Hawkeye
type
TForm1 = class(TForm) [...] private OldSelection : TNodeArray; procedure HandleSelection (const aNode: PVirtualNode); procedure HandleDeselection (const aNode: PVirtualNode); end; procedure TForm1.VSTChange (Sender: TBaseVirtualTree; Node: PVirtualNode); function _Contains (const aNodes: TNodeArray; const aNode: PVirtualNode): Boolean; var i : Integer; begin for i := 0 to High(aNodes) do if (aNodes[i] = aNode) then begin Result := True; Exit; end; Result := False; end; var NewSelection : TNodeArray; i : Integer; begin NewSelection := VST.GetSortedSelection(False); for i := 0 to High(OldSelection) do if (not _Contains(NewSelection, OldSelection[i])) then HandleDeselection (OldSelection[i]); for i := 0 to High(NewSelection) do if (not _Contains(OldSelection, NewSelection[i])) then HandleSelection (NewSelection[i]); OldSelection := Copy(NewSelection); end; procedure TForm1.HandleSelection (const aNode: PVirtualNode); begin Memo.Lines.Add(VST.Text[aNode, -1] + ' selected'); end; procedure TForm1.HandleDeselection (const aNode: PVirtualNode); begin Memo.Lines.Add(VST.Text[aNode, -1] + ' deselected'); end; |
Re: Virtual Treeview MultiSelect/Onchange Event Problem
@ChaosBen:
- Das ^^(GetFirstSelected...GetNextSelected)^^ weiß ich auch, dachte bzw. war ich der Meinung das es ein Event geben muss, wenn sich die "Selektierung" eines Nodes ändert. Falls man mit Checkboxen im Virtual Tree arbeitet, gibt es auch die Events OnChecked und OnChecking. Deshalb bin ich fest davon ausgegangen das es auch die Events OnSelect und OnSelecting gibt/gäbe. Naja, ich mache es jetzt so das ich mir in einer Liste merke welche Nodes gerade selektiert sind und tritt des OnChange Event ein, vergleiche ich den aktuellen Selected Count mit meinerListe.Count. Ist MeineListe.count größer, gehe ich meine Liste durch passe die Dokumentstellen die zu den Nodes gehören im Dokument an. Das funktioniert, ist aber nicht "so schön". Klar könnte ich den Virtual Treeview auch um die gesuchten Events erweitern, aber dann müßte ich nach jedem Update des VT meine Events wieder manuell hinzufügen, das möchte ich eigentlich nicht unbedingt. Greetz Data |
Re: Virtual Treeview MultiSelect/Onchange Event Problem
@Hawkeye:
So ungefähr habe ich ees jetzt gemacht, allerdings ist Deiner Variante mit VST.GetSortedSelection eleganter, das kann ich auch an anderer Stelle verwenden, danke. Aber sollte der VT das Event/die Events nicht mitbringen, wenn er schon dasselbe für den CherckboxStatus hat ? Greetz Data |
Re: Virtual Treeview MultiSelect/Onchange Event Problem
Überschreibe einfach folgende zwei Methoden:
Delphi-Quellcode:
Gruß
function InternalAddToSelection(const NewItems: TNodeArray; NewLength: Integer; ForceInsert: Boolean): Boolean; overload;
procedure InternalClearSelection; virtual; |
Re: Virtual Treeview MultiSelect/Onchange Event Problem
@Colt:
Wie schon gesagt, sicher ist das möglich, aber den Virtual Treeview wollte ich nicht anpassen. Greetz Data |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:11 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 by Thomas Breitkreuz