Domanda

Sto provando ad utilizzare il metodo MakeColor nell'unità GDIPAPI ma la conversione da int a byte non mi sta tornando il valore corretto.

Esempio

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;

Che cosa sto facendo di sbagliato?

È stato utile?

Soluzione

I componenti di colore nella stringa sono nello stesso ordine in cui avrebbero avuto un valore ARGB. Pertanto, non è necessario separare le componenti prima combinandole con MakeColor. Si può fare direttamente la conversione:

function StringToARGB(const argbStr: string): GDIPAPI.ARGB;
begin
  Result := ARGB(StrToInt('$' + argbStr));
end;

Il tipo-cast è necessario per sopprimere un errore di gamma-checking si otterrebbe ogni volta che il componente alfa è stato superiore a 127; StrToInt restituisce un intero con segno, ma ARGB è un tipo senza segno.

Altri suggerimenti

La modifica del tipo di A, R, G, B di essere Integer sembrava per risolvere il problema. Deve essere qualcosa a che fare con la fusione tra le Integer -.> Byte

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top