Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

cancel button not displayed for wizard page created with wpInfoAfter in inno setup

Tags:

inno-setup

I have created a custom wizard page in inno, which needs to be shown after installing the files to {app} folder. This is achieved by giving the wpInfoAfter. The problem is, its showing only the 'next' button, there is no cancel/back button, also the dialog's closing button on top right is also disabled. I understand that the back button isn't needed, as it needs to remove the files which are installed. Is there anyway the 'cancel' button can be displayed?

like image 378
anand Avatar asked Dec 18 '25 03:12

anand


1 Answers

The Cancel button has no functionality at the after install stage, because InnoSetup doesn't expect to do further actions, that would require cancel, after the installation process is done. So, even if you show the button against that fact, you would get a button without any action.

Personally I would prefer to collect the information needed to setup your database before the installation starts, because consider the situation when the user installs your application and simply cancel the after installation wizard (what can easily happen). Doing it before, you'll be able to force your users to fill what you need before they actually get to the application itself. But if you still want to do it after install, here is a workaround for that missing cancel button.

As a workaround, you can create your own custom button, that will be on a same position with the same functionality. Here is a sample script, simulating a cancel button and showing it only on the custom page which is laying after the installation process. It's just a workaround, because you'd need at least fix this:

  • enable the closing cross of the wizard form (it's disabled after the installation stage is done)
  • handle the ESC key shortcut somehow (it invokes the exit prompt dialog too, but I couldn't find a way how to workaround this)

[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program

[Code]
procedure ExitProcess(uExitCode: UINT);
  external '[email protected] stdcall';

var
  CustomPage: TWizardPage;
  CancelButton: TNewButton;

procedure OnCancelButtonClick(Sender: TObject);
begin
  // confirmation "Exit setup ?" message, if user accept, then... 
  if ExitSetupMsgBox then
  begin
    // stop and rollback actions you did from your after install
    // process and kill the setup process itself
    ExitProcess(0);
  end;  
end;

procedure InitializeWizard;
begin
  // create a custom page
  CustomPage := CreateCustomPage(wpInfoAfter, 'Caption', 'Description');
  // create a cancel button, set its parent, hide it, setup the bounds
  // and caption by the original and assign the click event
  CancelButton := TNewButton.Create(WizardForm);
  CancelButton.Parent := WizardForm;
  CancelButton.Visible := False;
  CancelButton.SetBounds(
    WizardForm.CancelButton.Left, 
    WizardForm.CancelButton.Top, 
    WizardForm.CancelButton.Width,
    WizardForm.CancelButton.Height
  );  
  CancelButton.Caption := SetupMessage(msgButtonCancel);  
  CancelButton.OnClick := @OnCancelButtonClick;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  // show your fake Cancel button only when you're on some of your after
  // install pages; if you have more pages use something like this
  // CancelButton.Visible := (CurPageID >= FirstPage.ID) and 
  //   (CurPageID <= LastPage.ID);
  // if you have just one page, use the following instead
  CancelButton.Visible := CurPageID = CustomPage.ID;
end;
like image 163
TLama Avatar answered Dec 21 '25 03:12

TLama