2010-04-22 4 views
2

GDIPAPI 장치에서 MakeColor 메서드를 사용하려고 시도했지만 int에서 byte으로 변환하면 정확한 값이 반환되지 않습니다. 내가 잘못 뭐하는 거지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 호출이 첫 번째 인수로 0이 아닌 1을 나타내지 않아야합니까? –

+0

또한 GDIAPI는 어디에서 제공됩니까? 델파이 2010 설치시 해당 유닛이 없습니다. –

+0

@Mason,'MakeColor' 메서드가 GDIIPI 유닛에 있고 GDI +의 일부라고 언급했습니다 ... 반환 값의 타입은 TValue입니다. – James

답변

3

문자열의 색상 구성 요소는 ARGB 값의 순서와 같습니다. 따라서 구성 요소를 MakeColor과 결합하기 전에 구성 요소를 분리 할 필요가 없습니다.

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

alpha-component가 127보다 클 때마다 범위 검사 오류를 표시하지 않으려면 type-cast가 필요합니다. StrToInt은 부호있는 정수를 반환하지만 ARGB은 부호없는 유형입니다.

+0

@Rob, 더 나은! RBG 만 있다면 어떨까요? 문자열에'ff'를 추가하겠습니까? – James

+0

'IntToStr'이 아닌'StrToInt'를 쓰려고했던 것 같습니다. –

+0

예. 또는, 만약 당신이 얻고 자하는 색깔이 완전하다는 것을 확인하기를 원하면, 결과 : = AlphaMask 또는 ARGB (StrToInt ('$'+ argbStr)); –

0

A, R, G, B의 유형을 정수로 변경하면 문제가 해결 된 것으로 보입니다. 그것은 정수 -> 바이트 사이의 캐스팅과 관련이 있어야합니다.