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.
http://www.ideco-gmbh.de/delphi/normal.png
2. Die Zeile wurde markiert
http://www.ideco-gmbh.de/delphi/selected.png
3. Die Zeile wurde markiert, jedoch liegt der Focus nicht mehr auf der ListView Komponente
http://www.ideco-gmbh.de/delphi/selnofocus.png