2010-04-22 4 views
2

Я пытаюсь использовать метод MakeColor в модуле GDIPAPI, но преобразование с 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

Две вещи. Во-первых, каков ваш тип результата? Во-вторых, не должен ли первый вызов Копировать сказать 1, а не 0, как первый аргумент? –

+0

Кроме того, где находится GDIAPI? У меня нет этой единицы в моей установке Delphi 2010. –

+0

@Mason, я упомянул, что метод 'MakeColor' находится в модуле GDIPAPI, его часть GDI + ... Тип возврата - это TValue. – James

ответ

3

Компоненты цвета в вашей строке находятся в том же порядке, что и в значении ARGB. Поэтому вам не нужно разделить компоненты перед их объединением с MakeColor. Вы можете сделать преобразование непосредственно:

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

Тип литой необходимо подавить ошибку диапазона проверки вы получите, когда альфа-компонент был больше, чем 127; StrToInt возвращает целое число со знаком, но ARGB является неподписанным типом.

+0

@ Rob, еще лучше! А если бы у меня был только RBG? Я бы просто добавил 'ff' в строку? – James

+0

Думаю, вы хотели написать 'StrToInt', а не' IntToStr'. –

+0

Да. Или, если вы хотите убедиться, что любой цвет, который вы можете получить, полностью, так это: «Результат: = AlphaMask или ARGB (StrToInt ('$' + argbStr)); –

0

Изменение типа A, R, G, B, чтобы быть целочисленным, казалось, исправить проблему. Это должно быть связано с литьем между Integer -> Byte.