2011-10-04 82 views
7

我使用的是Delphi 2010,如果我創建一個新的VCL應用程序,在窗體上放置一個TPanel並將其「color」屬性設置爲「clInactiveCaptionText」,它將顯示正確的顏色。爲什麼TPanel的顏色屬性在使用十六進制顏色值時顯示錯誤的顏色?

正確的顏色:

enter image description here

然而,如果我輸入十六進制值用於該顏色($ 00434E54 --- R 67,G 78,B 84)它錯誤地顯示出來。我應該注意到,無論是否啓用運行時主題,結果都是一樣的。

錯誤色:

enter image description here

爲什麼指定其十六進制值時,它會無法正確顯示這種顏色的任何想法?

回答

19

RGB顏色值實際上被指定爲BGR。

所以,如果你想:

  • 紅色你需要指定$ 000000FF
  • 綠色則需要指定$ 0000FF00
  • 藍色則需要指定$ 00FF0000
+1

謝謝!按照您的指示,我將顏色更改爲$ 00544E43,它的工作原理應該如此。 – Mick

7

這是因爲您正在以RGB格式設置TColor值,所以您必須改用BGR。

16

正如其他人所指出的,RGB值在內部存儲爲BGR(即TColor值,或者是Windows調用一個COLORREF),這就是爲什麼當你指定自定義顏色代碼,您獲得不同的顏色。

爲了在RGB格式中指定顏色時保持您的理智,您可以使用Windows單元中的RGB()函數;此接受在 「自然」/直觀的RGB順序參數(如字節值),併產生一個適當的TColor/COLORREF值:

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

,或者如果十六進制更容易:

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

+1爲理智的評論。當我第一次遇到這個問題時,我能記得瘋了。 –

0

實際上Tcolor是RGBA顏色格式也$FF000000是alpha通道這樣:

  • 爲了讓紅色香奈兒,你可以得到$ 000000FF
  • 要獲得綠色香奈兒,你可以得到$ 0000FF00
  • 要獲得bluechanel你可以得到$ 00FF0000
  • 要獲得阿爾法香奈兒,你可以得到$ FF000000

,輕鬆地就可以轉換tcolor價值爲rgb通過:

IntToHex(ColorPanel1.Color,1) 

這也適用於跨平臺的FMX delphi應用程序。

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; 

有了這個簡單的功能,可以使簡單:

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