Search code examples
installationinno-setuppascalscript

Why doesn't the radio button on custom page checked in Inno Setup?


Why don't rbStandardInstallType and rbCustomInstallType radio buttons get checked even though I set the Checked property of one of those to True? On the other hand, rbDefaultMSSQLInstance and rbNamedMSSQLInstance radio buttons do get checked.

I create radio buttons like this:

function CreateRadioButton(
  AParent: TNewNotebookPage; AChecked: Boolean; AWidth, ALeft, ATop, AFontSize: Integer;
  AFontStyle: TFontStyles; const ACaption: String): TNewRadioButton;
begin
  Result := TNewRadioButton.Create(WizardForm);
  with Result do
    begin
      Parent := AParent;
      Checked := AChecked;
      Width := AWidth;
      Left := ALeft;
      Top := ATop;
      Font.Size := AFontSize;
      Font.Style := AFontStyle;
      Caption := ACaption;
    end;
end;

I have 2 custom pages where I must show my image on the left and some text and radio buttons on the right (2 radio buttons per page). So, in my InitializeWizard procedure I've written this:

wpSelectInstallTypePage := CreateCustomPage(wpSelectDir, 'Caption', 'Description');
rbStandardInstallType := CreateRadioButton(WizardForm.InnerPage, True, WizardForm.InnerPage.Width, ScaleX(15), WizardForm.MainPanel.Top + ScaleY(30), 9, [fsBold], 'Standard');
rbCustomInstallType := CreateRadioButton(WizardForm.InnerPage, False, rbStandardInstallType.Width, rbStandardInstallType.Left, rbStandardInstallType.Top + rbStandardInstallType .Height + ScaleY(16), 9, [fsBold], 'Custom');

wpMSSQLInstallTypePage := CreateCustomPage(wpSelectInstallTypePage.ID, 'Caption2', 'Description2');
rbDefaultMSSQLInstance := CreateRadioButton(WizardForm.InnerPage, True, WizardForm.InnerPage.Width, ScaleX(15), WizardForm.MainPanel.Top + ScaleY(30), 9, [fsBold], 'DefaultInstance');
rbNamedMSSQLInstance := CreateRadioButton(WizardForm.InnerPage, False, rbDefaultMSSQLInstance.Width, rbDefaultMSSQLInstance.Left, rbDefaultMSSQLInstance.Top + rbDefaultMSSQLInstance.Height + ScaleY(10), 9, [fsBold], 'NamedInstance');

And finally, here's my CurPageChanged code in order to display all the controls properly:

procedure CurPageChanged(CurPageID: Integer);
  begin
    case CurPageID of
      wpSelectInstallTypePage.ID, wpMSSQLInstallTypePage.ID:
          WizardForm.InnerNotebook.Visible := False;  
    else
      WizardForm.InnerNotebook.Visible := True;
    end;
    rbDefaultMSSQLInstance.Visible := CurPageID = wpMSSQLInstallTypePage.ID;
    rbNamedMSSQLInstance.Visible := CurPageID = wpMSSQLInstallTypePage.ID;
    rbStandardInstallType.Visible := CurPageID = wpSelectInstallTypePage.ID;
    rbCustomInstallType.Visible := CurPageID = wpSelectInstallTypePage.ID;
  end

Solution

  • You are adding the radio buttons to a wrong parent control (WizardForm.InnerPage). Not to the custom pages you are creating. And you then workaround that flaw by explicitly hiding/showing the radio buttons in CurPageChanged.

    As all four radio buttons have the same parent (WizardForm.InnerPage), only one of them can be checked. So when you check the rbDefaultMSSQLInstance, the rbStandardInstallType is implicitly unchecked.


    For the correct code, see:
    Inno Setup Placing image/control on custom page

    (make sure you remove your redundant CurPageChanged code)


    You should also consider using CreateInputOptionPage instead of manually adding the radio buttons to a generic custom page.