![]() |
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:
mfG Richard
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; |
Re: Virtual Tree View textfarbe einzelner Rows ändern?
Wenn Du nur die Textfarbe ändern willst, nimmst Du am Besten PaintText():
Delphi-Quellcode:
Mal so als Beispiel. :)
Case Column of
0: TargetCanvas.Font.Color := clBlack; 1: TargetCanvas.Font.Color := clBlue; 2: TargetCanvas.Font.Color := clRed; else end; |
Re: Virtual Tree View textfarbe einzelner Rows ändern?
Hallo Richard,
du hast ein Ereignis vergessen: OnAfterItemErase:
Delphi-Quellcode:
Der Code färbt die Zeilen des Baums abwechselnd rot und gelb - abhängig vom Knotenindex. Selektierte Zeilen erhalten keine spezielle Färbung.
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; //Edit: Ok, es ging um die Textfarbe. Wer lesen kann... Gruß Hawkeye |
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: |
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 |
Re: Virtual Tree View textfarbe einzelner Rows ändern?
Zitat:
Hat aber R. schon geschrieben. Was hindert/stört dich an dem Ereignis? Deine Meinung können wir bestimmt weg diskutieren. |
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; |
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; |
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. |
Re: Virtual Tree View textfarbe einzelner Rows ändern?
Zitat:
Mein Beispiel hätte nur paar Sachen doppelt implementieren müssen. (Die Gesamtsumme für OnCompareNodes und onGetText) Zitat:
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. |
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