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



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

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: "SelectProgram_1"; Description: "Program_1"; Types: User1 User2 User3 User4 
Name: "SelectProgram_2"; Description: "Program_2"; Types:  User2  User4
Name: "SelectProgram_3"; Description: "Program_3"; Types: User1  User3 
[Files]
Source: "TEST Softwarex64Program_1"; DestDir: "{app}Program_1"; 
Flags: ignoreversion  recursesubdirs; Components: SelectProgram_1; 
Source: "TEST Softwarex64Program_2"; DestDir: "{app}Program_2"; 
Flags: ignoreversion  recursesubdirs; Components: SelectProgram_2; 
Source: "TEST Softwarex64Program_3"; DestDir: "{app}Program_3"; 
Flags: ignoreversion  recursesubdirs; Components: SelectProgram_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 Softwarex64Program_1"; DestDir: "{app}Program_1"; 
Flags: ignoreversion recursesubdirs; Check: ShouldInstallProgram('Program1') 
Source: "TEST Softwarex64Program_2"; DestDir: "{app}Program_2"; 
Flags: ignoreversion recursesubdirs; Check: ShouldInstallProgram('Program2') 
Source: "TEST Softwarex64Program_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事件函数

最新更新