2016-08-19 4 views
1

Я хочу преобразовать HTML-шестнадцатеричный цвет в TColor в Inno Setup Pascal Script.Преобразование HTML-цвета в цвет в TColor в Inno Setup Pascal Script

Я попытался обратить вспять функцию ColorToWebColorStr из Convert Inno Setup Pascal Script TColor to HTML hex colour, но мне может понадобиться функция, как RGBToColor, чтобы получить результат как TColor.

ПРИМЕР

Преобразование #497AC2 HTML Hex Цвет должен быть возвращен как TColor$C27A49. Ввод должен представлять собой представление строки цвета HTML, а вывод должен быть TColor.

ОБНОВЛЕНИЕ

Когда я использую следующую функцию от VCL Windows блока в программе установки Inno, TForm.Color показывает, как красный.

const 
    COLORREF: TColor; 

function RGB(R, G, B: Byte): COLORREF; 
begin 
    Result := (R or (G shl 8) or (B shl 16)); 
end; 

DataChecker.Color := RGB(73, 122, 194); 

Цвет, который я ожидал в TForm.Color является:

<html> 
 
<body bgcolor="#497AC2"> 
 
<h2>This Background Colour is the Colour I expected instead of Red.</h2> 
 
</body> 
 
</html>

Кроме того, я также хотел бы знать, почему красный цвет возвращается здесь (форма показывает красный) вместо ожидаемого полу светло-голубого цвета .........


Я хочу использовать преобразование как:

#define BackgroundColour "#497AC2" 

procedure InitializeDataChecker; 
... 
begin 
... 
    repeat 
    ShellExec('Open', ExpandConstant('{pf64}\ImageMagick-7.0.2-Q16\Convert.exe'), 
     ExpandConstant('-size ' + ScreenResolution + ' xc:' '{#BackgroundColour}' + ' -quality 100% "{tmp}\'+IntToStr(ImageNumber)+'-X.jpg"'), '', SW_HIDEX, ewWaitUntilTerminated, ErrorCode); 
...  
    until FileExists(ExpandConstant('{tmp}\'+IntToStr(ImageNumber)+'.jpg')) = False; 
... 
end; 

... 
DataChecker := TForm.Create(nil); 
{ ---HERE IT SHOULD BE RETURNED AS `$C27A49`--- } 
DataChecker.Color := NewFunction({#BackgroundColour}) 

Спасибо заранее.

+0

Для чего бы вы использовали такую ​​функцию? –

+0

Что такое 'DataChecker'? –

+0

Это «TForm», который обрабатывает некоторые мои изображения, которые будут отображаться во время установки. См. Мой обновленный вопрос ........... – Blueeyes789

ответ

1
function RGB(r, g, b: Byte): TColor; 
begin 
    Result := (Integer(r) or (Integer(g) shl 8) or (Integer(b) shl 16)); 
end; 

function WebColorStrToColor(WebColor: string): TColor; 
begin 
    if (Length(WebColor) <> 7) or (WebColor[1] <> '#') then 
    RaiseException('Invalid web color string'); 

    Result := 
    RGB(
     StrToInt('$' + Copy(WebColor, 2, 2)), 
     StrToInt('$' + Copy(WebColor, 4, 2)), 
     StrToInt('$' + Copy(WebColor, 6, 2))); 
end; 

Ваша функция RGB не работает, потому что кажется, что Pascal Script (в отличие от Delphi) не неявно преобразовать/расширить Byte в Integer для shl операции. Поэтому вы должны сделать это явно.

+0

Спасибо вам очень много ......... ;-) Будет ли это работать как с версиями установки Ansi, так и с Unicode Inno? – Blueeyes789

+0

Я тестировал только версию Unicode. Но я не вижу причин, по которым он не должен работать в версии Ansi. –

+0

Я возвратил 'TColor' как String как' 12745289' в Log при использовании функции как 'Log (IntToStr (WebColorStrToColor ('# 497AC2'))); ......... Что пошло не так в Вот? – Blueeyes789

 Смежные вопросы

  • Нет связанных вопросов^_^