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/)
-   -   Delphi Virtual Tree View textfarbe einzelner Rows ändern? (https://www.delphipraxis.net/105297-virtual-tree-view-textfarbe-einzelner-rows-aendern.html)

richard_boderich 19. Dez 2007 12:36


Virtual Tree View textfarbe einzelner Rows ändern?
 
Hallo

Ich wurde gerne die Textfarbe von bestimmten Row's im Virtual Tree View ändern? Kann mir jemand sagen wie ich das am besten(performant) mache und welche
Ereignisse ich nutzten sollte. Folgende Ereignisse kämen dafür eventuell in Frage, aber welches nehmen?

Delphi-Quellcode:
procedure TForm1.VstPaintText(Sender: TBaseVirtualTree;
  const TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
  TextType: TVSTTextType);
begin

end;

procedure TForm1.VstNewText(Sender: TBaseVirtualTree; Node: PVirtualNode;
  Column: TColumnIndex; NewText: WideString);
begin

end;

procedure TForm1.VstBeforeItemPaint(Sender: TBaseVirtualTree;
  TargetCanvas: TCanvas; Node: PVirtualNode; ItemRect: TRect;
  var CustomDraw: Boolean);
begin

end;

procedure TForm1.VstBeforeCellPaint(Sender: TBaseVirtualTree;
  TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
  CellRect: TRect);
begin

end;
mfG Richard

Rakshasa 19. Dez 2007 13:02

Re: Virtual Tree View textfarbe einzelner Rows ändern?
 
Wenn Du nur die Textfarbe ändern willst, nimmst Du am Besten PaintText():

Delphi-Quellcode:
 Case Column of
  0: TargetCanvas.Font.Color := clBlack;
  1: TargetCanvas.Font.Color := clBlue;
  2: TargetCanvas.Font.Color := clRed;
  else
 end;
Mal so als Beispiel. :)

Hawkeye219 19. Dez 2007 13:03

Re: Virtual Tree View textfarbe einzelner Rows ändern?
 
Hallo Richard,

du hast ein Ereignis vergessen: OnAfterItemErase:

Delphi-Quellcode:
procedure TForm1.VstAfterItemErase(Sender: TBaseVirtualTree;
  TargetCanvas: TCanvas; Node: PVirtualNode; ItemRect: TRect);
begin        
  if Sender.Selected[Node] then
    Exit;

  if Odd(Node.Index)
    then TargetCanvas.Brush.Color := clRed
    else TargetCanvas.Brush.Color := clYellow;

  TargetCanvas.FillRect (ItemRect);
end;
Der Code färbt die Zeilen des Baums abwechselnd rot und gelb - abhängig vom Knotenindex. Selektierte Zeilen erhalten keine spezielle Färbung.

//Edit: Ok, es ging um die Textfarbe. Wer lesen kann...

Gruß Hawkeye

gmc616 19. Dez 2007 13:08

Re: Virtual Tree View textfarbe einzelner Rows ändern?
 
Mal ist Blaue geraten ...

BeforeItemPaint wird gefeuert wenn, das ganze Item, also eine Zeile gezeichnet wird und
BeforeCellPaint für jede einzelne Zelle bzw. Spalte.

Wenn du nur eine Zeile, also ein Item "einfärben" willst würde ich dir zu BeforeItemPaint raten.
Für einzelne Zellen bzw. Spalten hängst du dich in BeforeCellPaint rein.

Will mal hoffen, dass ich hier einen Mist erzähle, aber so viel anders als in nem TListview wird das nicht sein.

Nun hast du die Wahl :wink:

richard_boderich 19. Dez 2007 13:33

Re: Virtual Tree View textfarbe einzelner Rows ändern?
 
@All

Also Painttext scheint nicht geeignet. Bei Onbeforeitempaint habe ich zwar Zugriff auf die Eigenschaft Font.color der Canvas, jedoch will ich das
Item ja in Abhängigkeit von dem Celltext einfärben.

Also sowas in der Art.

Wenn Celltext von Column 3 des aktuellen Items = "test", dann canvas.font.color:=clred;

mfG Richard

generic 19. Dez 2007 13:44

Re: Virtual Tree View textfarbe einzelner Rows ändern?
 
Zitat:

Ich wurde gerne die Textfarbe von bestimmten Row's im Virtual Tree View ändern?
onPaintText ist am besten geeignet.
Hat aber R. schon geschrieben.

Was hindert/stört dich an dem Ereignis?
Deine Meinung können wir bestimmt weg diskutieren.

Gollum 19. Dez 2007 13:46

Re: Virtual Tree View textfarbe einzelner Rows ändern?
 
Hallo,

das Ereigniss, dass Du suchst ist OnPaintText. Folgend ein Beispiel, wie es funktionieren könnte. Leider ist aus Deinem Post nicht ersichtlich, wie Du die Daten im Tree speicherst.

Delphi-Quellcode:
procedure TForm1.vtListePaintText(Sender: TBaseVirtualTree;
  const TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
  TextType: TVSTTextType);
var d:PMyNodeData;
begin
  if (Node=nil) then Exit;
  d:=Sender.GetNodeData(Node);
  with TargetCanvas do
  begin
    if (Column=3) then if (d^.MeinText='test') then Font.Color:=clRed;
  end; // with TargetCanvas
end;

richard_boderich 19. Dez 2007 14:06

Re: Virtual Tree View textfarbe einzelner Rows ändern?
 
@Gollum & generic

Also ich verwende zurzeit noch Records (@generic Asche auf mein Haupt ;))
Ich habe den Code von Gollum jetz so angepasst. Problem ist, das es die Zeile nicht färbt.

Delphi-Quellcode:
procedure TForm1.VstPaintText(Sender: TBaseVirtualTree;
  const TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
  TextType: TVSTTextType);
var d: PRMeineDaten;
  begin
  d:=Sender.GetNodeData(Node);
  with TargetCanvas do
  begin
    if (Column=3) then if (d^.Hidden='test') then Font.Color:=clRed;
  end; // with TargetCanvas

end;

Gollum 19. Dez 2007 14:13

Re: Virtual Tree View textfarbe einzelner Rows ändern?
 
Hallo,

seltsam, bei mir funktioniert es so, wie im obigen Thread beschrieben. Damit werden auch keine Zeilen eingefärbt, sondern nur der Text in der Spalte. Bist Du auch sicher, dass in der entsprechenden Spalte auch der erwartete Text drinsteht? Abgesehen davon, ist die 3. Spalte intern die 2te, da die Zählerei ja bei 0 beginnt.

generic 19. Dez 2007 14:18

Re: Virtual Tree View textfarbe einzelner Rows ändern?
 
Zitat:

Zitat von richard_boderich
Also ich verwende zurzeit noch Records

Ist doch nicht schlecht. In den meinsten Fällen reicht das auch.
Mein Beispiel hätte nur paar Sachen doppelt implementieren müssen.
(Die Gesamtsumme für OnCompareNodes und onGetText)

Zitat:

Zitat von richard_boderich
Delphi-Quellcode:
procedure TForm1.VstPaintText(Sender: TBaseVirtualTree;
  const TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
  TextType: TVSTTextType);
var d: PRMeineDaten;
begin
  d:=Sender.GetNodeData(Node);
  with TargetCanvas do
  begin
    if (Column=3) then if (d^.Hidden='test') then Font.Color:=clRed;
  end; // with TargetCanvas
end;

Das sieht richtig aus.

Ich meine dein Vergleich geht nicht richtig.
Dran gedacht das Column's bei 0 anfangen zu zählen?
4. Column muss nicht Wert 3 sein.
Wenn du die Reihenfolge in der IDE verändert hast, kann das ein andere Wert sein.
(Position)

[edit]
es wird [wenn] auch nur der text der 4. Cell eingefärbt!


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:08 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz