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?

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top