2010-04-22 85 views
2

我想在GDIPAPI單元中使用MakeColor方法,但從intbyte的轉換沒有返回正確的值。如何將ARGB值從字符串轉換爲彩色?

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; 

我在做什麼錯?

+1

兩件事。首先,你的結果類型應該是什麼?其次,不應該把第一個Copy調用說成1,而不是0,作爲第一個參數? – 2010-04-22 14:06:34

+0

另外,GDIAPI從哪裏來?我的Delphi 2010安裝中沒有該單元。 – 2010-04-22 14:12:16

+0

@Mason,我提到'MakeColor'方法在GDIPAPI單元中是它的一部分GDI + ...返回類型是一個TValue。 – James 2010-04-22 14:14:03

回答

3

字符串中的顏色成分與ARGB的值具有相同的順序。因此,在將它們與MakeColor組合之前,您不需要分離這些組件。您可以直接進行轉換:

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

的類型轉換是需要抑制的範圍檢查錯誤,每當alpha分量是大於127你會得到; StrToInt返回一個有符號整數,但ARGB是一個無符號類型。

+0

@Rob,更棒!如果我只有RBG,那麼呢?我只是將'ff'附加到字符串? – James 2010-04-22 14:54:59

+0

我想你的意思是寫'StrToInt',而不是'IntToStr'。 – 2010-04-22 18:42:08

+0

是的。或者,如果你想確保你可能獲得的任何顏色都是完全的,那麼這個:'Result:= AlphaMask或ARGB(StrToInt('$'+ argbStr));'' – 2010-04-22 18:56:41

0

A, R, G, B的類型更改爲Integer似乎解決了該問題。它必須與Integer - > Byte之間的投射有關。

相關問題