AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Werte in Listview farbig passend zum Farbschema darstellen
Thema durchsuchen
Ansicht
Themen-Optionen

Werte in Listview farbig passend zum Farbschema darstellen

Ein Thema von TUX_der_Pinguin · begonnen am 24. Mär 2009 · letzter Beitrag vom 24. Mär 2009
Antwort Antwort
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
Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#2

Re: Werte in Listview farbig passend zum Farbschema darstell

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

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

Re: Werte in Listview farbig passend zum Farbschema darstell

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


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:20 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