Installation 使用配置文件选择要与Inno Setup一起安装的组件

Installation 使用配置文件选择要与Inno Setup一起安装的组件,installation,inno-setup,pascalscript,Installation,Inno Setup,Pascalscript,我想编程一个安装程序,通过选择一个用户来安装某些程序。每个用户都定义了应该安装哪个程序的分配。 现在,您必须使用components部分来配置程序。但我的目标是用文本文件配置它。 文本文件的示例可能如下所示: User1 User2 User3 User4 Program 1 x x x x Program 2 x

我想编程一个安装程序,通过选择一个用户来安装某些程序。每个用户都定义了应该安装哪个程序的分配。 现在,您必须使用components部分来配置程序。但我的目标是用文本文件配置它。 文本文件的示例可能如下所示:

            User1      User2      User3      User4

 Program 1     x          x          x          x
 Program 2                x                     x
 Program 3     x                     x
这是我的密码:

[Types]
Name: "User1"; Description: "User 1"
Name: "User2"; Description: "User 2"
Name: "User3"; Description: "User 3"
Name: "User4"; Description: "User 4"
Name: "Custom"; Description: "Custom"

Name: "Random"; Description:"Random"; Flags: iscustom

[Components]
Name: "Select"; Description: "Alle auswählen:"; Types: User1 User2 User3 User4  

Name: "Select\Program_1"; Description: "Program_1"; Types: User1 User2 User3 User4 
Name: "Select\Program_2"; Description: "Program_2"; Types:  User2  User4
Name: "Select\Program_3"; Description: "Program_3"; Types: User1  User3 

[Files]
Source: "TEST \Software\x64\Program_1"; DestDir: "{app}\Program_1"; \
  Flags: ignoreversion  recursesubdirs; Components: Select\Program_1; 
Source: "TEST \Software\x64\Program_2"; DestDir: "{app}\Program_2"; \
  Flags: ignoreversion  recursesubdirs; Components: Select\Program_2; 
Source: "TEST \Software\x64\Program_3"; DestDir: "{app}\Program_3"; \
  Flags: ignoreversion  recursesubdirs; Components: Select\Program_3;
[代码]
变量
类型页面:TWizardPage;
User1_按钮:TNewRadioButton;
User2_按钮:TNewRadioButton;
User4_按钮:TNewRadioButton;
User3_按钮:TNewRadioButton;
自定义按钮:TNewRadioButton;
过程初始化Wizard();
开始
{创建自定义“类型”页面}
TypesPage:=CreateInputOptionPage(wpSelectDir,
'选择用户','',
“请选择正确的用户”,true、false);
User1_按钮:=TNewRadioButton.Create(TypesPage);
User1_Button.Parent:=TypesPage.Surface;
User1_Button.Caption:=“用户1”;
User1_Button.Top:=50;
User1_-Button.Height:=ScaleY(User1_-Button.Height);
User1_Button.Checked:=(WizardForm.TypesCombo.ItemIndex=0);
User2_按钮:=TNewRadioButton.Create(TypesPage);
User2_Button.Parent:=TypesPage.Surface;
User2_Button.Caption:=“用户2”;
User2_-Button.Height:=ScaleY(User2_-Button.Height);
User2_-Button.Top:=User1_-Button.Top+User1_-Button.Height+ScaleY(16);
User2_Button.Checked:=(WizardForm.TypesCombo.ItemIndex=1);
User3_按钮:=TNewRadioButton.Create(TypesPage);
User3_Button.Parent:=TypesPage.Surface;
User3_Button.Caption:=“用户3”;
User3_-Button.Height:=ScaleY(User3_-Button.Height);
User3_-Button.Top:=User2_-Button.Top+User2_-Button.Height+ScaleY(16);
User3_Button.Checked:=(WizardForm.TypesCombo.ItemIndex=2);
用户4_按钮:=TNewRadioButton.Create(TypesPage);
用户4_Button.Parent:=TypesPage.Surface;
用户4_按钮。标题:=“用户4”;
User 4_Button.Height:=ScaleY(User4_Button.Height);
User 4_Button.Top:=User3_Button.Top+User3_Button.Height+ScaleY(16);
用户4_按钮。选中:=(WizardForm.TypesCombo.ItemIndex=3);
自定义按钮:=TNewRadioButton.Create(TypesPage);
自定义按钮.Parent:=TypesPage.Surface;
自定义按钮。标题:=“自定义”;
自定义按钮宽度:=200;
自定义按钮高度:=ScaleY(自定义按钮高度);
自定义按钮.Top:=User4按钮.Top+User4按钮.Height+ScaleY(16);
自定义按钮。选中:=(WizardForm.TypesCombo.ItemIndex=4);
WizardForm.TypesCombo.Visible:=False;{已删除下拉列表}
WizardForm.IncTopDeceHeight(WizardForm.Components列表,
-(WizardForm.ComponentsList.Top WizardForm.TypesCombo.Top));
结束;
函数NextButtonClick(CurPageID:Integer):布尔值;
开始
如果CurPageID=TypesPage.ID,则
开始
如果选中User1\u Button.Checked,则WizardForm.TypesCombo.ItemIndex:=0
其他的
如果选中User2\u Button.Checked,则WizardForm.TypesCombo.ItemIndex:=1
其他的
如果选中User3\u Button.Checked,则WizardForm.TypesCombo.ItemIndex:=2
其他的
如果选中User4\u Button.Checked,则WizardForm.TypesCombo.ItemIndex:=3
其他的
如果选中自定义按钮,则WizardForm.TypesCombo.ItemIndex:=4;
WizardForm.TypesCombo.OnChange(WizardForm.TypesCombo);
结束;
结果:=真;
结束;

由于您似乎并不关心配置文件的格式,让我们选择INI文件,因为Inno Setup具有解析该文件的功能:

[Users]
user1=Program1,Program3
user2=Program1,Program2
user3=Program1,Program3
user4=Program1,Program2

然后执行以下脚本:

[Types]
Name: "user1"; Description: "User 1"
Name: "user2"; Description: "User 2"
Name: "user3"; Description: "User 3"
Name: "user4"; Description: "User 4"

[Files]
Source: "TEST \Software\x64\Program_1"; DestDir: "{app}\Program_1"; \
  Flags: ignoreversion recursesubdirs; Check: ShouldInstallProgram('Program1') 
Source: "TEST \Software\x64\Program_2"; DestDir: "{app}\Program_2"; \
  Flags: ignoreversion recursesubdirs; Check: ShouldInstallProgram('Program2') 
Source: "TEST \Software\x64\Program_3"; DestDir: "{app}\Program_3"; \
  Flags: ignoreversion recursesubdirs; Check: ShouldInstallProgram('Program3') 
[代码]
函数ShouldInstallProgram(程序名:字符串):布尔值;
变量
用户名:字符串;
程序str:string;
节目:TStringList;
开始
用户名:=向导设置类型(False);
程序STR:=
GetIniString('Users',UserName',ExpandConstant('{src}\UserPrograms.ini');
程序:=TStringList.Create;
Programs.CommaText:=ProgramsStr;
结果:=(Programs.IndexOf(programmname)>=0);
项目。免费;
结束;
类型名称必须为小写才能使用。程序名的大小写也很重要


由于代码现在实际上根本不使用
[Types]
,您可以用直接检查自定义页面选择来替换
向导setuptype
。您可以删除冗余的
[Types]
部分和
NextButtonClick
事件函数