- Код: Выделить всё
procedure RedGreenBlue(rgb: TColor; out Red, Green, Blue: Byte);
begin
Red := rgb and $000000ff; //Красный на последнем месте
Green := (rgb shr 8) and $000000ff;
Blue := (rgb shr 16) and $000000ff;
end;
По этому нужно переделать процедуру ColorToRGB вот так:
- Код: Выделить всё
function ColorToRGB(Color: TColor): TColor;
begin
//if (Cardinal(Color) and Cardinal(SYS_COLOR_BASE)) <> 0
//then Result := GetSysColor(SysColorToSysColorIndex(Color))
//else Result := Color;
//Result := Result and $FFFFFF;
Result:= ((Color and $0000FF) shl 16) or (Color and $00FF00) or ((Color and $FF0000) shr 16);
end;
Тогда код типа:
- Код: Выделить всё
Caption:=ColorToString(ColorToRGB((clRed)));
вернет правильно синий цвет, да потому что clRed = TColor($0000FF); а в RGB это и есть синий или я что то не понимаю??
Если так то я нашел багу.. при переписывании кода данной функции увидел что на ней много завязано и походу нужно переписывать и обратную ей функцию... потому что вылезли неприятности с цветами во всем Лазарусе.. включая редактор кода. Но ведь зато выше указанный код дает верный результат..
Или я всетаки все перепутал и ничего не понял?? Возможно данная функция ColorToRGB не играет роль перевода BGR в RGB формат?
Полюбому одно из двух Бага или Моя Ошибка.
Заранее СПАСИБО.