AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Treeview selected Node einfärben

Ein Thema von josefkoller · begonnen am 4. Feb 2014 · letzter Beitrag vom 5. Feb 2014
Antwort Antwort
josefkoller

Registriert seit: 22. Okt 2012
49 Beiträge
 
#1

Treeview selected Node einfärben

  Alt 4. Feb 2014, 19:06
Hallo,

ehrlich gesagt, ich hab keinen blassen Schimmer, wie ich das anstellen soll.

Ich möchte den selktierten Knoten beginnend vom Hauptknoten bis zu all seinen Childknoten einfärben?

Beispiel:

root1
child1
unterchild1
unterchild2
child2
root2 \
child1 \
unterchild1 /
child2 /

wenn ich auf einen Eintrag in root2 klicke, soll root2 komplett eingefärbt
werden, damit es sich von den anderen Einträgen abhebt.

Danke

Josef
  Mit Zitat antworten Zitat
Volker Z.

Registriert seit: 3. Dez 2012
Ort: Augsburg, Bayern, Süddeutschland
419 Beiträge
 
Delphi XE4 Ultimate
 
#2

AW: Treeview selected Node einfärben

  Alt 4. Feb 2014, 21:50
Hallo,

Zitat:
Ich möchte den selktierten Knoten beginnend vom Hauptknoten bis zu all seinen Childknoten einfärben?
Ich weiß jetzt nicht, ob ich Dein Anliegen richtig verstanden habe, aber ich versuche es mal.

Zitat:
ehrlich gesagt, ich hab keinen blassen Schimmer, wie ich das anstellen soll.
Um das Selektieren mehrerer Knoten zu ermöglichen, müssen die Eigenschaften MultiSelect und MultiSelectStyle der Treeview entsprechend gesetzt werden (dadurch kann aber auch der User mehrere Konten selektieren!).
Dann noch die gewünschten Knoten selektieren, fertig; Leider geht es nicht so einfach über: Node.Selected := True; , aber ein Node.TreeView.Select (Node, [ssCtrl, ssShift]); tut es.

In Code gegossen könnte das so gehen:
1. Variante (der User hat die Möglichkeit mehrere Knoten per Maus zu selektieren):
Delphi-Quellcode:
procedure TForm3.FormCreate(Sender: TObject);
begin
  TreeView1.MultiSelect := True;
  TreeView1.MultiSelectStyle := [msControlSelect, msShiftSelect]
end;

procedure TForm3.TreeView1Change(Sender: TObject; Node: TTreeNode);

  procedure SelectAllNodes (Node : TTreeNode);
  begin
    while Assigned (Node) do
      begin
        Node.TreeView.Select (Node, [ssCtrl, ssShift]);
        SelectAllNodes (Node.getFirstChild);
        Node := Node.getNextSibling
      end
  end;

begin
  if not Assigned (Node.Parent) then
    begin
      Node.Expand (True);
      SelectAllNodes (Node.getFirstChild)
    end
end;
2. Variante (der User hat kein Möglichkeit mehrere Knoten per Maus zu selektieren, wenn ich nix übersehen habe):
Delphi-Quellcode:
procedure TForm3.FormCreate(Sender: TObject);
begin
  TreeView1.MultiSelect := True
end;

procedure TForm3.TreeView1Change(Sender: TObject; Node: TTreeNode);

  procedure SelectAllNodes (Node : TTreeNode);
  begin
    while Assigned (Node) do
      begin
        Node.TreeView.Select (Node, [ssCtrl, ssShift]);
        SelectAllNodes (Node.getFirstChild);
        Node := Node.getNextSibling
      end
  end;

begin
  if not Assigned (Node.Parent) then
    try
      TreeView1.MultiSelectStyle := [msControlSelect, msShiftSelect];
      Node.Expand (True);
      SelectAllNodes (Node.getFirstChild)
    finally
      TreeView1.MultiSelectStyle := []
    end
end;
Vielleicht hilft es weiter.

Gruß
Volker Zeller
  Mit Zitat antworten Zitat
josefkoller

Registriert seit: 22. Okt 2012
49 Beiträge
 
#3

AW: Treeview selected Node einfärben

  Alt 5. Feb 2014, 10:06
Hallo,

danke für die Antwort.

Blöd, ich dachte mit "einfärben" würde man sehen was ich will.

Die einträge sollen schon einzeln selktierbar sein, denn mit einem Klick auf einen Eintrag werden wird der entsprechende Datensatz in der Datenbank gesucht, damit man ihn editieren kann. Ganz kurz gesagt.

Was ich möchte, ist, daß vom root Knoten beginnend (mit alle seinen Unterknoten und Einträgen),
also bis zum nächsten root Knoten alle Einträge eingefärbt werden, beispielsweise ein helles rot oder so, damit das Auge einen Halt hat und auch die Zusammenhänge in dem gewählten Root Knoten besser sieht.

Oder ein roter Rahmen um das Ganze.

Beim Wechsel auf einen anderen root-eintrag, wird der vorige wieder auf seine normale Farbe zurückgesetzt und eben der gewählte wieder entweder eingefärbt oder ein Rahmen drumgesetzt.

Nochmal als Beispiel:

root1
child1
unterchild1
unterchild2
child2
_______________
root2
child1
unterchild1
child2
________________

Wenn was in root2 selektiert wird, einfach alles von root2 rot einfärben

Jetzt besser zu verstehen?

Danke

Josef
  Mit Zitat antworten Zitat
Volker Z.

Registriert seit: 3. Dez 2012
Ort: Augsburg, Bayern, Süddeutschland
419 Beiträge
 
Delphi XE4 Ultimate
 
#4

AW: Treeview selected Node einfärben

  Alt 5. Feb 2014, 22:29
Hallo,

Zitat:
Was ich möchte, ist, [...]
Ok, dann habe ich da wohl etwas missverstanden.

Zitat:
daß vom root Knoten beginnend (mit alle seinen Unterknoten und Einträgen), also bis zum nächsten root Knoten alle Einträge eingefärbt werden, beispielsweise ein helles rot oder so, damit das Auge einen Halt hat und auch die Zusammenhänge in dem gewählten Root Knoten besser sieht.
Mit anderen Worten: Ab dem Wurzelknoten sollen alle expandierten Kindknoten farblich hinterlegt werden. Das heißt doch nur: Ab dem Wurzelknoten den Bereich (TRect) bestimmen, der auch den letzten Kindknoten abdeckt und dann den Bereich mit der entsprechenden Farbe füllen.

Vielleicht hilft Dir folgender Code weiter:
Delphi-Quellcode:
type
  TForm1 = class(TForm)
    TreeView1: TTreeView;
    procedure TreeView1AdvancedCustomDrawItem(Sender: TCustomTreeView; Node: TTreeNode; State: TCustomDrawState; Stage: TCustomDrawStage; var PaintImages, DefaultDraw: Boolean);
    procedure TreeView1AdvancedCustomDraw(Sender: TCustomTreeView; const ARect: TRect; Stage: TCustomDrawStage; var DefaultDraw: Boolean);
    procedure TreeView1Change(Sender: TObject; Node: TTreeNode);
    procedure TreeView1Collapsed(Sender: TObject; Node: TTreeNode);
    procedure TreeView1Expanded(Sender: TObject; Node: TTreeNode);
  private
    { Private-Deklarationen }
    FCurrentRoot : TTreeNode;
    procedure InvalidateTreeview;
  public
    { Public-Deklarationen }
  end;

procedure GetRectBottom (Node : TTreeNode; var Rect : TRect);
begin
  while Assigned (Node) do
    begin
      Rect.Bottom := Node.DisplayRect (False).Bottom;
      if Node.Expanded then
        GetRectBottom (Node.getFirstChild, Rect);

      Node := Node.getNextSibling
    end
end;

function GetRootNode (const Node : TTreeNode) : TTreeNode;
begin
  Result := nil;
  if Assigned (Node) then
    if not Assigned (Node.Parent) then
      Result := Node
    else
      Result := GetRootNode (Node.Parent)
end;

procedure TForm1.TreeView1AdvancedCustomDraw(Sender: TCustomTreeView; const ARect: TRect; Stage: TCustomDrawStage; var DefaultDraw: Boolean);
var
  r : TRect;
begin
  if Assigned (FCurrentRoot) and (Stage = cdPrePaint) then
    begin
      r := FCurrentRoot.DisplayRect (False);
      r.Bottom := 0;

      GetRectBottom (FCurrentRoot.getFirstChild, r);
      if r.Bottom > 0 then
        begin
          TreeView1.Canvas.Brush.Color := clInfoBk;
          TreeView1.Canvas.FillRect (r)
        end
    end
end;

procedure TForm1.TreeView1AdvancedCustomDrawItem(Sender: TCustomTreeView; Node: TTreeNode; State: TCustomDrawState; Stage: TCustomDrawStage; var PaintImages, DefaultDraw: Boolean);
begin
  if Stage = cdPrePaint then
    if not Assigned (FCurrentRoot) or (FCurrentRoot <> GetRootNode (Node)) then
      TreeView1.Canvas.Brush.Color := TreeView1.Color
    else
      TreeView1.Canvas.Brush.Color := clInfoBk
end;

procedure TForm1.TreeView1Change(Sender: TObject; Node: TTreeNode);
begin
  InvalidateTreeview;
  if Assigned (Node.Parent) then
    FCurrentRoot := GetRootNode (Node)
  else
    FCurrentRoot := Node
end;

procedure TForm1.TreeView1Collapsed(Sender: TObject; Node: TTreeNode);
var
  n : TTreeNode;
begin
  n := FCurrentRoot;
  InvalidateTreeview;
  FCurrentRoot := n
end;

procedure TForm1.TreeView1Expanded(Sender: TObject; Node: TTreeNode);
var
  n : TTreeNode;
begin
  n := FCurrentRoot;
  InvalidateTreeview;
  FCurrentRoot := n
end;

procedure TForm1.InvalidateTreeview;
begin
  FCurrentRoot := nil;
  TreeView1.Invalidate
end;
Gruß
Volker Zeller
  Mit Zitat antworten Zitat
Antwort Antwort


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 08:24 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