Einzelnen Beitrag anzeigen

TUX_der_Pinguin

Registriert seit: 1. Jun 2005
Ort: Anholt (NRW)
608 Beiträge
 
Delphi 11 Alexandria
 
#1

Werte in Listview farbig passend zum Farbschema darstellen

  Alt 24. Mär 2009, 11:30
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
  Mit Zitat antworten Zitat