![]() |
Werte in Listview farbig passend zum Farbschema darstellen
Ich habe eine ListView Komponente (VirtualTreeView), hier sollen einige Werte farbig dargestellt werden,
grün für Werte die I.O. sind und rot für Werte die nicht I.O. sind. Jetzt habe ich jedoch ein Problem sind die Werte grün und das Standard XP Farbschema (Blau) ist aktiv und die Zeile wird markiert so kann man die Werte kaum noch erkennen, weil das Blau und das Grün sich vermischt. Das einfärben passiert in den OnPaintText Event von VirtualTreeView. Soweit klappt auch alles, die Werte die keine "Sollwerte" enthalten werden entsprechend normal mit clWindowText oder clHighlightText eingefärbt.
Delphi-Quellcode:
procedure TfrmCertificate.ltvDataPaintText(Sender: TBaseVirtualTree;
const TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType); begin with TargetCanvas do begin //init Font.Color := clWindowText; Font.Style := []; //Wird die Zeile markiert so muß die Textfarbe geändert werden if (Node = ltvData.FocusedNode) then begin //Markierte Zeile mit Focus auf ListView if (vsSelected in Node.States) then Font.Color := clHighlightText; //Markierte Zeile ohne Focus auf Listview if (vsSelected in Node.States) and not ltvData.Focused then Font.Color := clWindowText; end;{if} //Textfarbe anpassen wenn es sich um ein "Werte Feld" handelt if glParamsCert.Install.Table[Column].FieldType = FIELD_TYPE_NUM_SET then begin //Farbe anhand der Sollwerte bestimmen (fGetColor() gibt clWindowText, clGreen oder clRed zurück) Font.Color := fGetColor(CertFile.Data.Rows[Node.Index].Fields, glParamsCert.Install.Table[Column].MinKey, glParamsCert.Install.Table[Column].MaxKey, glParamsCert.Install.Table[Column].Key); //Handelt es sich bei der Farbe nicht um die Standardtextfarbe so wird der Text Fett gezeichnet if Font.Color <> clWindowText then Font.Style := [fsBold]; //Handelt es sich bei der Farbe um die Standardtextfarbe so wird der Text entsprechend des Status eingefärbt if (Font.Color = clWindowText) and (Node = ltvData.FocusedNode) and (vsSelected in Node.States) then begin if not ltvData.Focused then Font.Color := clWindowText else Font.Color := clHighlightText; end;{if} end;{if Sollwert} end;{with} end; Das "einfachste" wäre das fGetColor je nach Farbschema entsprechende Farben zurück gibt, nur wie ich kann ja schlecht abfragen, wie sieht die Farbe für eine markierte Zeile aus und gebe dann entsprechendes zurück. Zum besseren Verständnis, hier einfach mal 3 Screenshots wie sich das Programm zur Zeit verhält. 1. Die Zeile ist nicht markiert. ![]() 2. Die Zeile wurde markiert ![]() 3. Die Zeile wurde markiert, jedoch liegt der Focus nicht mehr auf der ListView Komponente ![]() |
Re: Werte in Listview farbig passend zum Farbschema darstell
Da gibt es sicher irgendwo eine Formel, womit man berechnen kann, ob clHighlight eher hell oder dunkel ist und entsprechend clGreen bzw. clLime nehmen. (Ein kleiner Versuch meinerseits scheiterte aber eben, weil hohe RBG Einzelwerte nicht automatisch eine hellere Farbe ergeben, aber immerhin annähernd).
Alternativ einfach die Farbe des Balkens in dem Feld auf Grün oder Rot und den Text weiß lassen. keine Ahnung ob das dann gut aussieht. *** Ist vielleicht kein guter Vorschlag, aber evtl. die Logik des Ablaufes ändern. Deine Felder kennen ja 3 Zustände: normal, rot & grün. Das vielleicht zuerst ermitteln und dann erst state abfragen.
Delphi-Quellcode:
if vsSelected in State then begin
case normal: gruen: rot: end; end else begin case normal: gruen: rot: end; end; |
Re: Werte in Listview farbig passend zum Farbschema darstell
Naja die Logik des Ablaufs ist sicherlich nicht die beste, es funktioniert jedoch. Daher habe ich das bisher nicht
verbessert und der Abschnitt ist schon etwas älter, mir war das nur jetzt erst bewußt aufgefallen das das nicht so toll aussieht, vorallem wenn nur eine Zeile im ListView steht. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:34 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