How to change the Next/Cancel button captions on a custom page? - inno-setup

How to change the Next/Cancel button captions on a custom page ?

You can use:
procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID = YourPageName.ID then begin
WizardForm.NextButton.Caption := SetupMessage(msgButtonInstall);
//or := 'YourNewNextButtonText' or := ExpandConstant('{cm:YourCmTitleForNext}')
WizardForm.CancelButton.Caption := ExpandConstant('{cm:YourCmTitleForCancel}');
end; //begin + end to make changes only for this single page
end;

Related

Inno-setup, Display a custom message box during extraction of temporary files

I'm trying to create a custom message box saying something like "Loading" or "Extracting" during the Extraction of temporary files in InnoSetup. Is this possible? If not, please come up with suggestions on how I can proceed.
I'm extracting the files temporarily because the files are installers. Otherwise, I would have to extract them into for example documents, run them, and then remove them after my installer is finished.
After extraction, I'm using a batch file to run the different installers from tmp.
Anyway, what I'm struggling with is that After I've created a Form and a label for that form, the label is displayed first when the "ExtractTemporaryFiles" is finished.
This is my code:
`[Code]
var
ResultCode: Integer;
Form: TSetupForm;
Label1: TLabel;
function InitializeSetup: Boolean;
begin
Form := CreateCustomForm;
Form.ClientWidth := ScaleX(500);
Form.ClientHeight := ScaleY(500);
Form.Caption := 'Loading.. ';
Label1 := TLabel.Create(Form);
Label1.Parent := Form;
Label1.Caption := 'Extracting.. ';
Label1.Left := ScaleX(16);
Label1.Top := ScaleY(16);
Label1.Width := ScaleX(224);
Label1.Height := ScaleY(32);
Form.show()
end;
end;
procedure DeinitializeSetup;
begin
Form.showModal()
ExtractTemporaryFiles('{app}\*');
if Exec(ExpandConstant('{tmp}\')+'{app}\runAll2.bat', 'runascurrentuser', '',SW_SHOWNORMAL, ewWaitUntilTerminated, ResultCode) then begin
MsgBox('Finished! Press ok', mbError, MB_OK)
end
else begin
MsgBox('Something went wrong! Press ok', mbError, MB_OK)
end;
end;`
Can you please help me out guys?
//InnoSetup noob :)

How to show password while typing in Inno Setup?

I have created a setup with Inno Setup via Wizard method and used a password. But when I ran setup and in Password screen, password is hidden while typing (****). I want password to be shown while typing.
Can somebody guide me?
Set TPasswordEdit.Password property of WizardForm.PasswordEdit to False:
<event('InitializeWizard')>
procedure InitializeWizardRevealPassword();
begin
WizardForm.PasswordEdit.Password := False;
end;
If you want to allow the user to toggle the display of the password, you have to add a custom checkbox.
var
ShowPasswordCheck: TNewCheckBox;
procedure ShowPasswordCheckClick(Sender: TObject);
begin
WizardForm.PasswordEdit.Password := not ShowPasswordCheck.Checked;
end;
<event('InitializeWizard')>
procedure InitializeWizardRevealPassword();
begin
ShowPasswordCheck := TNewCheckBox.Create(WizardForm);
ShowPasswordCheck.Parent := WizardForm.PasswordEdit.Parent;
ShowPasswordCheck.Caption := '&Show password';
ShowPasswordCheck.Top :=
WizardForm.PasswordEdit.Top + WizardForm.PasswordEdit.Height + ScaleY(8);
ShowPasswordCheck.Height := ScaleY(ShowPasswordCheck.Height);
ShowPasswordCheck.Checked := not WizardForm.PasswordEdit.Password;
ShowPasswordCheck.OnClick := #ShowPasswordCheckClick;
end;

Component Caption + Custom Component Page height

I have two #Martin Prikryl codes that I can't get them to work together.
Larger "Select Components" page in Inno Setup
Long descriptions on Inno Setup components
I followed all the instructions Martin said about the #TLama code, but the codes didn't work together.
Component captions do not appear when I activate the code to change the page height.
I would like a way to merge them and make them work together.
I solved the problem by adding the page's custom height value to the CompLabel.Top of the component captions code.
I also had to change the procedure to CurPageChanged and created an <event( ' ' )> to merge the two codes and created a directive #define CustomPageHeight "ScaleY(200)" to define the custom height of the page.
// Set page height here
#define CustomPageHeight "ScaleY(200)"
[Code]
// Final part of code for component captions
Var StopCall: Boolean;
<event('CurPageChanged')> // Added event here
Procedure CurPageChanged1(CurPageID: Integer);
Begin
If StopCall = false Then
Begin
If CurPageID = wpWelcome Then
Begin
SetTimer(0, 0, 50, CreateCallback(#HoverTimerProc));
CompLabel := TLabel.Create(WizardForm);
CompLabel.Parent := WizardForm.SelectComponentsPage;
CompLabel.Left := WizardForm.ComponentsList.Left;
CompLabel.Width := WizardForm.ComponentsList.Width;
CompLabel.Height := ScaleY(37); // Added here
CompLabel.Top := WizardForm.ComponentsList.Top + WizardForm.ComponentsList.Height + {#CustomPageHeight} - CompLabel.Height;
CompLabel.AutoSize := False;
CompLabel.WordWrap := True;
WizardForm.ComponentsList.Height := WizardForm.ComponentsList.Height - CompLabel.Height - ScaleY(2);
StopCall := true;
End;
End;
End;
// Code for custom height page
var
CompPageModified: Boolean;
<event('CurPageChanged')> // Added event here
procedure CurPageChanged2(CurPageID: Integer);
begin
if CurpageID = wpSelectComponents then
begin // Changed here
WizardForm.Height := WizardForm.Height + {#CustomPageHeight};
CompPageModified := True;
end
else
if CompPageModified then
begin // Changed here
WizardForm.Height := WizardForm.Height - {#CustomPageHeight};
CompPageModified := False;
end;
end;

Inno Setup ComboBox how to store/access values

I am creating a custom InputQueryWizardPage with a ComboBox and trying to store values like so:
[Code]
var
//Define global variables
InfoPage: TInputQueryWizardPage;
ComboBox: TNewComboBox;
strComboValue: String;
//Store the ComboBox string value
procedure ComboChange(Sender: TObject);
begin
case ComboBox.ItemIndex of
0:
begin
strComboValue := 'First Entry';
end;
1:
begin
strComboValue := 'Second Entry';
end;
...
end;
end;
procedure InitializeWizard();
var
ComboLabel: TNewStaticText;
//Define the Equipment Information page
InfoPage := CreateInputQueryPage(wpSelectTasks,
'Equipment Information', 'Please enter the equipment information?',
'Please enter the equipment connected, then click Next.');
InfoPage.Add('Location:', False);
InfoPage.Add('Type:', False);
ComboBox := TNewComboBox.Create(InfoPage);
ComboBox.Parent := InfoPage.Surface;
ComboBox.Top := InfoPage.Edits[1].Top + (InfoPage.Edits[1].Top - InfoPage.Edits[0].Top);
ComboBox.Width := (InfoPage.Edits[0].Width / 2) - ScaleX(10);
ComboBox.Style := csDropDown;
ComboBox.Items.Add('First Entry');
ComboBox.Items.Add('Second Entry');
...
ComboBox.OnChange := #ComboChange;
ComboLabel := TNewStaticText.Create(WizardForm);
ComboLabel.Caption := 'Equipment:';
ComboLabel.Top := ComboBox.Top - ScaleY(16);
ComboLabel.Parent := InfoPage.Surface;
end;
The trouble is that selecting the entry in the ComboBox does not store the values into the string so that I can call them later in the installation. Could someone tell me what I'm doing wrong?
procedure ComboChange(Sender: TObject);
and
ComboBox.OnChange := #ComboChange;
are not required at all. To access the stored value from the ComboBox, simply read ComboBox.Text. Thanks #TLama.
First ComboChange should be a TNotifyEvent. #ComboChange is a pointer. It shouldn't compile unless TNewComboBox redefines it as a pointer, which it doesn't having checked the inno help.
which may be why it's not working.
as pointer :) This (when it's an event):
procedure ComboChange(Sender: TObject);
begin
case ComboBox.ItemIndex of
0:
begin
strComboValue := 'First Entry';
end;
1:
begin
strComboValue := 'Second Entry';
end;
...
end;
end;
Is going to get extremely tedious.
All you need is:
procedure ComboChange(Sender: TObject);
begin
strComboValue := 'Whatever is default';
if ComboBox.ItemIndex >= 0 then
strComboValue := ComboBox.Items[ComboBox.ItemIndex];
end;

Show text during installation process with inno-setup

I am searching for a possibility to show a user a note on how to proceed during install of a redistributable.
Background:
I have some Components that require 3rd party installations which are quit complex. If a user selects one of these components a message box with instructions are shown. After this box the resistributables are executet via exec/shellExec with 'ewWaitUntilTerminated'. Unfortunately the user cannot see the box during installation.
I tried to just open the notes in notepad and use 'ewNoWait', but than it will not close automatically after each installation of the redistributalbe. The user can chose more than one of these components and this help should only be visible during the specific installation. To kill the notepad with taskkill is not an option, it could kill opened notepad from the user.
Is there any elegant way to get such behaviour?
Create TOutputProgressWizardPage with function http://www.jrsoftware.org/ishelp/index.php?topic=isxfunc_createoutputprogresspage
function CreateOutputProgressPage(const ACaption, ADescription: String): TOutputProgressWizardPage;
[Code]
var
ProgressPage: TOutputProgressWizardPage;
procedure InitializeWizard;
begin
ProgressPage := CreateOutputProgressPage('Finalization of installation','');
end;
procedure CurPageChanged(CurPageID: Integer);
var
I: Integer;
begin
// Page is shown after installation when Finish page is shown
if CurPageID = wpFinish then begin
ProgressPage.SetText('Installing some 3rd party stuff...', '');
ProgressPage.SetProgress(0, 0);
ProgressPage.Show;
try
// Use exec/shellExec here to execute 3rd party app
// Also you can adjust progress barr position here:
for I := 0 to 10 do begin
ProgressPage.SetProgress(I, 10);
Sleep(100);
end;
finally
ProgressPage.Hide;
end;
end else
Result := True;
end;
I finally found a solution for my problem. On the basis of the answer of Slappy I used a std MsgPage and resize it for my need. Thx to TLama for his answer in a different topic for the resize code!
[Code]
var
RedistPage: TOutputMsgWizardPage;
DefaultTop,
DefaultLeft,
DefaultHeight,
DefaultBackTop,
DefaultNextTop,
DefaultCancelTop,
DefaultBevelTop,
DefaultBeveledLabelTop,
DefaultInnerHeight,
DefaultOuterHeight: Integer;
procedure InitializeWizard();
var
ReadMe: AnsiString;
begin
DefaultTop := WizardForm.Top;
DefaultLeft := WizardForm.Left;
DefaultHeight := WizardForm.Height;
DefaultBackTop := WizardForm.BackButton.Top;
DefaultNextTop := WizardForm.NextButton.Top;
DefaultCancelTop := WizardForm.CancelButton.Top;
DefaultBevelTop := WizardForm.Bevel.Top;
DefaultBeveledLabelTop := WizardForm.BeveledLabel.Top;
DefaultOuterHeight := WizardForm.OuterNotebook.Height;
DefaultInnerHeight := WizardForm.InnerNotebook.Height;
// save the contents of Readme.txt (non Unicode) in a string and build custom page
try
ExtractTemporaryFiles('{tmp}\readme.txt');
if LoadStringFromFile(ExpandConstant('{tmp}\readme.txt'), ReadMe) then
RedistPage := CreateOutputMsgPage(wpReady,
'Information', 'Please read the following important information about the installation before continuing.',ReadMe);
except
ShowExceptionMessage;
end;
function ShouldSkipPage(PageID: Integer): Boolean;
begin
Result := False; // initialize result to not skip any page (not necessary, but safer)
if PageID = RedistPage.ID then // if the page that is asked to be skipped is your custom page, then...
Result := not IsTaskSelected('dexela_API'); // if the task is not selected, skip the page
end;
procedure ChangePageSize(HeightOffset: Integer);
begin
WizardForm.Top := DefaultTop - (HeightOffset - DefaultHeight) div 2;
WizardForm.Height := WizardForm.Height + (HeightOffset - DefaultHeight);
WizardForm.InnerPage.Height := WizardForm.InnerPage.Height + (HeightOffset - DefaultHeight);
WizardForm.InnerNotebook.Height := WizardForm.InnerNotebook.Height + (HeightOffset - DefaultHeight);
WizardForm.OuterNotebook.Height := WizardForm.OuterNotebook.Height + (HeightOffset - DefaultHeight);
WizardForm.CancelButton.Top := DefaultCancelTop + (HeightOffset - DefaultHeight);
WizardForm.NextButton.Top := DefaultNextTop + (HeightOffset - DefaultHeight);
WizardForm.BackButton.Top := DefaultBackTop + (HeightOffset - DefaultHeight);
WizardForm.Bevel.Top := DefaultBevelTop + (HeightOffset - DefaultHeight);
end;
procedure CurPageChanged(CurPageID: Integer);
var
ComponentsPageTextHeight: Integer;
begin
if (CurPageID = RedistPage.ID) and (IsTaskSelected('dexela_API'))then begin
ChangePageSize(650);
//Sleep(2000); // time for the user to recognize the text, before it is hidden by installer
// Extract all Dexela files and launch them.
try
ExtractTemporaryFiles('{tmp}\Setup.msi');
except
ShowExceptionMessage;
end;
ShellExec('',ExpandConstant('{tmp}\Setup.msi'), '', '',SW_SHOW, ewWaitUntilTerminated, ResultCode);
end;
end;

Resources