2011-10-04 17 views
7

Estoy utilizando Delphi 2010 y si creo una nueva aplicación VCL, coloque un TPanel en el formulario y establezca su propiedad "color" en "clInactiveCaptionText", que muestra el color correcto.¿Por qué la propiedad de color de TPanel muestra un color incorrecto cuando se usa un valor de color hexadecimal?

de color correcta:

enter image description here

Sin embargo, si entro en el valor hexadecimal para este color ($ 00434E54 --- R 67, G 78, B 84) se muestra de manera incorrecta. Debo señalar que el resultado es el mismo ya sea que habilite temas de tiempo de ejecución o no.

de color incorrecto:

enter image description here

Alguna idea de por qué no se mostrará correctamente este color cuando se especifica su valor hexadecimal?

Respuesta

19

Los valores de color RGB se especifican realmente como BGR.

Así que si quieres:

  • rojo se necesita especificar $ 000000FF
  • verde es necesario especificar $ 0000FF00
  • azul necesita especificar $ 00FF0000
+1

Gracias! Siguiendo sus instrucciones, cambié el color a $ 00544E43 y funciona como debería. – Mick

7

Esto es porque está configurando un valor TColor en formato RGB, debe usar BGR en su lugar.

16

Como otros han indicado, los valores RGB se almacenan internamente como BGR (es decir TColor valor, o lo que Windows llama a un COLORREF), por eso cuando se especifica un código de color a medida que obtenga un color diferente.

Para mantener la cordura al especificar colores en formato RGB, puede usar la función RGB() de la unidad de Windows; este acepta parámetros en el orden "natural"/intuitiva RGB (como valores de bytes) y produce un apropiado valor TColor/COLORREF:

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

o si hex es más fácil:

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

+1 por la observación de cordura. Recuerdo haberme vuelto loco cuando me encontré con esto por primera vez. –

0

realidad TColor es RGBA formato de color y también $FF000000 es el canal alfa modo:

  • Para obtener Chanel de color rojo se puede obtener $ 000000FF
  • Para obtener Chanel verde se puede obtener $ 0000FF00
  • Para obtener bluechanel puede obtener $ 00FF0000
  • Para obtener Chanel Alpha Channel puede obtener $ FF000000

y fácilmente se puede convertir el valor TColor al rgb por:

IntToHex(ColorPanel1.Color,1) 

esto también funciona en multiplataforma FMX delphi aplicaciones.

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; 

Con esta función simple que puede hacer más fácil:

Panel1.Color := HexToColor ('16a086'); 
Cuestiones relacionadas