سؤال

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:

[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.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top