Я всегда использовал функции GetRValue
, GetGValue
и GetBValue
(из блока Winapi.Windows
) для извлечения значений RGB для TColor
.
К сожалению, тот же подход не подходит для системных цветов, таких как clWindow
, clBtnFace
и так далее.
Например:
var
MyColor : TColor;
begin
MyColor := clBtnFace;
ShowMessage(
'R = ' + IntToStr(GetRValue(MyColor)) + sLineBreak +
'G = ' + IntToStr(GetGValue(MyColor)) + sLineBreak +
'B = ' + IntToStr(GetBValue(MyColor))
);
end;
Он производит следующий вывод:
Р = 15
Г = 0
В = 0
Что должно выглядеть так:
В моей системе вместо этого я вижу следующий цвет:
Вы знали это месяц назад! :)
@AndreasRejbrand: Кажется, ты прав, каким мудрым человеком я был месяц назад! :D.... (Возможно, я скопировал это откуда-то, не зная, что ColorToRGB
"разрешает" системные цвета, моя вина!)
Использование Get(R|G|B)Value()
прекрасно работает с системными цветами, вам просто нужно сначала преобразовать их в RGB. Для этого используйте функцию ColorToRGB():
Преобразует значение TColor в представление цвета RGB.
Например:
var
MyColor: TColor;
RGB: Longint;
begin
MyColor := ...; // any valid TColor value, whether RGB or system constant...
RGB := ColorToRGB(MyColor);
ShowMessage(
'R = ' + IntToStr(GetRValue(RGB)) + sLineBreak +
'G = ' + IntToStr(GetGValue(RGB)) + sLineBreak +
'B = ' + IntToStr(GetBValue(RGB))
);
end;