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/)
-   -   TTreeView.CustomDraw (https://www.delphipraxis.net/210418-ttreeview-customdraw.html)

swestner 21. Apr 2022 15:23

TTreeView.CustomDraw
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

kann mir jemand weiterhelfen bzw. hat ein Beispiel, wie in einem Treeview ein customdraw implementiert wird?

Konkret habe ich einen Baum, der text und Symbole anzeigt.

Abhängig vom Node.Text würde ich jetzt gerne zwischen das Symbol und den Text ein rotes oder grünes Quadrat zeichnen (siehe Screenshot).

Ich habe mir schon zieg Beispiele usw. angesehen, komme da aber nicht weiter....

Danke

Stefan

Borni 21. Apr 2022 21:28

AW: TTreeView.CustomDraw
 
schau dir mal den VirtualTreeView an, da kann man wesentlich mehr mit machen, ist auch wesentlicher schneller !!!

swestner 21. Apr 2022 21:31

AW: TTreeView.CustomDraw
 
Danke für den Tip, aber ich benötige eine Info zum OwnerDraw und keine neue Komponente. Vielleicht kann mir da jemand weiterhelfen.

LoZe 22. Apr 2022 05:34

AW: TTreeView.CustomDraw
 
Hallo, So vielleicht? (ungetestet)

Delphi-Quellcode:
procedure TForm1.TreeViewCustomDrawItem(Sender: TCustomTreeView; Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
var
  Tree:TTreeView;
  BG:TRect;
  TR:TRect;
  Box:TRect;
  txt:String;
begin
  Tree:= Sender as TTreeView;
  BG:= Node.DisplayRect(true);
  TR:= Rect(BG.Left + BG.Height + 4, BG.Top,BG.Right,BG.Bottom);
  Box:= Rect(BG.Left,bg.Top,BG.Left + BG.Height,bg.Bottom);

  Txt:= Node.Text;

  with Tree.Canvas do
  begin
    if cdsSelected in State then
    begin
      Brush.Color:= clHighlight;
      Font.Color:= clHighlightText;
    end
    else
    begin
      Brush.Color:= clWindow;
      Font.Color:= clWindowText;
    end;
    FillRect(BG);
    TextRect(TR,Txt,[tfVerticalCenter,tfSingleLine]);
   
    if Txt = '1' then
    begin
        Brush.Color:= clRed;
        FillRect(Box);
    end;
    if Txt = '2' then
    begin
        Brush.Color:= clLime;
        FillRect(Box);
    end;
  end;
end;

haentschman 22. Apr 2022 05:51

AW: TTreeView.CustomDraw
 
Moin...8-)
Zitat:

with Tree.Canvas do
... aber bitte ohne das WITH. :thumb:

swestner 22. Apr 2022 07:53

AW: TTreeView.CustomDraw
 
Liste der Anhänge anzeigen (Anzahl: 3)
Hallo,

danke für die Antwort. Folgende Probleme mit dem Beispielcode:

1. Die Schrift entspricht nicht mehr dem Standardfont
2. Das Icon wird nur angezeigt, wenn der Knoten selektiert ist
3. Das Icon wird hinter dem Texte angezeigt - ich hätte es gerne zwischen dem Text und deme rsten Symbol. Also quasi 2 Icons nebeneinander am Anfang.

Was müßte ich ändern?

Grüße

Stefan

LoZe 22. Apr 2022 10:42

AW: TTreeView.CustomDraw
 
Hast du es im OnAdvancedCustomDrawItem Ereignis drin?

LoZe 22. Apr 2022 10:53

AW: TTreeView.CustomDraw
 
Liste der Anhänge anzeigen (Anzahl: 1)
Delphi-Quellcode:
procedure TForm3.TreeView1AdvancedCustomDrawItem(Sender: TCustomTreeView; Node: TTreeNode; State: TCustomDrawState; Stage: TCustomDrawStage;
  var PaintImages, DefaultDraw: Boolean);
var
  Tree:TTreeView;
  BG:TRect;
  TR:TRect;
  Box:TRect;
  txt:String;
begin
  Tree:= Sender as TTreeView;
  BG:= Node.DisplayRect(true);
  TR:= Rect(BG.Left + BG.Height + 4, BG.Top,BG.Right,BG.Bottom);
  Box:= Rect(BG.Left,bg.Top,BG.Left + BG.Height,bg.Bottom);

  Txt:= Node.Text;

  with Tree.Canvas do
  begin
    if cdsSelected in State then
    begin
      Brush.Color:= clHighlight;
      Font.Color:= clHighlightText;
    end
    else
    begin
      Brush.Color:= clWindow;
      Font.Color:= clWindowText;
    end;
    // Nur Zeichnen wenn Eintrag Erkannt!!!
    if (pos('1',Txt) = 1) or (pos('2',Txt) = 1) then
    begin


      FillRect(BG);
      TextRect(TR,Txt,[tfVerticalCenter,tfSingleLine]);

      if pos('1',Txt) = 1 then
      begin
          Brush.Color:= clRed;
          FillRect(Box);
      end;
      if pos('2',Txt) = 1 then
      begin
          Brush.Color:= clLime;
          FillRect(Box);
      end;
    end;
  end;

end;

swestner 22. Apr 2022 11:38

AW: TTreeView.CustomDraw
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

mit obiger Routine sieht es bei mir jetzt aus wie im Screenshot.

Das rote und das grüne Quadrat liegen hinter dem Symbol aus der ImageList, der Text wird am Ende abgeschnitten und am Ende der Zeile sind rote und grüne Balken...

Stefan

Uwe Raabe 22. Apr 2022 11:39

AW: TTreeView.CustomDraw
 
Ist es denn erforderlich, dass die optionalen Grafiken zwischen Bild und Text unterschiedliche Größe haben müssen? Andernfalls könnte man vielleicht noch mit dem StateIndex des Eintrags etwas machen - ganz ohne OwnerDraw. Damit kann ein weiteres Icon angezeigt werden, allerdings nur vor dem anderen. Durch geschickte Zuordnung der Images lässt sich das aber ausgleichen (x ist der Index des normalen Icons, y der des optionalen):
  • kein zusätzliches Icon: ImageIndex =x, StateIndex := -1
  • zusätzliches Icon: StateImage=x, ImageIndex=y

Die Images müssen dann in derselben ImageList vorliegen und diese muss sowohl dem Images- als auch dem StateImage-Property des TreeView zugewiesen werden.


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