Today we will describe a process of creating custom wizard page in program installer. Though Inno Setup suggests pages which will cover your needs in most of the cases, sometimes you will need to create your own page during installation process.
Custom page can be created in [Code] section in InitializeWizard function:
[Code]
procedure InitializeWizard();
begin
authentication_form_CreatePage(wpLicense);
end;
wpLicense argument means that our custom page will be displayed after standard license page during installation process. All standard wizard pages have their predefined IDs. For instance, welcome page have ID equal to wpWelcome.
Now let’s look at the code which is creating custom page. First we need to define some variables which will be used:
var
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
ServerNameEdit: TEdit;
WindowsRadioButton: TRadioButton;
SqlRadioButton: TRadioButton;
UserEdit: TEdit;
PasswordEdit: TEdit;
And this is the function itself. In it you will need to create all the necessary controls like labels, buttons, etc.:
function authentication_form_CreatePage(PreviousPageId: Integer): Integer;
var
Page: TWizardPage;
begin
Page := CreateCustomPage(
PreviousPageId,
ExpandConstant('{cm:authentication_form_Caption}'),
ExpandConstant('{cm:authentication_form_Description}')
);
Label1 := TLabel.Create(Page);
with Label1 do
begin
Parent := Page.Surface;
Caption := ExpandConstant('{cm:authentication_form_Label1_Caption0}');
Left := ScaleX(16);
Top := ScaleY(0);
Width := ScaleX(84);
Height := ScaleY(17);
end;
Label2 := TLabel.Create(Page);
with Label2 do
begin
Parent := Page.Surface;
Caption := ExpandConstant('{cm: authentication_form_Label2_Caption0}');
Left := ScaleX(16);
Top := ScaleY(56);
Width := ScaleX(300);
Height := ScaleY(17);
end;
Label3 := TLabel.Create(Page);
with Label3 do
begin
Parent := Page.Surface;
Caption := ExpandConstant('{cm: authentication_form_Label3_Caption0}');
Left := ScaleX(56);
Top := ScaleY(136);
Width := ScaleX(70);
Height := ScaleY(17);
end;
Label4 := TLabel.Create(Page);
with Label4 do
begin
Parent := Page.Surface;
Caption := ExpandConstant('{cm: authentication_form_Label4_Caption0}');
Left := ScaleX(56);
Top := ScaleY(168);
Width := ScaleX(63);
Height := ScaleY(17);
end;
ServerNameEdit := TEdit.Create(Page);
with ServerNameEdit do
begin
Parent := Page.Surface;
Left := ScaleX(16);
Top := ScaleY(24);
Width := ScaleX(257);
Height := ScaleY(25);
TabOrder := 0;
Text := ExpandConstant('{cm: authentication_form_ServerNameEdit_Text0}');
end;
WindowsRadioButton := TRadioButton.Create(Page);
with WindowsRadioButton do
begin
Parent := Page.Surface;
Caption := ExpandConstant('{cm: authentication_form_WindowsRadioButton_Caption0}');
Left := ScaleX(16);
Top := ScaleY(88);
Width := ScaleX(225);
Height := ScaleY(17);
Checked := True;
TabOrder := 1;
TabStop := True;
end;
SqlRadioButton := TRadioButton.Create(Page);
with SqlRadioButton do
begin
Parent := Page.Surface;
Caption := ExpandConstant('{cm: authentication_form_SqlRadioButton_Caption0}');
Left := ScaleX(16);
Top := ScaleY(112);
Width := ScaleX(193);
Height := ScaleY(17);
TabOrder := 2;
end;
UserEdit := TEdit.Create(Page);
with UserEdit do
begin
Parent := Page.Surface;
Left := ScaleX(136);
Top := ScaleY(136);
Width := ScaleX(121);
Height := ScaleY(25);
TabOrder := 3;
Text := ExpandConstant('{cm: authentication_form_UserEdit_Text0}');
end;
PasswordEdit := TEdit.Create(Page);
with PasswordEdit do
begin
Parent := Page.Surface;
Left := ScaleX(136);
Top := ScaleY(168);
Width := ScaleX(121);
Height := ScaleY(25);
TabOrder := 4;
PasswordChar := '*';
Text := ExpandConstant('{cm: authentication_form_PasswordEdit_Text0}');
end;
with Page do
begin
OnNextButtonClick := @authentication_form_NextButtonClick;
end;
Result := Page.ID;
end;
Finally we will need handler for Next button click:
function authentication_form_NextButtonClick(Page: TWizardPage): Boolean;
begin
Result := True;
if ServerNameEdit.Text <> '' then
begin
if SqlRadioButton.Checked then
begin
if UserEdit.Text = '' then
begin
MsgBox('You should enter user name', mbError, MB_OK);
Result := False;
end
else
begin
if PasswordEdit.Text = '' then
begin
MsgBox('You should enter password', mbError, MB_OK);
Result := False;
end
end
end
end
else
begin
MsgBox('You should enter path to SQL Server Database', mbError, MB_OK);
Result := False;
end;
end;
The text labels and messages need to be defined in special section:
[CustomMessages]
authentication_form_Caption=SQL Server Database Setup
authentication_form_Description=Choose SQL Server database you will be using (ask your administrator about its parameters)
authentication_form_Label1_Caption0=Server Name:
authentication_form_Label2_Caption0=Enter Path to SQL Server (e.g. .\SQLEXPRESS; DEVSERVER)
authentication_form_Label3_Caption0=User name:
authentication_form_Label4_Caption0=Password:
authentication_form_ServerNameEdit_Text0=
authentication_form_WindowsRadioButton_Caption0=Use Windows Authentication
authentication_form_SqlRadioButton_Caption0=Use SQL Authentication
authentication_form_UserEdit_Text0=
authentication_form_PasswordEdit_Text0=
After such a long work you want to see probably what we will receive at the end? Such a window:

As you can see to receive this nice window you have to write a large amount of code and this is the case where some automated tool like ISTool can be helpful for you.