Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Treeview selected Node einfärben (https://www.delphipraxis.net/178939-treeview-selected-node-einfaerben.html)

josefkoller 4. Feb 2014 19:06

Treeview selected Node einfärben
 
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

Volker Z. 4. Feb 2014 21:50

AW: Treeview selected Node einfärben
 
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:
Delphi-Quellcode:
Node.Selected := True;
, aber ein
Delphi-Quellcode:
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ß

josefkoller 5. Feb 2014 10:06

AW: Treeview selected Node einfärben
 
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

Volker Z. 5. Feb 2014 22:29

AW: Treeview selected Node einfärben
 
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ß


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:51 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