AM电脑吧 - Win10精简版系统_Win11精简版_Win7旗舰版

Yes
查看: 10631|回复: 10
收起左侧

Inno Setup入门(十一)——(二十)

[复制链接]
ampc84

签到天数: 15 天

[LV.4]四枚内存条

id ②號 发表于 2012-01-13 00:14:10
Inno Setup入门(十一)——完成安装后执行某些程序  
有些时候我们的程序虽然能够很好的完成安装,但是程序的配置工作可能需要其他的一些程序来辅助完成,如果不执行这些程序,主程序就不能很好的完成工作,甚至不能完成工作,一个很明显的例子是,目前许多程序是通过NET技术开发的,这就要求计算机上必须安装有.net Framework,否则主程序运行不了,只有预先安装了NET Framework后主程序才能得以运行。这个时候可以通过Run段,指定程序完成安装后、在安装程序显示最终对话框之前要执行的程序。
       设想有个主程序为ipmsg.exe,初始化程序为init.exe,主程序必须在init.exe运行一次之后方可很好的运行,这个时候可以这样做(这里的init.exe是我随便找的一个文件,和ipmsg没有必然的联系,只是用来演示):
DefaultDirName="E:TEST"
AppVersion=1.0
Compression=lzma2/max
ShowLanguageDialog=yes
[components]
Name: main; Description:"主程序(必选)";Types:full compact custom;Flags: fixed
Name: data; Description:"数据文件";Types:full
Name: help;Description:"帮助文件";Types:full compact
[files]
;需要打包的文件
Source: "F:desktop        estipmsg.exe"; DestDir: "{app}";Components:main
Source: "F:desktop        estinit.exe"; DestDir: "{app}";Components:main
Source: "F:desktop        estin.dat"; DestDir: "{app}";Components:data
Source: "F:desktop        esthelp.chm"; DestDir: "{app}" ;Components:help
Source: "F:desktop        esteadme.txt"; DestDir: "{app}";components:help;Flags:isreadme
[run]
Filename: "{app}INIT.EXE";
测试上面代码生成的打包文件,运行到最后出现finish之前,将会出现如下画面,后面的安装程序将挂起,等待run段下的程序执行完毕后方可继续运行。
2522297266305367673.jpg
聪明的读者可能已经想到,使用该方法也可以实现readme的功能。这里再谈谈该段的各个参数:
Filename
该参数是必须的,用于说明需要执行的文件,或者需要打开的文件夹。如果Filename 不是可执行文件(.exe.com) 或批处理文件(.bat .cmd),你必须在条目中使用shellexec 标记,由上面的代码可知,这个参数可以包含常量。
Description
仅在[Run] 段有效。这是条目的描述,可以包含常量,如果没有指明,将会使用默认的描述
Parameters
程序的可选命令行参数,可以包含常量例如有的控制台程序需要传递参数,这个时候就可以使用该参数了,示例如下:
Filename: "{app}INIT.EXE";Description:"初始化程序";Parameters:"/t"

注意:如果你的程序不接受参数,传递的参数将会被忽略。
WorkingDir
程序在哪个目录启动。如果这个参数未指定则使用Filename 参数中的目录。如果Filename 不包含路径,它将使用默认目录。这个参数可以包含常量。
StatusMsg
仅在[Run] 段有效。由于某些程序在执行期间是不可见的(处于安全或者其他原因),但是又不想让用户以为安装程序没有响应,可以通过该参数指定程序执行时显示在向导页的消息,如果这个参数未指定可是空白的,将使用默认的消息“正在完成安装...”。这个参数可以包含常量。例如下例:
[run]
Filename: "{app}INIT.EXE";Description:"初始化程序"; StatusMsg:"别急,等一下就好"

则效果如下:

1052997887875754252.jpg
Flags:
这个参数是额外选项设置。多个选项可以使用空格隔开。支持下面的选项:
选项
说明

hidewizard
如果指定了这个标记,向导将在程序运行期间隐藏

nowait
如果指定了这个标记,它将在处理下一个[Run] 条目前或完成安装前不等待进程执行完成,不能与waituntilidle waituntilterminated 组合使用

postinstall
仅在[Run] 段有效。告诉安装程序在安装完成向导页创建一个选择框,用户可以选中或不选中这个选择框从而决定是否处理这个条目。以前这个标记调用showcheckbox。如果安装程序已经重新启动了用户的电脑 (安装了一个带restartreplace 标记的文件或如果[Setup] 段的AlwaysRestart 指示是yes 引起的),选择框没有机会出现,因此这些条目不会被处理。

runhidden
如果指定了这个标记,它将在隐藏窗口中运行程序。

runmaximized
如果指定了这个标记,将在最大化窗口运行程序或文档

runminimized
如果指定了这个标记,将在最小化窗口运行程序或文档。

shellexec
如果Filename 不是一个直接可执行文件(.exe .com 文件),这个标记是必需的。当设置这个标记时,Filename 可以是一个文件夹或任何已注册的文件类型,当使用shellexec 标记时,将不等待,直到生成的进程终止,如果确实需要,则必须添加标记waituntilterminated

skipifdoesntexist
如果这个标记在[Run] 段中指定,如果文件名不存在,安装程序不显示错误消息;如果这个标记在[UninstallRun] 段中指定,如果文件名不存在,卸载程序不显示“一些元素不能删除”的警告

skipifnotsilent
仅在[Run] 段有效。告诉安装程序如果安装程序未在后台运行则跳过这个条目

skipifsilent
告诉安装程序如果安装程序在后台运行则跳过这个条目

unchecked
告诉安装程序初始为不选中选择框。如果用户希望处理这个条目,可以通过选取选择框执行,如果postinstall 标记未同时指定,这个标记被忽略

waituntilidle
如果指定了这个标记,它将在未输入期间等待,直到进程等待用户输入,而不是等待进程终止。(调用WaitForInputIdle Win32 函数。) 不能与nowait waituntilterminted 组合使用

waituntilterminated
如果指定这个标记,将等待到进程完全终止。注意这是一个默认动作 (也就是你不需要指定这个标记),除非你使用了shellexec 标记,在这种情况下,如果你要等待,需要指定这个标记。不能与nowait waituntilidle 组合使用









本文地址: https://www.ampc8.com/thread-5058-1-1.html
上一篇:Inno Setup入门(一)——(十)
下一篇:批处理应用教程,批处理各种明命令详解
回复

举报

ampc8224

签到天数: 230 天

[LV.7]七个CPU

id dmqhcx88 发表于 2012-01-13 06:58:41
顶起,学习了。
回复

举报

ampc84

签到天数: 15 天

[LV.4]四枚内存条

lz  楼主| ②號 发表于 2012-01-13 00:29:23
Inno Setup入门(二十)——Inno Setup类参考(6)  
存储框
       存储框也是典型的窗口可视化组件,同编辑框类似,可以输入、显示文本,但是和编辑框不同的是,编辑框只能编辑、显示单行文本,而存储框则可以对多行文本进行操作。存储框的类定义如下:< xmlnamespace prefix ="o" ns ="urn:schemas-microsoft-com:office:office" />
TMemo = class(TCustomMemo)
  property Lines: TStrings; read write;
  property Alignment: TAlignment; read write;
  property BorderStyle: TBorderStyle; read write;
  property Color: TColor; read write;
  property Font: TFont; read write;
  property HideSelection: Boolean; read write;
  property MaxLength: Integer; read write;
  property ReadOnly: Boolean; read write;
  property ScrollBars: TScrollStyle; read write;
  property WantReturns: Boolean; read write;
  property WantTabs: Boolean; read write;
  property WordWrap: Boolean; read write;
  property OnChange: TNotifyEvent; read write;
  property OnClick: TNotifyEvent; read write;
  property OnDblClick: TNotifyEvent; read write;
  property OnKeyDown: TKeyEvent; read write;
  property OnKeyPress: TKeyPressEvent; read write;
  property OnKeyUp: TKeyEvent; read write;
end;
层次结构模型如下:
1536290422887357458.jpg
       存储框同编辑框一样,都是继承自TcustomEdit类,但是在Tmemo上还有一个TcustomMemo类,该类添加了一个属性:Lines,即多行文本的操作。
       下面的代码将演示编辑框的创建和属性。

[setup]
AppName=Test
AppVerName=TEST
DefaultDirName="E:\TEST"
AppVersion=1.0
[files]
Source: "F:\desktop\Inno\ipmsg.exe";Flags:dontcopy
[code]
var
       myPage:TwizardPage;
       radio1,redio2:TRadioButton;
    mm:TMemo;
procedure InitializeWizard();
begin
       myPage:=CreateCustomPage(wpWelcome, '标题:自定义页面', '描述:这是我的自定义页面');
       mm:=TMemo.Create(myPage);
       mm.Parent:=myPage.Surface;
       mm.Text:='存储框测试';
       mm.Lines.Add('这是新的一行');
       mm.Lines.Insert(0,'我在最前面');
       mm.Lines.Add('请删除我,第四行');
       mm.Lines.Delete(3);
       {行号从0排起,插入到前面}   
       mm.WordWrap:=True;{自动换行}
       mm.WantTabs:=True;{接受Tab}
       mm.WantReturns:=True;{换行}
       mm.ScrollBars:=ssVertical;{滚动条}
end;

       运行效果如下:
1663235637385324467.jpg

下面说说存储框的属性。
由于存储框和编辑框许多属性都相同,这里就不再赘述了,主要说说编辑框的几个特殊属性。ScrollBar指明了存储框的滚动条状态,可选值有ssBothssHorizonalssNonessVertical,其含义如值所描述。WantReturns属性决定按Enter键之后是点击确认按钮(对应属性值为False)还是存储框换行(对应属性值为True),如果设置该值为False而又想在编辑框中换行时,必须按Ctrl+Enter键,这和QQ的发送消息框是一样的。WantTabs属性决定按下Tab键是切换窗口中组件的焦点(对应属性值为False)还是在存储框中移动光标(对应属性值为True),如果设置该值为False而又想在编辑框中移动光标时,必须按Ctrl+Tab键。最后的一个属性是WordWarp,该属性决定存储框文本输入时是否自动换行,属性值为True则自动换行,为False则不能自动换行。注意如果设置了ScrollBars属性为ssBoth或者ssHorizonal,将不会自动换行,因为滚动条会自动调节宽度。
       另外就是Lines属性。该属性其实本身也是一个类,属于Tstring,该属性主要用于操作存储框中的一行文本,可用的函数有AddClearDeleteInsertCount等。


回复

举报

ampc84

签到天数: 15 天

[LV.4]四枚内存条

lz  楼主| ②號 发表于 2012-01-13 00:28:40
Inno Setup入门(十九)——Inno Setup类参考(5)  单选按钮
单选按钮在安装中也很常见,例如同一个程序可以选择安装不同的性质的功能,例如选择32位或者64位等,两者是排他性的,因此可以通过单选按钮(RadioButton)来实现,在同一个容器中放置的单选按钮是自动带有排他性的,Pascal脚本中单选按钮的定义如下:
TRadioButton = class(TButtonControl)
  property Alignment: TAlignment; read write;
  property Caption: String; read write;
  property Checked: Boolean; read write;
  property Color: TColor; read write;
  property Font: TFont; read write;
  property OnClick: TNotifyEvent; read write;
  property OnDblClick: TNotifyEvent; read write;
end;
其继承关系如下图:

1536290422887357458.jpg

可见和按钮的层次模型是一样的,事实上,RadioButtonButton并没有太大的区别。唯一的区别是单选按钮的排他性。
下面的代码将在自定义向导页上添加一个文本框和两个单选按钮:

[setup]
AppName=Test
AppVerName=TEST
DefaultDirName="E:\TEST"
AppVersion=1.0
[files]
Source: "F:\desktop\Inno\ipmsg.exe";Flags:dontcopy
[code]
var
       myPage:TwizardPage;
       radio1,radio2:TRadioButton;
       lbl:TLabel;
       font:TFont;
{radio1的事件响应过程}
procedure ClickRadio1(Sender: TObject);
begin
       lbl.Font.Color:=clRed;
end;
{radio2的事件响应过程}
procedure ClickRadio2(Sender: TObject);
begin
       lbl.Font.Color:=clBlue;
end;
procedure InitializeWizard();
begin
       myPage:=CreateCustomPage(wpWelcome, '标题:自定义页面', '描述:这是我的自定义页面');
       lbl:=TLabel.Create(myPage);
       lbl.Parent:=myPage.Surface;
       lbl.Caption:='改变单选按钮的选项,我就会变色';
       radio1:=TRadioButton.Create(myPage);
       radio1.Parent:=myPage.Surface;
       radio1.Caption:='红色';
       radio1.Top:=lbl.Top+20;
       font:=TFont.Create();
       font.Color:=clRed;
       radio1.Font:=font;
       radio1.OnClick:=@ClickRadio1;
       radio2:=TRadioButton.Create(myPage);
       radio2.Parent:=myPage.Surface;
       radio2.Caption:='蓝色';
       radio2.Top:=radio1.Top+20;
       font.Color:=clBlue;
       radio2.Font:=font;
       radio2.OnClick:=@ClickRadio2;
end;

该段代码中重点是单选按钮的OnClick事件,该属性所指向的过程决定了单选按钮被点击后的行为,安装文件运行到自定义页面后效果如下:
1663235637385324467.jpg
       或许有人会问,如何在有多组不同的选项中做出选择呢?例如一边选择颜色,一边选择字体大小?对于这个问题,传统上Delphi是通过添加控件类TGroupBox来实现的,但是这个类在Pascal脚本是不支持的,所以Delphi中的方法行不通。虽然传统方法不行,并不代表Inno就无能为力了,最简单的方法就是创建两个页面,一个页面处理一种选项,另一个页面处理另一种选项(因此这里用前面的例子并不太好,主要是用来阐述单选按钮的使用),等用户都选完了之后,再统一执行。另外一种方法是使用其他控件,例如列表框(ListBox)。






回复

举报

ampc84

签到天数: 15 天

[LV.4]四枚内存条

lz  楼主| ②號 发表于 2012-01-13 00:27:37
Inno Setup入门(十八)——Inno Setup类参考(4)  
编辑框
       编辑框也叫文本框,是典型的窗口可视化组件,既可以用来输入文本,也可以用来显示文本,是程序设计中最常用的组件之一,可以获取用户输入的许多信息。Pascal中的编辑框由类Tedit实现,该类的定义如下:
TEdit = class(TCustomEdit)
  property AutoSelect: Boolean; read write;
  property AutoSize: Boolean; read write;
  property BorderStyle: TBorderStyle; read write;
  property CharCase: TEditCharCase; read write;
  property Color: TColor; read write;
  property Font: TFont; read write;
  property HideSelection: Boolean; read write;
  property MaxLength: Integer; read write;
  property PasswordChar: Char; read write;
  property ReadOnly: Boolean; read write;
  property Text: String; read write;
  property OnChange: TNotifyEvent; read write;
  property OnClick: TNotifyEvent; read write;
  property OnDblClick: TNotifyEvent; read write;
  property OnKeyDown: TKeyEvent; read write;
  property OnKeyPress: TKeyPressEvent; read write;
  property OnKeyUp: TKeyEvent; read write;
end;
       该类的层次模型如下:

1536290422887357458.jpg
  
下面的代码将演示创建编辑框,以及编辑框的Text属性:
[setup]
AppName=Test
AppVerName=TEST
DefaultDirName="E:\TEST"
AppVersion=1.0
[files]
Source: "F:\desktop\Inno\ipmsg.exe";Flags:dontcopy
[code]
var
       myPage:TwizardPage;
       myBtn:TButton;
       ed1,ed2,ed3:TEdit;
procedure ClickmyBtn(Sender: TObject);
begin
       ed3.Text:=ed1.Text+' '+ed2.Text;
end;
procedure InitializeWizard();
begin
       myPage:=CreateCustomPage(wpWelcome, '标题:自定义页面', '描述:这是我的自定义页面');
       myBtn:=TButton.Create(myPage);
       myBtn.Parent:=myPage.Surface;
       myBtn.Caption:='点我~';
       myBtn.OnClick:=@ClickmyBtn;
       ed1:=TEdit.Create(myPage);
       ed1.Parent:=myPage.Surface;
       ed1.Top:=myBtn.Top+30;
       ed1.Width:=myBtn.Width;
       ed2:=TEdit.Create(myPage);
       ed2.Parent:=myPage.Surface;
       ed2.Top:=ed1.Top+30;
       ed2.Width:=myBtn.Width;
       ed3:=TEdit.Create(myPage);
       ed3.Parent:=myPage.Surface;
       ed3.Top:=ed2.Top+30;
       ed3.Width:=myBtn.Width;     
end;
属性Text用于设置或获取文本框中的内容,注意不管是设置还是获取,参数一定必须是String的类型,运行效果如下:
1663235637385324467.jpg
  
如果是想实现两个数的代数运算,而不是字符串的拼接,则按钮的OnClick过程应该做如下修改:
procedure ClickmyBtn(Sender: TObject);
var
       a,b:Extended;
begin      
       a:=StrToFloat(ed1.Text);
       b:=StrToFloat(ed2.Text);
       ed3.Text:=FloatToStr(a+b);
end;
StrToFloatFloatToStr分别实现字符串转实数,实数转字符串。在第一、第二个文本框中输入数值后,点击按钮将第三个文本框中的内容设置为两数的和。下面再说说其他的属性。修改代码段如下:
[code]
var
       myPage:TwizardPage;
       myBtn:TButton;
       ed1,ed2,ed3:TEdit;
       a,b,c:String;
procedure ClickmyBtn(Sender: TObject);
begin
       a:=ed1.Text;
       b:=ed2.Text;
       c:=a+b;
       ed3.Text:=c;
end;
procedure InitializeWizard();
begin
       myPage:=CreateCustomPage(wpWelcome, '标题:自定义页面', '描述:这是我的自定义页面');
       myBtn:=TButton.Create(myPage);
       myBtn.Parent:=myPage.Surface;
       myBtn.Caption:='点我~';
       myBtn.OnClick:=@ClickmyBtn;
       ed1:=TEdit.Create(myPage);
       ed1.Parent:=myPage.Surface;
       ed1.Top:=myBtn.Top+30;
       ed1.Width:=myBtn.Width;
       ed1.CharCase:=ecUpperCase;{大写}
       ed1.ShowHint:=True;
       ed1.Hint:='字母将会变为大写';
       ed2:=TEdit.Create(myPage);
       ed2.Parent:=myPage.Surface;
       ed2.Top:=ed1.Top+30;
       ed2.Width:=myBtn.Width;
       ed2.PasswordChar:='#';{密码样式}
       ed3:=TEdit.Create(myPage);
       ed3.Parent:=myPage.Surface;
       ed3.Top:=ed2.Top+30;
       ed3.Width:=myBtn.Width*2;
       ed3.ReadOnly:=true;{只读}
end;
上面介绍了四个属性:CharCase将设置文本显示的格式,可以有三个值:(ecNormal, ecUpperCase, ecLowerCase,分别为正常方式,大写方式,小写方式;PasswordChar属性将输入的文本替换为制定的样式;ReadOnly属性将使得该文本框不接受用户输入;HintShowHint属性是用户的鼠标停留在该文本框上时,给出相应的提示文本,注意只有在ShowHint设置为True的时候才会显示。
另外,编辑框也能对一些事件做出相应,例如单击、双击,文本内容发生变化等,实现起来和按钮的差不错,这里就不再啰嗦了。最后需要介绍的是三个处理按键的属性: OnKeyDownOnKeyPressOnKeyUp
       这三个属性是当用户光标停留在该文本框中时,当用户按下了键盘上的某个键时,会调用该属性指定的过程,测试代码如下:
[code]
var
       myPage:TwizardPage;
       ed:TEdit;
procedure EditKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
       if (key=67) and (Shift=[ssAlt]) then
              Msgbox('你按下了Alt+c',MBInformation,MB_OK);
end;
procedure InitializeWizard();
begin
       myPage:=CreateCustomPage(wpWelcome, '标题:自定义页面', '描述:这是我的自定义页面');
       ed:=TEdit.Create(myPage);
       ed.Parent:=myPage.Surface;
       ed.OnKeyDown:=@EditKeyDown;
end;
在编辑框中输入时,用户按下Alt+C组合时,将会做出响应,弹出一个消息框,这样可以对我们感兴趣的按键组合做出相应的动作,例如我们想屏蔽粘贴这项功能,则修改代码如下:
procedure EditKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
       if (key=86) and (Shift=[ssCtrl]) then
              Msgbox('粘贴无效,请手动输入',MBInformation,MB_OK);
       ed.text:='';
end;
不过这里要说明的是,这还不能屏蔽右键粘贴,只是屏蔽了Ctrl+V的方式。另外两个按键属性和这里介绍的KeyDown差不多,可对照测试一下。

回复

举报

ampc84

签到天数: 15 天

[LV.4]四枚内存条

lz  楼主| ②號 发表于 2012-01-13 00:26:59
Inno Setup入门(十七)——Inno Setup类参考(3)  
标签
       标签(Label)是用来显示文本的主要组件之一,也是窗口应用程序中最常用的组件之一,通过对标签的使用,将能够给用户提供更加详细的信息。
Pascal脚本中的标签由类TlLabel实现,该类定义如下:
TLabel = class(TCustomLabel)
  property Alignment: TAlignment; read write;
  property AutoSize: Boolean; read write;
  property Caption: String; read write;
  property Color: TColor; read write;
  property FocusControl: TWinControl; read write;
  property Font: TFont; read write;
  property WordWrap: Boolean; read write;
  property OnClick: TNotifyEvent; read write;
  property OnDblClick: TNotifyEvent; read write;
end;
    和Tbutton的层次结构模型不同,该类的层次模型如下:

1536290422887357458.jpg
  
下面将在上一节的基础上添加一个标签,并在单击按钮之后标签内容出现相应的变化:

[setup]
AppName=Test
AppVerName=TEST
DefaultDirName="E:\TEST"
AppVersion=1.0
[files]
Source: "F:\desktop\test\ipmsg.exe";Flags:dontcopy
[code]
var
       myPage:TwizardPage;
       myBtn:TButton;
       myLbl:TLabel;
procedure ClickmyBtn(Sender: TObject);
begin
    myLbl.Caption:='你点击了按钮~';
       myLbl.Color:=clRed;
end;
procedure InitializeWizard();
begin
       myPage:=CreateCustomPage(wpWelcome, '标题:自定义页面', '描述:这是我的自定义页面');
       myBtn:=TButton.Create(myPage);
       myBtn.Parent:=myPage.Surface;
       myBtn.Caption:='点我~';
       myBtn.OnClick:=@ClickmyBtn;
       myLbl:=TLabel.Create(myPage);
       myLbl.Parent:=myPage.Surface;
       myLbl.Top:=myBtn.Top+50;
       myLbl.Caption:='我是标签~';
end;

该代码中主要用到了LabelCaption属性,该属性决定了标签所要显示的文本。属性Color用于设置标签的背景颜色,myLbl.Color:=clRed;将设置标签的背景色为红色,有一个专门的Tcolor类处理关于颜色的属性,更多预定义颜色可查找Delphi相关文档,以下是支持的颜色:
clSystemColor = $FF000000;
clScrollBar = TColor(clSystemColor or COLOR_SCROLLBAR);
clBackground = TColor(clSystemColor or COLOR_BACKGROUND);
clActiveCaption = TColor(clSystemColor or COLOR_ACTIVECAPTION);
clInactiveCaption = TColor(clSystemColor or COLOR_INACTIVECAPTION);
clMenu = TColor(clSystemColor or COLOR_MENU);
clWindow = TColor(clSystemColor or COLOR_WINDOW);
clWindowFrame = TColor(clSystemColor or COLOR_WINDOWFRAME);
clMenuText = TColor(clSystemColor or COLOR_MENUTEXT);
clWindowText = TColor(clSystemColor or COLOR_WINDOWTEXT);
clCaptionText = TColor(clSystemColor or COLOR_CAPTIONTEXT);
clActiveBorder = TColor(clSystemColor or COLOR_ACTIVEBORDER);
clInactiveBorder = TColor(clSystemColor or COLOR_INACTIVEBORDER);
clAppWorkSpace = TColor(clSystemColor or COLOR_APPWORKSPACE);
clHighlight = TColor(clSystemColor or COLOR_HIGHLIGHT);
clHighlightText = TColor(clSystemColor or COLOR_HIGHLIGHTTEXT);
clBtnFace = TColor(clSystemColor or COLOR_BTNFACE);
clBtnShadow = TColor(clSystemColor or COLOR_BTNSHADOW);
clGrayText = TColor(clSystemColor or COLOR_GRAYTEXT);
clBtnText = TColor(clSystemColor or COLOR_BTNTEXT);
clInactiveCaptionText = TColor(clSystemColor or COLOR_INACTIVECAPTIONTEXT);
clBtnHighlight = TColor(clSystemColor or COLOR_BTNHIGHLIGHT);
cl3DDkShadow = TColor(clSystemColor or COLOR_3DDKSHADOW);
cl3DLight = TColor(clSystemColor or COLOR_3DLIGHT);
clInfoText = TColor(clSystemColor or COLOR_INFOTEXT);
clInfoBk = TColor(clSystemColor or COLOR_INFOBK);
clHotLight = TColor(clSystemColor or COLOR_HOTLIGHT);
clGradientActiveCaption = TColor(clSystemColor or COLOR_GRADIENTACTIVECAPTION);
clGradientInactiveCaption = TColor(clSystemColor or COLOR_GRADIENTINACTIVECAPTION);
clMenuHighlight = TColor(clSystemColor or COLOR_MENUHILIGHT);
clMenuBar = TColor(clSystemColor or COLOR_MENUBAR);
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);
StandardColorsCount = 16;
clMoneyGreen = TColor($C0DCC0);
clSkyBlue = TColor($F0CAA6);
clCream = TColor($F0FBFF);
clMedGray = TColor($A4A0A0);
ExtendedColorsCount = 4;
clNone = TColor($1FFFFFFF);
clDefault = TColor($20000000);
上述代码运行后效果如下:
611645124393304228.jpg
  点击前
1663235637385324467.jpg
点击后
       注意:修改标签文字颜色需要使用标签的Font属性。另外,标签也可以对鼠标的点击做出反应,执行相应的函数,标签支持双击和单击鼠标的事件,但是要注意这两个事件不能并存,测试代码如下:

[code]
var
       myPage:TwizardPage;
       myBtn:TButton;
       myLbl:TLabel;
procedure ClickmyBtn(Sender: TObject);
begin
       myLbl.Caption:='你点击了按钮~';
      myLbl.Color:=clRed;
end;
procedure ClickMyLbl(Sender: TObject);
begin
       MsgBox('你单击了标签', MBInformation, MB_OK);
end;
procedure DbClickMyLbl(Sender: TObject);
begin
       MsgBox('你双击了标签', MBInformation, MB_OK);
end;
procedure InitializeWizard();
begin
       myPage:=CreateCustomPage(wpWelcome, '标题:自定义页面', '描述:这是我的自定义页面');
       myBtn:=TButton.Create(myPage);
       myBtn.Parent:=myPage.Surface;
       myBtn.Caption:='点我~';
       myBtn.OnClick:=@ClickmyBtn;
       myLbl:=TLabel.Create(myPage);
       myLbl.Parent:=myPage.Surface;
       myLbl.Top:=myBtn.Top+50;
       myLbl.Caption:='我是标签~';
       myLbl.OnDblClick:=@DbClickMyLbl;
    //myLbl.OnClick:=@ClickMyLbl;
end;

上面的代码在双击标签时会弹出一个对话框,如果我们把倒数第二行的注释取消,则双击事件并不能被安装程序捕获,因为当用户点击一次鼠标左键后一旦松开鼠标,将会捕获单击事件,而不是再等待双击的到来,这点一定要注意,不过通常标签主要还是用于显示文本,而不是对某些事件做出反应,总之,标签的Caption属性是最重要的。

回复

举报

ampc84

签到天数: 15 天

[LV.4]四枚内存条

lz  楼主| ②號 发表于 2012-01-13 00:26:14
Inno Setup入门(十六)——Inno Setup类参考(2)  
   这里将接着在前面的基础上介绍如何在自定义页面上添加按钮。按钮属于Tbutton类,该类继承自TbuttonControl,类定义如下:
TButton = class(TButtonControl)
  property Cancel: Boolean; read write;
  property Caption: String; read write;
  property Default: Boolean; read write;
  property Font: TFont; read write;
  property ModalResult: Longint; read write;
  property OnClick: TNotifyEvent; read write;
end;
其继承关系如下图:
  
下面将在一个已经创建好的自定义页面上添加一个按钮:
[setup]
AppName=Test
AppVerName=TEST
DefaultDirName="E:\TEST"
AppVersion=1.0
[files]
Source: "F:\desktop\test\ipmsg.exe";Flags:dontcopy
[code]
var
       myPage:TwizardPage;
       myBtn:TButton;
procedure InitializeWizard();
begin
       myPage:=CreateCustomPage(wpWelcome, '标题:自定义页面', '描述:这是我的自定义页面');
       myBtn:=TButton.Create(nil);
       myBtn.Parent:=myPage.Surface;
end;
先解释一下这段代码中的含义。
首先是myBtn:=TButton.Create(nil);语句,该语句使用了Tbutton类的成员函数函数Create,创建一个实例化的Tbutton对象,这里使用myBtn获取该对象,参数nil表示为空,另外一个类似的语句是myBtn:=TButton.Create(myPage);通常不用考虑这两个语句的区别,该函数的参数决定了谁来释放创建控件的问题,nil,程序关闭和窗体关闭时都不会释放这个按钮,如果为nil,需要手动释放,如果设为某个页面,则该页面释放时被自动释放。
另外一个是myBtnParent属性,该属性继承自TwinControl类,该属性指定了包含本组件的容器,按钮只能在指定的包容器中显示和移动。
安装程序运行到自定义页面时,将出现如下的窗口:
1864490245733416475.jpg
  
这个时候的按钮没有标题,点击也没有任何反应,因为在上面的代码中并没有为其添加相应的属性和事件。
下面的代码则会完善上面的例子(只修改了Code段):
[code]
var
       myPage:TwizardPage;
       myBtn:TButton;
       myFont:TFont;
procedure ClickmyBtn(Sender: TObject);
begin
  MsgBox('你点击了按钮~~', MBInformation, MB_OK);
end;
procedure InitializeWizard();
begin
       myPage:=CreateCustomPage(wpWelcome, '标题:自定义页面', '描述:这是我的自定义页面');
       myBtn:=TButton.Create(myPage);
       myBtn.Parent:=myPage.Surface;
       myBtn.Caption:='点我~';
       myBtn.Default:=True;
       myFont:=TFont.Create();
    myFont.Size:=16;
       myFont.Style:=[fsBold];
       myFont.Style:=myFont.Style+[fsItalic];
    (*或者使用
              myFont.Style:=[fsBold,fsItalic];
    *)
       myBtn.Font:=myFont;
    myBtn.Width:=300;
    myBtn.Height:=100;
       myBtn.OnClick:=@ClickmyBtn;
end;
这里新创建了一个TFont的实例myFont,该对象主要设置对象显示字符的大小、颜色、粗体等属性。Caption设置了按钮中显示的文字,Default属性表明该按钮为默认选中,后面是设置显示文字的属性,最后的WidthHeight设置了按钮的尺寸,这两个属性继承自Tcontrol,最后是按钮的事件响应函数,当点击按钮时,执行ClickmyBtn过程,该过程在前面也有实现,注意实现的代码一定要放在调用该过程的前面,否则无法通过编译。运行效果如下:
2788009644320445184.jpg
另外按钮还有一些属性,例如TopLeft是控制按钮所在位置的,都可以测试一下。

回复

举报

ampc84

签到天数: 15 天

[LV.4]四枚内存条

lz  楼主| ②號 发表于 2012-01-13 00:25:17
Inno Setup入门(十五)——Inno Setup类参考(1)  

Inno setup脚本能够支持许多的类,这些类使得安装程序的功能得到很大的加强,通过对这些类的使用,将会创建出许多让人惊奇的安装程序,下面开始类的学习。
创建自定义向导页
自定义向导页需要在InitializeWizard事件函数中创建,通过使用CreateCustomPage函数创建一个空的页面,或者使用CreateInput...Page CreateOutput...Page等函数创建预建的页面,例如CreateInputDirPageCreateInputFilePageCreateOutputProgressPage等函数。当创建好了页面之后,就可以在页面上添加控件了,可以手动创建控件,也可以使用预建页面的特殊函数。大部分的Create...Page函数的第一个参数通常都是Page ID,该参数指定了新创建的页面被放在哪个已存在的页面后面。有几种方法获取一个已经存在页面的Page ID,例如用户创建的页面有一个属性是ID,该属性为一个只读的整型,其值即为页面的ID,内建的向导页有预定的ID,可用的名称如下表:

wpWelcome
wpLicense

wpPassword

wpInfoBefore

wpUserInfo
wpSelectDir

wpSelectComponents

wpSelectProgramGroup

wpSelectTasks
wpReady

wpPreparing

wpInstalling

wpInfoAfter
wpFinished




当自定义页面创建完成后,安装程序将会显示,并会像对待预建页面一样处理他们,例如调用所有页面都关联的NextButtonClick ShouldSkipPage事件函数。
CreateCustomPage函数原型如下:
function CreateCustomPage(const AfterID: Integer; const ACaption, ADescription: String): TwizardPage
第一个参数和前面的Page ID是一样的,可以使用上述表中任何一个作为参数,第二个参数Acaption指定页面的标题,该标题将会显示在页面上方,第三个参数则是对该页面的描述。函数的返回值是一个TwizardPage类,根据Inno Setup的帮助文档,该类的原型如下:
TWizardPage = class(TComponent)
  property ID: Integer; read;
  property Caption: String; read write;
  property Description: String; read write;
  property Surface: TNewNotebookPage; read write;
  property SurfaceHeight: Integer; read write;
  property SurfaceWidth: Integer; read write;
  property OnActivate: TWizardPageNotifyEvent; read write;
  property OnBackButtonClick: TWizardPageButtonEvent; read write;
  property OnCancelButtonClick: TWizardPageCancelEvent; read write;
  property OnNextButtonClick: TWizardPageButtonEvent; read write;
  property OnShouldSkipPage: TWizardPageShouldSkipEvent; read write;
end;
TWizardPageNotifyEvent = procedure(Sender: TWizardPage);
TWizardPageButtonEvent = function(Sender: TWizardPage): Boolean;
TWizardPageCancelEvent = procedure(Sender: TWizardPage; var ACancel, AConfirm: Boolean);
TWizardPageShouldSkipEvent = function(Sender: TWizardPage): Boolean;
下面的程序将会创建一个最简单的自定义页面,并显示在欢迎页面后面:
[setup]
AppName=Test
AppVerName=TEST
DefaultDirName="E:\TEST"
AppVersion=1.0
[files]
Source: "F:\desktop\test\ipmsg.exe";Flags:dontcopy
[code]
procedure InitializeWizard();
begin
       CreateCustomPage(wpWelcome, '标题:自定义页面', '描述:这是我的自定义页面');
end;
运行后,当从Welcome页面点击Next按钮后,将会出现下面的页面:
913104824449999820.jpg

另外,我们也可是测试一下CreateCustomPage的返回值TwizardPage类的属性。例如下面这个例子将测试一下ID属性和NextButtonClick属性:

[code]
var
       myPage:TwizardPage;
       myPageID:Integer;
function NextButtonClick(CurPageID:Integer): Boolean;
begin
    if CurPageID=myPageID then
    begin
        if MsgBox('确定要离开本页面吗?', mbConfirmation, MB_YESNO or MB_DEFBUTTON2) = IDYES then result:=true;
       end
    else
        result:=true;
end;
procedure InitializeWizard();
begin
       myPage:=CreateCustomPage(wpWelcome, '标题:自定义页面', '描述:这是我的自定义页面');
       myPageID:=myPage.ID;
end;

       运行该程序,当到达自定义页面并单击Next的后,将会出现如下的确认对话框:
640074097041557123.jpg
选择“是”将到下一页,“否”将留在本页。
虽然上面的页面没有任何空间,但是,在成功创建好页面之后,往上面添加各种控件也不是将会变得简单,这就像是把地基打好了之后,盖房子就方便多了。



回复

举报

ampc84

签到天数: 15 天

[LV.4]四枚内存条

lz  楼主| ②號 发表于 2012-01-13 00:23:34
Inno Setup入门(十四)——替换安装程序和卸载程序的图标  
    通常Inno生成的安装文件的图标是一个光盘和显示器,如下图。同时,程序安装好之后,在安装目录下的卸载程序的图标也是一样的,其实我们也可以自己修改。
1784832827324171014.jpg

    首先生成的安装文件图标。这个比较简单,只需要在Setup段中添加相应的语句即可:

SetupIconFile=jiong.ico

该语句指定了输出文件的图标,注意如果图标不是和脚本在同一目录下的话,需要提供完整的路径。
然后是卸载程序的图标。事实上,把包含前面替换语句的程序编译之后,将其安装,会发现卸载程序其实也安装程序的图标一样被替换了,即安装程序自动实现了图标的替换工作。现在的问题是,如果想和安装的图标不一样,该如何处理?实现方法如下:
1.准备好图标文件,和脚本放入同意目录下。
2.使用一个名为UpdateIcon.dll的插件
3.添加Code段,代码如下:

[code]
//插件函数用法
//参数: 句柄(插件错误对话框的父句柄), exe文件完整路径名称, (exe文件中要替换的)图标资源名称, 图标文件的完整路径名称, (exe中要替换的图标资源所在)语系
//返回值: 成功 = Tr, 失败 = False
function UpdateIcon(const hWnd: Integer; const exeFileName, exeIcon, IcoFileName: String; wlangID: DWORD): Boolean;
external 'UpdateIcon@files:UpdateIcon.dll stdcall';
//替换卸载程序的图标
function UpdateUninstIcon(const IcoFileName: String): Boolean;
begin
       //要替换图标的exe文件路径名称留空,则插件会自动替换掉Inno卸载程序的图标,其它参数类似!
       Result:= UpdateIcon(MainForm.Handle, '', '', IcoFileName, 0);
       //替换卸载图标
end;
procedure CurStepChanged(CurStep: TSetupStep);
var
  sIcon: String;
begin
       //注意: 替换卸载程序的图标,必须是在卸载程序生成之前!
       //安装图标与卸载图标的格式与大小一致,否则可能会导致卸载程序出错!
       if CurStep=ssInstall then
       begin
              sIcon:= ExpandConstant('{tmp}\uninstall.ico'); //定义卸载图标
              ExtractTemporaryFile(ExtractFileName(sIcon)); //释放卸载图标
              //要替换图标的exe文件路径名称留空,则插件会自动替换掉Inno卸载程序的图标!
              UpdateUninstIcon(sIcon);//替换卸载图标
  end;
end;
    编译之后就可以了。下面是输出文件和安装好之后的目录:
2573807187043436636.jpg
安装文件
3875347479352890062.jpg
安装目录

回复

举报

您需要登录后才可以回帖 登录 | 验证注册

Powered by AMpc8.Com (晋ICP备13003365号ghs 晋公网安备 14090202000112号 |GMT+8, 2024/5/18 00:15 |
快速回复 返回顶部 返回列表