AGB  ·  Datenschutz  ·  Impressum  







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

TTreeView.CustomDraw

Offene Frage von "Uwe Raabe"
Ein Thema von swestner · begonnen am 21. Apr 2022 · letzter Beitrag vom 22. Apr 2022
Antwort Antwort
Seite 1 von 2  1 2      
swestner

Registriert seit: 31. Aug 2012
Ort: Hallstadt
78 Beiträge
 
Delphi 10.4 Sydney
 
#1

TTreeView.CustomDraw

  Alt 21. Apr 2022, 16:23
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
Miniaturansicht angehängter Grafiken
treeview.png  
Stefan Westner
  Mit Zitat antworten Zitat
Borni

Registriert seit: 16. Aug 2004
Ort: Algermissen
89 Beiträge
 
Delphi 12 Athens
 
#2

AW: TTreeView.CustomDraw

  Alt 21. Apr 2022, 22:28
schau dir mal den VirtualTreeView an, da kann man wesentlich mehr mit machen, ist auch wesentlicher schneller !!!
  Mit Zitat antworten Zitat
swestner

Registriert seit: 31. Aug 2012
Ort: Hallstadt
78 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: TTreeView.CustomDraw

  Alt 21. Apr 2022, 22:31
Danke für den Tip, aber ich benötige eine Info zum OwnerDraw und keine neue Komponente. Vielleicht kann mir da jemand weiterhelfen.
Stefan Westner
  Mit Zitat antworten Zitat
LoZe

Registriert seit: 27. Dez 2016
Ort: Ulm
40 Beiträge
 
Delphi 12 Athens
 
#4

AW: TTreeView.CustomDraw

  Alt 22. Apr 2022, 06:34
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 = '1then
    begin
        Brush.Color:= clRed;
        FillRect(Box);
    end;
    if Txt = '2then
    begin
        Brush.Color:= clLime;
        FillRect(Box);
    end;
  end;
end;
Chris

Geändert von LoZe (22. Apr 2022 um 06:41 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#5

AW: TTreeView.CustomDraw

  Alt 22. Apr 2022, 06:51
Moin...
Zitat:
with Tree.Canvas do
... aber bitte ohne das WITH.
  Mit Zitat antworten Zitat
swestner

Registriert seit: 31. Aug 2012
Ort: Hallstadt
78 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: TTreeView.CustomDraw

  Alt 22. Apr 2022, 08:53
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
Miniaturansicht angehängter Grafiken
image1.png   image2.png   treemitstandardfont.png  
Stefan Westner
  Mit Zitat antworten Zitat
LoZe

Registriert seit: 27. Dez 2016
Ort: Ulm
40 Beiträge
 
Delphi 12 Athens
 
#7

AW: TTreeView.CustomDraw

  Alt 22. Apr 2022, 11:42
Hast du es im OnAdvancedCustomDrawItem Ereignis drin?
Chris
  Mit Zitat antworten Zitat
LoZe

Registriert seit: 27. Dez 2016
Ort: Ulm
40 Beiträge
 
Delphi 12 Athens
 
#8

AW: TTreeView.CustomDraw

  Alt 22. Apr 2022, 11:53
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;
Miniaturansicht angehängter Grafiken
screenshot-2022-04-22-115210.jpg  
Chris
  Mit Zitat antworten Zitat
swestner

Registriert seit: 31. Aug 2012
Ort: Hallstadt
78 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: TTreeView.CustomDraw

  Alt 22. Apr 2022, 12:38
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
Miniaturansicht angehängter Grafiken
treeview.png  
Stefan Westner
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#10

AW: TTreeView.CustomDraw

  Alt 22. Apr 2022, 12:39
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  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 22:49 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