2011-10-04 10 views
7

Używam Delphi 2010 i jeśli utworzę nową aplikację VCL, upuść TPanel na formularzu i ustaw jego właściwość "color" na "clInactiveCaptionText" pokazuje właściwy kolor.Dlaczego właściwość kolorów TPanel wyświetla niewłaściwy kolor podczas korzystania z wartości koloru szesnastkowego?

prawidłowy kolor:

enter image description here

Jeśli jednak wprowadzić wartość tego szesnastkowego koloru ($ 00434E54 --- R 67, G 78, B 84) pojawia się nieprawidłowo. Powinienem zauważyć, że wynik jest taki sam, niezależnie od tego, czy włączam motywy uruchomieniowe, czy nie.

Niewłaściwy kolor:

enter image description here

Każdy pomysł, dlaczego nie będzie poprawnie wyświetlić ten kolor przy określaniu jego wartości hex?

Odpowiedz

19

Wartości kolorów RGB są faktycznie określone jako BGR.

Więc jeśli chcesz:

  • czerwony trzeba określić $ 000000FF
  • zielono musisz określić $ 0000FF00
  • niebieski musisz określić $ 00FF0000
+1

Dziękujemy! Zgodnie z twoimi instrukcjami zmieniłem kolor na 00544E43 i działa tak, jak powinien. – Mick

7

Jest ponieważ ustawiasz wartość TColor w formacie RGB, musisz użyć BGR.

16

Jak wykazały inne wartości RGB są przechowywane wewnętrznie jako BGR (tj TColor wartości, czy co system Windows wywołuje COLORREF), dlatego gdy podasz niestandardowy kod koloru można uzyskać inny kolor.

Aby zachować czystość podczas określania kolorów w formularzu RGB, można użyć funkcji RGB() z jednostki Windows; ta przyjmuje parametry w „naturalnej”/intuicyjny celu RGB (jako wartości bajtu) i otrzymuje się odpowiedni TColor/COLORREF wartość:

MyPanel.Color := RGB(67, 78, 84); 

lub sześciokątna prościej

MyPanel.Color := RGB($43, $4E, $54); 
+1

+1 za uwagę dotyczącą zdrowia psychicznego. Pamiętam, jak wariuję, kiedy pierwszy raz to zetknąłem. –

0

Faktycznie Tcolor jest RGBA Format koloru, a także $FF000000 jest kanał alfa tak:

  • Aby dostać czerwoną chanel można dostać $ 000000FF
  • Aby dostać zielone chanel można dostać $ 0000FF00
  • Aby uzyskać bluechanel można dostać $ 00FF0000
  • Aby uzyskać alfa chanel chanel można dostać $ FF000000

i łatwo można przekonwertować wartości tcolor rgb :

IntToHex(ColorPanel1.Color,1) 

to również działa w aplikacjach delphi FMX platformy.

0
function HexToColor(sColor : string) : TColor; 
begin 
    Result := 
    RGB(
     StrToInt('$'+Copy(sColor, 1, 2)), 
     StrToInt('$'+Copy(sColor, 3, 2)), 
     StrToInt('$'+Copy(sColor, 5, 2)) 
    ) ; 
end; 

Z tej prostej funkcji można ułatwić:

Panel1.Color := HexToColor ('16a086'); 
Powiązane problemy