Delphi-PRAXiS
Seite 1 von 2  1 2      

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/)
-   -   Delphi Virtual Treeview MultiSelect/Onchange Event Problem (https://www.delphipraxis.net/136601-virtual-treeview-multiselect-onchange-event-problem.html)

DataCool 3. Jul 2009 14:13


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:
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;
Das ganze funktioniert auch "wunderbar" das Event tritt immer ein wenn ein Node markiert wird.
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

chaosben 3. Jul 2009 16:52

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.

generic 3. Jul 2009 18:28

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.

DataCool 5. Jul 2009 20:41

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

chaosben 6. Jul 2009 05:20

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.

Hawkeye219 6. Jul 2009 09:24

Re: Virtual Treeview MultiSelect/Onchange Event Problem
 
Hallo DataCool,

hier ist ein Vorschlag zur Lösung deines Problems:

Delphi-Quellcode:
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;
Gruß Hawkeye

DataCool 6. Jul 2009 09:29

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

DataCool 6. Jul 2009 09:31

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

CoLT 6. Jul 2009 09:38

Re: Virtual Treeview MultiSelect/Onchange Event Problem
 
Überschreibe einfach folgende zwei Methoden:

Delphi-Quellcode:
function InternalAddToSelection(const NewItems: TNodeArray; NewLength: Integer; ForceInsert: Boolean): Boolean; overload;
procedure InternalClearSelection; virtual;
Gruß

DataCool 6. Jul 2009 09:49

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 12:08 Uhr.
Seite 1 von 2  1 2      

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