Delphi-PRAXiS

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!

richard_boderich 19. Dez 2007 14:34

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

Also jetz funktioniert das Färben ersteinmal. Jedoch färbt er jetzt nur die 3 Spalte. Ich habe dann mal die Abfrage auf Column entfernt. Damit färbt er jetz das ganze Item. (s. Code) Jedoch mache ich mir Gedanken, das dies eigentlich Performance Verschwendung ist, weil der Vergleich ja jetz für jeden
Paintvorgang ausgeführt wird. Ich denke mir aber, das es nicht anders geht, weil TargetCanvas Cellbasiert ist? Sprich wenn ich auf Column 3 Abfrage,
kann ich auch nur auf die Canvasfläche von Column 3 zugreifen und nicht auf die Canvas des ganzen Items???

Delphi-Quellcode:
var d: PRMeineDaten;
  begin

  d:=Sender.GetNodeData(Node);

     if (d^.Hidden='test') then targetcanvas.Font.Color:=clRed;

  end; // with TargetCanvas

//Edit Kann mir jemand sagen, warum das nicht im OnbeforeItemPaint funktioniert?
Delphi-Quellcode:
var d: PRMeineDaten;
begin
   d:=Sender.GetNodeData(Node);

     if (d^.Hidden='test') then targetcanvas.Font.Color:=clred else targetcanvas.Font.Color:=clblack;

end;
mfG Richard

generic 19. Dez 2007 17:47

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

nicht funktioniert
nach dem beforeitempaint wird intern die font color mehrfach umgesetzt für andere mal dinge.
vor dem aufruf von onpainttext wird dann noch die default farbe genommen.

schau mal in vst.paintree nach.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:57 Uhr.

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