Einzelnen Beitrag anzeigen

Volker Z.

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

AW: Treeview selected Node einfärben

  Alt 5. Feb 2014, 23: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