AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Virtual Treeview MultiSelect/Onchange Event Problem
Thema durchsuchen
Ansicht
Themen-Optionen

Virtual Treeview MultiSelect/Onchange Event Problem

Ein Thema von DataCool · begonnen am 3. Jul 2009 · letzter Beitrag vom 6. Jul 2009
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von DataCool
DataCool

Registriert seit: 10. Feb 2003
Ort: Lingen
909 Beiträge
 
Delphi 10.3 Rio
 
#1

Virtual Treeview MultiSelect/Onchange Event Problem

  Alt 3. Jul 2009, 15:13
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
Der Horizont vieler Menschen ist ein Kreis mit Radius Null, und das nennen sie ihren Standpunkt.
  Mit Zitat antworten Zitat
Benutzerbild von chaosben
chaosben

Registriert seit: 27. Apr 2005
Ort: Görlitz
1.358 Beiträge
 
Delphi XE2 Professional
 
#2

Re: Virtual Treeview MultiSelect/Onchange Event Problem

  Alt 3. Jul 2009, 17:52
Für dein Problem würde ich eher die On...Focus-Ereignisse nutzen. Das trifft die Sache imho eher.
Benjamin Schwarze
If I have seen further it is by standing on the shoulders of Giants. (Isaac Newton)
  Mit Zitat antworten Zitat
generic

Registriert seit: 24. Mär 2004
Ort: bei Hannover
2.416 Beiträge
 
Delphi XE5 Professional
 
#3

Re: Virtual Treeview MultiSelect/Onchange Event Problem

  Alt 3. Jul 2009, 19:28
es gibt noch Ereignisse welche auf *ing Enden. Changeing, Focuschanging, Selectionchanging.

Schau mal da ob was für dich dabei ist.
Coding BOTT - Video Tutorials rund um das Programmieren - https://www.youtube.com/@codingbott
  Mit Zitat antworten Zitat
Benutzerbild von DataCool
DataCool

Registriert seit: 10. Feb 2003
Ort: Lingen
909 Beiträge
 
Delphi 10.3 Rio
 
#4

Re: Virtual Treeview MultiSelect/Onchange Event Problem

  Alt 5. Jul 2009, 21:41
@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
Der Horizont vieler Menschen ist ein Kreis mit Radius Null, und das nennen sie ihren Standpunkt.
  Mit Zitat antworten Zitat
Benutzerbild von chaosben
chaosben

Registriert seit: 27. Apr 2005
Ort: Görlitz
1.358 Beiträge
 
Delphi XE2 Professional
 
#5

Re: Virtual Treeview MultiSelect/Onchange Event Problem

  Alt 6. Jul 2009, 06:20
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.
Benjamin Schwarze
If I have seen further it is by standing on the shoulders of Giants. (Isaac Newton)
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#6

Re: Virtual Treeview MultiSelect/Onchange Event Problem

  Alt 6. Jul 2009, 10:24
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
  Mit Zitat antworten Zitat
Benutzerbild von DataCool
DataCool

Registriert seit: 10. Feb 2003
Ort: Lingen
909 Beiträge
 
Delphi 10.3 Rio
 
#7

Re: Virtual Treeview MultiSelect/Onchange Event Problem

  Alt 6. Jul 2009, 10:29
@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
Der Horizont vieler Menschen ist ein Kreis mit Radius Null, und das nennen sie ihren Standpunkt.
  Mit Zitat antworten Zitat
Benutzerbild von DataCool
DataCool

Registriert seit: 10. Feb 2003
Ort: Lingen
909 Beiträge
 
Delphi 10.3 Rio
 
#8

Re: Virtual Treeview MultiSelect/Onchange Event Problem

  Alt 6. Jul 2009, 10:31
@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
Der Horizont vieler Menschen ist ein Kreis mit Radius Null, und das nennen sie ihren Standpunkt.
  Mit Zitat antworten Zitat
CoLT

Registriert seit: 10. Nov 2005
Ort: Remscheid
9 Beiträge
 
Delphi 10.1 Berlin Professional
 
#9

Re: Virtual Treeview MultiSelect/Onchange Event Problem

  Alt 6. Jul 2009, 10:38
Überschreibe einfach folgende zwei Methoden:

Delphi-Quellcode:
function InternalAddToSelection(const NewItems: TNodeArray; NewLength: Integer; ForceInsert: Boolean): Boolean; overload;
procedure InternalClearSelection; virtual;
Gruß
  Mit Zitat antworten Zitat
Benutzerbild von DataCool
DataCool

Registriert seit: 10. Feb 2003
Ort: Lingen
909 Beiträge
 
Delphi 10.3 Rio
 
#10

Re: Virtual Treeview MultiSelect/Onchange Event Problem

  Alt 6. Jul 2009, 10:49
@Colt:

Wie schon gesagt, sicher ist das möglich, aber den Virtual Treeview wollte ich nicht anpassen.

Greetz Data
Der Horizont vieler Menschen ist ein Kreis mit Radius Null, und das nennen sie ihren Standpunkt.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:37 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