2012-10-21 298 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脚本功能的一部分。 –