2012-10-21 293 views
0

使用StringToColor我想分配一些顏色標記 - :我的形式(TNewStaticText財產顏色TColor;讀寫)。在Inno Setup的

我有我的顏色存儲爲'$ RRGGBB'(字符串),我想使用Delphi函數StringToColor()將其轉換爲TColor,但如果我在腳本中使用此函數,Inno安裝程序會顯示錯誤。 如何告訴Inno Setup使用此功能或如何將字符串轉換爲Inno中的TColor以使用此屬性?

+4

Pascal腳本在Inno Setup的,其中有*不*做與德爾福(只要你現在關心),不會有一個叫做「StringToColor」功能。這是一個完整的函數列表:http://www.jrsoftware.org/ishelp/topic_scriptfunctions.htm。當然,你不希望功能僅僅存在[因爲你想要它們存在](http://blogs.msdn.com/b/oldnewthing/archive/2012/09/27/10353605.aspx)? –

回答

1

Sertac Akyuz的做法是好的,但我解決了這個數寫這個問題後幾分鐘,不好意思:) 這是我的功能 - 還有一點處理:

function StringToColor(Color: String): TColor; 
var 
    RR, GG, BB: String; 
    Dec: Integer; 
begin 
    { Change string Color from $RRGGBB to $BBGGRR and then convert to TColor } 
    if((Length(Color) <> 7) or (Color[1] <> '$')) then 
     Result := $000000 
    else 
    begin 
     RR := Color[2] + Color[3]; 
     GG := Color[4] + Color[5]; 
     BB := Color[6] + Color[7]; 
     Dec := StrToInt('$' + BB + GG + RR); 
     Result := TColor(Dec); 
    end; 
end; 

的全魔確實功能StrToInt()其轉換字符串到整數 - 但如果你的字符串前加「$」這將字符串爲十六進制數,它會自動轉換爲十進制數。結果是從該編號創建的整數TColor。

6

如安德烈亞斯他的問題發表評論時提及,有沒有內置的功能。您可以通過精心設計你自己的,例如:

function StringToRGB(ColorStr: string): Integer; 
var 
    r, g, b: Integer; 
begin 
    r := StrToInt(Copy(ColorStr, 1, 3)); 
    g := StrToInt('$' + Copy(ColorStr, 4, 2)); 
    b := StrToInt('$' + Copy(ColorStr, 6, 2)); 
    Result := (r or (g shl 8) or (b shl 16)); 
end; 


如果你已經保存像是$BBGGRR你的顏色,你可以簡單地將其轉換

StrToInt(ColorStr); 
+0

完美!但你的函數返回一個整數,我想要TColor,所以我需要簡單的演員。 – Slappy

+2

@Slappy - 我認爲你不需要演員。這是TColor是如何在[帕斯卡腳本](http://code.remobjects.com/p/pascalscript/source/tree/HEAD/Source/uPSC_graphics.pas#L205)暴露:'cl.addTypeS( 'TColor', 'integer');' –

1

@Andreas Rejbrand:

當我下載的Inno的來源,我注意到在源功能StringToColor()。這裏是Compiler.pas的片段:

type 
    TColor = $7FFFFFFF-1..$7FFFFFFF; 

const 
    clScrollBar = TColor(COLOR_SCROLLBAR or $80000000); 
    clBackground = TColor(COLOR_BACKGROUND or $80000000); 
    clActiveCaption = TColor(COLOR_ACTIVECAPTION or $80000000); 
    clInactiveCaption = TColor(COLOR_INACTIVECAPTION or $80000000); 
    clMenu = TColor(COLOR_MENU or $80000000); 
    clWindow = TColor(COLOR_WINDOW or $80000000); 
    clWindowFrame = TColor(COLOR_WINDOWFRAME or $80000000); 
    clMenuText = TColor(COLOR_MENUTEXT or $80000000); 
    clWindowText = TColor(COLOR_WINDOWTEXT or $80000000); 
    clCaptionText = TColor(COLOR_CAPTIONTEXT or $80000000); 
    clActiveBorder = TColor(COLOR_ACTIVEBORDER or $80000000); 
    clInactiveBorder = TColor(COLOR_INACTIVEBORDER or $80000000); 
    clAppWorkSpace = TColor(COLOR_APPWORKSPACE or $80000000); 
    clHighlight = TColor(COLOR_HIGHLIGHT or $80000000); 
    clHighlightText = TColor(COLOR_HIGHLIGHTTEXT or $80000000); 
    clBtnFace = TColor(COLOR_BTNFACE or $80000000); 
    clBtnShadow = TColor(COLOR_BTNSHADOW or $80000000); 
    clGrayText = TColor(COLOR_GRAYTEXT or $80000000); 
    clBtnText = TColor(COLOR_BTNTEXT or $80000000); 
    clInactiveCaptionText = TColor(COLOR_INACTIVECAPTIONTEXT or $80000000); 
    clBtnHighlight = TColor(COLOR_BTNHIGHLIGHT or $80000000); 
    cl3DDkShadow = TColor(COLOR_3DDKSHADOW or $80000000); 
    cl3DLight = TColor(COLOR_3DLIGHT or $80000000); 
    clInfoText = TColor(COLOR_INFOTEXT or $80000000); 
    clInfoBk = TColor(COLOR_INFOBK or $80000000); 

    clBlack = TColor($000000); 
    clMaroon = TColor($000080); 
    clGreen = TColor($008000); 
    clOlive = TColor($008080); 
    clNavy = TColor($800000); 
    clPurple = TColor($800080); 
    clTeal = TColor($808000); 
    clGray = TColor($808080); 
    clSilver = TColor($C0C0C0); 
    clRed = TColor($0000FF); 
    clLime = TColor($00FF00); 
    clYellow = TColor($00FFFF); 
    clBlue = TColor($FF0000); 
    clFuchsia = TColor($FF00FF); 
    clAqua = TColor($FFFF00); 
    clLtGray = TColor($C0C0C0); 
    clDkGray = TColor($808080); 
    clWhite = TColor($FFFFFF); 
    clNone = TColor($1FFFFFFF); 
    clDefault = TColor($20000000); 

type 
    TColorEntry = record 
    Value: TColor; 
    Name: string; 
    end; 

const 
    Colors: array[0..41] of TColorEntry = (
    (Value: clBlack; Name: 'clBlack'), 
    (Value: clMaroon; Name: 'clMaroon'), 
    (Value: clGreen; Name: 'clGreen'), 
    (Value: clOlive; Name: 'clOlive'), 
    (Value: clNavy; Name: 'clNavy'), 
    (Value: clPurple; Name: 'clPurple'), 
    (Value: clTeal; Name: 'clTeal'), 
    (Value: clGray; Name: 'clGray'), 
    (Value: clSilver; Name: 'clSilver'), 
    (Value: clRed; Name: 'clRed'), 
    (Value: clLime; Name: 'clLime'), 
    (Value: clYellow; Name: 'clYellow'), 
    (Value: clBlue; Name: 'clBlue'), 
    (Value: clFuchsia; Name: 'clFuchsia'), 
    (Value: clAqua; Name: 'clAqua'), 
    (Value: clWhite; Name: 'clWhite'), 
    (Value: clScrollBar; Name: 'clScrollBar'), 
    (Value: clBackground; Name: 'clBackground'), 
    (Value: clActiveCaption; Name: 'clActiveCaption'), 
    (Value: clInactiveCaption; Name: 'clInactiveCaption'), 
    (Value: clMenu; Name: 'clMenu'), 
    (Value: clWindow; Name: 'clWindow'), 
    (Value: clWindowFrame; Name: 'clWindowFrame'), 
    (Value: clMenuText; Name: 'clMenuText'), 
    (Value: clWindowText; Name: 'clWindowText'), 
    (Value: clCaptionText; Name: 'clCaptionText'), 
    (Value: clActiveBorder; Name: 'clActiveBorder'), 
    (Value: clInactiveBorder; Name: 'clInactiveBorder'), 
    (Value: clAppWorkSpace; Name: 'clAppWorkSpace'), 
    (Value: clHighlight; Name: 'clHighlight'), 
    (Value: clHighlightText; Name: 'clHighlightText'), 
    (Value: clBtnFace; Name: 'clBtnFace'), 
    (Value: clBtnShadow; Name: 'clBtnShadow'), 
    (Value: clGrayText; Name: 'clGrayText'), 
    (Value: clBtnText; Name: 'clBtnText'), 
    (Value: clInactiveCaptionText; Name: 'clInactiveCaptionText'), 
    (Value: clBtnHighlight; Name: 'clBtnHighlight'), 
    (Value: cl3DDkShadow; Name: 'cl3DDkShadow'), 
    (Value: cl3DLight; Name: 'cl3DLight'), 
    (Value: clInfoText; Name: 'clInfoText'), 
    (Value: clInfoBk; Name: 'clInfoBk'), 
    (Value: clNone; Name: 'clNone')); 

function IdentToColor(const Ident: string; var Color: Longint): Boolean; 
var 
    I: Integer; 
begin 
    for I := Low(Colors) to High(Colors) do 
    if CompareText(Colors[I].Name, Ident) = 0 then 
    begin 
     Result := True; 
     Color := Longint(Colors[I].Value); 
     Exit; 
    end; 
    Result := False; 
end; 

function StringToColor(const S: string): TColor; 
begin 
    if not IdentToColor(S, Longint(Result)) then 
    Result := TColor(StrToInt(S)); 
end; 

正如你所看到的Inno有它自己的實現StringToColor()的其也可以通過名稱[喜歡IdentToColor(「clBlack」)]解析顏色。

我希望一些快速黑客如何使用此功能,從腳本,但似乎這功能沒有拉到公共接口(ScriptFunc_R.pas或ScriptFunc_C.pas)。

+2

請通過編輯您的問題來添加您的問題的信息,並通過評論添加評論回答。更重要的是,不要引用盡可能多的版權材料。它是開源的事實並不意味着它沒有版權。 –

+1

@Slappy:有趣。但是,它可能只適用於Inno Setup內部使用,不是公開的Pascal腳本功能的一部分。 –