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 Werte in Listview farbig passend zum Farbschema darstellen (https://www.delphipraxis.net/131400-werte-listview-farbig-passend-zum-farbschema-darstellen.html)

TUX_der_Pinguin 24. Mär 2009 11:30


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.
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

Satty67 24. Mär 2009 11:53

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;

TUX_der_Pinguin 24. Mär 2009 12:24

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 01:35 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz