I recently added different installation types (Install, Update, Repair) to my Inno Setup. It all works pretty fine.
[Types]
Name: Install; Description: "Install OLP";
Name: Update; Description: "Update an existing version of OLP";
Name: Repair; Description: "Repair OLP";
The only thing I do not like so much is the dropdown list, that appears when installation runs, to select one of the installation types.
Is there a way to replace the dropdown list by a radio group?
Thanks
You can use radio buttons (since there's no radio group component available in Inno Setup):
[Code]
procedure OnTypeChange(Sender: TObject);
begin
{ set the item index in hidden TypesCombo }
WizardForm.TypesCombo.ItemIndex := TNewRadioButton(Sender).Tag;
{ notify TypesCombo about the selection change }
WizardForm.TypesCombo.OnChange(nil);
end;
procedure InitializeWizard;
var
I: Integer;
RadioButton: TNewRadioButton;
begin
for I := 0 to WizardForm.TypesCombo.Items.Count - 1 do
begin
{ create radio button and set the basic properties }
RadioButton := TNewRadioButton.Create(WizardForm);
RadioButton.Parent := WizardForm.SelectComponentsPage;
RadioButton.Left := WizardForm.TypesCombo.Left;
RadioButton.Top := WizardForm.TypesCombo.Top + I * RadioButton.Height;
RadioButton.Width := WizardForm.TypesCombo.Width;
{ check just the first item }
RadioButton.Checked := I = 0;
RadioButton.Caption := WizardForm.TypesCombo.Items[I];
{ the Tag property substitutes the index property }
RadioButton.Tag := I;
RadioButton.TabOrder := I;
RadioButton.OnClick := @OnTypeChange;
end;
{ hide the TypesCombo combo box }
WizardForm.TypesCombo.Visible := False;
{ if you're not using the "iscustom" flag in any type entry, you can remove }
{ the following lines, because they resize and reposition the check list box }
{ for component selection, which is hidden, if you don't use "iscustom" flag }
I := WizardForm.ComponentsList.Top -
(RadioButton.Top + RadioButton.Height + 8);
WizardForm.ComponentsList.Top := RadioButton.Top + RadioButton.Height + 8;
WizardForm.ComponentsList.Height := WizardForm.ComponentsList.Height + I;
end;
And the result (includes the iscustom
component list):
Or you can use e.g. check list box, which is able to contain radio buttons in Inno Setup:
[Code]
procedure OnTypeChange(Sender: TObject);
begin
{ set the item index in hidden TypesCombo }
WizardForm.TypesCombo.ItemIndex := TNewCheckListBox(Sender).ItemIndex;
{ notify TypesCombo about the selection change }
WizardForm.TypesCombo.OnChange(nil);
end;
procedure InitializeWizard;
var
I: Integer;
CheckListBox: TNewCheckListBox;
begin
{ create the TNewCheckListBox object and set the basic properties }
CheckListBox := TNewCheckListBox.Create(WizardForm);
CheckListBox.Parent := WizardForm.SelectComponentsPage;
CheckListBox.Left := WizardForm.TypesCombo.Left;
CheckListBox.Top := WizardForm.TypesCombo.Top;
CheckListBox.Width := WizardForm.TypesCombo.Width;
CheckListBox.Height := CheckListBox.MinItemHeight *
WizardForm.TypesCombo.Items.Count + 4;
CheckListBox.TabOrder := 0;
{ assign the selection change event }
CheckListBox.OnClickCheck := @OnTypeChange;
{ add radio buttons from all TypesCombo items, select the first item }
for I := 0 to WizardForm.TypesCombo.Items.Count - 1 do
CheckListBox.AddRadioButton(WizardForm.TypesCombo.Items[I],
'', 0, I = 0, True, nil);
{ hide the TypesCombo combo box }
WizardForm.TypesCombo.Visible := False;
{ if you're not using the "iscustom" flag in any type entry, you can remove }
{ the following lines, because they resize and reposition the check list box }
{ for component selection, which is hidden, if you don't use "iscustom" flag }
I := WizardForm.ComponentsList.Top -
(CheckListBox.Top + CheckListBox.Height + 8);
WizardForm.ComponentsList.Top := CheckListBox.Top +
CheckListBox.Height + 8;
WizardForm.ComponentsList.Height := WizardForm.ComponentsList.Height + I;
end;
And the result (includes the iscustom
component list):
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With