TRectangle, TEdit... 등등 TBrush나 기타 TAlphaColor를 프로퍼티로 갖는 객체의 색상 값은 일반적으로 BGR코드를 사용합니다.
일종의 RGB 컬러와 같이 적색, 녹색, 청색의 조합으로 색을 표현하는 방식입니다.
쉽게 풀이하자면 RGB의 색상 배치를 프로그램이나 그 색상을 처리하는 코드의 처리 순서에 맞게 변경한 것으로 델파이는 BGR, 즉 청색, 녹색, 적색 순서로 색상을 입력받습니다.
RGB계열 컬러에 대한 색상표는 이곳을 참고하세요.
http://zapmap.com/colors/bgr.html
델파이는 RGB코드가 아닌 BGR코드를 사용하며 #RRGGBB가 아닌 $LLBBGGRR형식을 따릅니다.
기존에 웹이나 포토샵을 많이 다루던 분들은 생소한 포맷이나 기존의 RGB에 HSL의 Lightness 가 추가된 형태라 생각하시면 쉽게 이해하실 수 있으실 겁니다.
LL의 두 자리를 활용하여 해당 색상의 밝기를 조절함으로써 색의 밝기도 같이 표현하죠.
하지만 안그래도 더 복잡해진 코드, 정해진 색상표는 없을까요?
델파이는 이러한 고민을 위해 사전에 색상을 정의하고, 이 색상의 느낌에 맞는 이름을 부여하고, 이를 const 상수화 했습니다.
이 상수화된 색상에는 밝기 부분이 정의되있지 않은 가장 밝은 색에 가까운 색상들입니다.
예를들어 핏빛색에 가까운 claCrimson 을 사용한다면, 델파이의 코드는 이렇게 동작하죠.
Alpha = TAlphaColor($FF000000);
Crimson = Alpha or TAlphaColor($DC143C);
어라? 앞에서 분명 델파이의 코드는 $LLBBGGRR이라고 했는데 6자리밖에 없다구요?
델파이의 색상은 별도로 밝기가 정의되지 않으면 밝기는 무조건 FF가 됩니다.
Alpha라는 상수를 보세요.
$FF000000 의 값으로 LL에만 FF 나머지는 00의 값을 가집니다.
이것이 Crimson으로 정의된 BGR 컬러와 or 연산이 되어 $$FFDC143C로 넘어오는 것이죠.
OR은 두 값의 비트를 비교했을 때 둘 중 하나라도 1이 있다면 해당 비트는 1이 되는 연산입니다.
그래서 FF00 0000 과 00DC 143C 를 연산한
1111 1111 0000 0000 0000 0000 0000 0000 |
0000 0000 1101 1100 0001 0100 0011 1100 |
------------------------------------------------- |
1111 1111 1101 1100 0001 0100 0011 1100 |
이 되죠.
그런데 이 편한 기능이 종종 동작하지 않을 때가 있습니다.
델파이 IDE는 언어와 프레임웍은 정말 좋지만, 다소 불안정한 면이 있어 다른 IDE에서는 부드럽게, 유연하게 동작하는 기능들이 델파이 IDE에서는 정상적으로 동작하지 않는 경우가 있습니다.
예를들어 델파이는 사용한 객체에 따라 자동으도 uses가 되지만, 이것이 사용하지 않을 때 자동으로 해제가 되지 않습니다.
점을 찍어 하위 프로시저 등을 참고하려 해도, 전혀 상관없는 다른 부분의 코드에 문제가 있으면 그 부분을 지적하는 것이 아니라 전체의 소스에서 이 기능이 동작하지 않습니다.(심지어 빌드시에도 알려주지 않습니다)
이러한 불안정한면 중에서, 사용을 하지만 프로그래머가 생성하지 않은 객체에 대한 uses는 되지 않는 것같습니다.
예를들어, TRectangle.Fill.Color 에서 프로그래머는 TRectangle을 선언했지 Color의 TAlphaColor을 선언한 것이 아닙니다.
델파이는 그렇기에 프로그래머가 전혀 사용하지 않는다고 판단하고 상수화된 색상 사용을 위해 반드시 uses 되어야 할 'System.UIConsts' 라이브러리가 자동으로 uses가 안되는 경우가 있습니다.
다른 언어의 IDE는 이런 날코딩으로 사용된 객체도 필요하면 자동으로 인클루드나 임포트가 됩니다만, 델파이 IDE는 아직 보완되어야 할 부분이겠지요.
결론은,
델파이의 색상은 $LLBBGGRR로 저장됩니다.
기본 색상코드를 단어가 사용된 상수를 사용할 수 있습니다.
상수는 cl, 또는 cla + 색상명입니다.
색상에 상수 사용 시 'E2003 Undeclared identifier' 이 발생한 경우 자신의 프레임웍에 맞는 접두사가 아니거나(cl, cla) System.UIConsts가 uses되지 않은 경우입니다.
'컴퓨터 > Delphi' 카테고리의 다른 글
[QuantumGrid] CheckBox 사용 (0) | 2018.11.30 |
---|---|
이상한 Undeclared (0) | 2017.06.16 |
[Component] Indy 에서 예외처리 하기 (0) | 2016.11.26 |
TEdit 클릭 시 내용 지워지기, 다시 나타내기 (0) | 2016.11.05 |
[FMX][Timage] 이미지 복사 (0) | 2016.09.25 |