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

Choosing components to be installed with Inno Setup using a configuration file

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

            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;
[Code]
var
  TypesPage: TWizardPage;
  User1_Button: TNewRadioButton;
  User2_Button: TNewRadioButton;
  User4_Button: TNewRadioButton;
  User3_Button: TNewRadioButton;
  Custom_Button: TNewRadioButton;

procedure InitializeWizard();
begin

  { Create custom "types" page }
  TypesPage := CreateInputOptionPage(wpSelectDir,
    'Select User',  ''       ,
    'Please select the right User',true,false);
  User1_Button := TNewRadioButton.Create(TypesPage);
  User1_Button.Parent := TypesPage.Surface;
  User1_Button.Caption := 'User 1';
  User1_Button.Top := 50;
  User1_Button.Height := ScaleY(User1_Button.Height);
  User1_Button.Checked := (WizardForm.TypesCombo.ItemIndex = 0); 

  User2_Button := TNewRadioButton.Create(TypesPage);
  User2_Button.Parent := TypesPage.Surface;
  User2_Button.Caption := 'User 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_Button := TNewRadioButton.Create(TypesPage);
  User3_Button.Parent := TypesPage.Surface;
  User3_Button.Caption := 'User 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);

  User 4_Button := TNewRadioButton.Create(TypesPage);
  User 4_Button.Parent := TypesPage.Surface;
  User 4_Button.Caption := 'User 4';                                              
  User 4_Button.Height := ScaleY(User4_Button.Height);
  User 4_Button.Top := User3_Button.Top + User3_Button.Height + ScaleY(16);
  User 4_Button.Checked := (WizardForm.TypesCombo.ItemIndex = 3);

  Custom_Button := TNewRadioButton.Create(TypesPage);
  Custom_Button.Parent := TypesPage.Surface;
  Custom_Button.Caption := 'Custom';
  Custom_Button.width := 200;
  Custom_Button.Height := ScaleY(Custom_Button.Height);
  Custom_Button.Top := User4_Button.Top + User4_Button.Height + ScaleY(16);
  Custom_Button.Checked := (WizardForm.TypesCombo.ItemIndex = 4); 

  WizardForm.TypesCombo.Visible := False;  { Dropdown List removed }
  WizardForm.IncTopDecHeight(WizardForm.ComponentsList,
    -(WizardForm.ComponentsList.Top-WizardForm.TypesCombo.Top));  
end;

function NextButtonClick(CurPageID: Integer): Boolean;
begin
  if CurPageID = TypesPage.ID then
  begin
    if User1_Button.Checked then WizardForm.TypesCombo.ItemIndex :=0
      else
    if User2_Button.Checked then WizardForm.TypesCombo.ItemIndex := 1
      else
    if User3_Button.Checked then WizardForm.TypesCombo.ItemIndex := 2
      else
    if User4_Button.Checked then WizardForm.TypesCombo.ItemIndex := 3
      else
    if Custom_Button.Checked then WizardForm.TypesCombo.ItemIndex := 4;

    WizardForm.TypesCombo.OnChange(WizardForm.TypesCombo);
  end;
  Result:= true;
end;

由于您似乎并不关心配置文件格式,所以我们选择 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') 
[Code]
function ShouldInstallProgram(ProgramName: string): Boolean;
var
  UserName: string;
  ProgramsStr: string;
  Programs: TStringList;
begin
  UserName := WizardSetupType(False);
  ProgramsStr :=
    GetIniString('Users', UserName, '', ExpandConstant('{src}\UserPrograms.ini'));
  Programs := TStringList.Create;
  Programs.CommaText := ProgramsStr;
  Result := (Programs.IndexOf(ProgramName) >= 0);
  Programs.Free;
end;

类型名称必须小写才能工作。程序名称的大小写很重要。


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