I'm using Check parameter in components section to check if a certain radio button was checked by user.
My predicate is called before custom page is shown to user and I always get default values returned.
How do I get user input from custom page to affect final components selection?
[Components]
Name: common; Description: Common files; Types: server client custom; Flags: fixed
Name: client; Description: Client; Types: client; Check: IsClient
Name: server; Description: Server; Types: server
[Code]
var ClientButton: TNewRadioButton;
procedure InitializeWizard;
var
CustomPage: TWizardPage;
begin
CustomPage := CreateCustomPage(wpWelcome, 'Installation type', '');
;CreateRadioButton function is defined elsewhere
ClientButton := CreateRadioButton(CustomPage, 16, 'Client', '');
end;
function IsClient: Boolean;
begin
Log('IsClient() called');
if Assigned(ClientButton) then
Result := ClientButton.Checked
else
Result := True;
end;
The following script makes two radio buttons on a custom page and based on their selection, chooses the installation type from the combo box (on components selection page). This selection happens only when you're leaving that custom page, so a selection change, you make in that combo box will remain, unless you visit that custom page again:
[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
OutputDir=userdocs:Inno Setup Examples Output
[Types]
Name: "client"; Description: "Client installation"
Name: "server"; Description: "Server installation"
Name: "custom"; Description: "Custom installation"; Flags: iscustom
[Components]
Name: "common"; Description: "Common files"; Types: client server custom; Flags: fixed
Name: "client"; Description: "Client files"; Types: client
Name: "server"; Description: "Server files"; Types: server
[Files]
Source: "Common.exe"; DestDir: "{app}"; Components: common
Source: "Client.exe"; DestDir: "{app}"; Components: client
Source: "Server.exe"; DestDir: "{app}"; Components: server
[Code]
var
CustomPage: TWizardPage;
ClientButton: TNewRadioButton;
ServerButton: TNewRadioButton;
function CreateRadioButton(AParent: TWizardPage; ATop: Integer;
ACaption: string; AHint: string): TNewRadioButton;
begin
Result := TNewRadioButton.Create(WizardForm);
with Result do
begin
Parent := AParent.Surface;
Top := ATop;
Width := AParent.SurfaceWidth;
Caption := ACaption;
Hint := AHint;
end;
end;
procedure InitializeWizard;
begin
CustomPage := CreateCustomPage(wpWelcome, 'Installation type', '');
ClientButton := CreateRadioButton(CustomPage, 16, 'Client', '');
ServerButton := CreateRadioButton(CustomPage, 34, 'Server', '');
end;
function NextButtonClick(CurPageID: Integer): Boolean;
begin
Result := True;
if CurPageID = CustomPage.ID then
begin
if ClientButton.Checked then
WizardForm.TypesCombo.ItemIndex := 0
else
if ServerButton.Checked then
WizardForm.TypesCombo.ItemIndex := 1;
WizardForm.TypesCombo.OnChange(WizardForm);
end;
end;
There is currently no way to do this. Check functions for components are typically called after InitializeSetup
but before InitializeWizard
or any of the wizard pages are shown.
There are some workarounds, but in this case it looks like you are misusing the Components.
If you already have a custom page offering the choice between Server or Client, there is no need to present the same choice again on the Components page (components are purely UI -- they have no special meaning beyond that, unlike with some other installation systems).
As such, you should just remove the Components entirely and just use the Check directly on the Files or other entries instead of a Components condition.