¿Cómo se convierte el valor ARGB de cadena en color?
Pregunta
Estoy tratando de utilizar el método MakeColor
en la unidad GDIPAPI pero la conversión de int
a byte
no me devuelve el valor correcto.
Ejemplo
var
argbStr: string;
A, R, G, B: Byte;
begin
argbStr := 'ffffcc88';
A := StrToInt('$' + Copy(AValue, 1, 2));
R := StrToInt('$' + Copy(AValue, 3, 2));
G := StrToInt('$' + Copy(AValue, 5, 2));
B := StrToInt('$' + Copy(AValue, 7, 2));
Result := MakeColor(A, R, G, B);
end;
¿Qué estoy haciendo mal?
Solución
Los componentes de color en la cadena están en el mismo orden que tendrían en un valor ARGB
. Por lo tanto, no es necesario separar los componentes antes de combinarlos con MakeColor
. Se puede hacer la conversión directa:
function StringToARGB(const argbStr: string): GDIPAPI.ARGB;
begin
Result := ARGB(StrToInt('$' + argbStr));
end;
Es necesario el tipo de fundición para suprimir un error de rango de comprobación se obtendría siempre que el componente alfa fue superior a 127; StrToInt
devuelve un entero firmado, pero ARGB
es un tipo sin signo.
Otros consejos
Cambiar el tipo de A, R, G, B
a ser un número entero parecía solucionar el problema. Debe ser algo que ver con el casting entre Entero -.> Byte