Nyerguds
Nyerguds

Reputation: 5629

Add function execution into installer progress of inno setup

I'm making a patch for an old game (Command & Conquer 1, Win95 edition), and in some cases, executing the patch requires going through a function written in the Pascal script that could take quite a while.

At the moment, I execute this at the moment the page is changed to the "installing" page, so, after the user has selected all options and confirmed to install, right before the installer starts actually adding (and deleting) files.

procedure CurPageChanged(CurPageID: Integer);
begin
    if (CurPageID = wpInstalling) then
    begin
        // Rename all saveg_hi.### files to savegame.###
        renameSaveGames();
        // clean up the ginormous files mess left behind if the game was installed from the 'First Decade' compilation pack
        cleanupTFD();
    end;
end;

But since the process could be rather long, I'd prefer to somehow add it to the actual install progress bar. Is there any way to accomplish this?

Upvotes: 0

Views: 3684

Answers (1)

az01
az01

Reputation: 2018

You can control the ProgressGauge from the install page of the WizardForm. In the following script is shown how to update the progress bar from a loop (which you'll just replace with your actions). For safety are progress bar values like min, max and position saved before the custom actions are performed and restored when they're done.

[Code]
procedure CurPageChanged(CurPageID: Integer);
var
  I: Integer;
  ProgressMin: Longint;
  ProgressMax: Longint;
  ProgressPos: Longint;
begin
  if CurPageID = wpInstalling then
  begin
    // save the original "configuration" of the progress bar
    ProgressMin := WizardForm.ProgressGauge.Min;
    ProgressMax := WizardForm.ProgressGauge.Max;
    ProgressPos := WizardForm.ProgressGauge.Position;

    // output some status and setup the min and max progress values
    WizardForm.StatusLabel.Caption := 'Doing my own pre-install...';
    WizardForm.ProgressGauge.Min := 0;
    WizardForm.ProgressGauge.Max := 100;
    // here will be your time consuming actions with the progress update
    for I := 0 to 100 do
    begin
      WizardForm.FilenameLabel.Caption := 'I''m on ' + IntToStr(I) + '%';
      WizardForm.ProgressGauge.Position := I;
      Sleep(50);
    end;

    // restore the original "configuration" of the progress bar
    WizardForm.ProgressGauge.Min := ProgressMin;
    WizardForm.ProgressGauge.Max := ProgressMax;
    WizardForm.ProgressGauge.Position := ProgressPos;
  end;
end;

Upvotes: 6

Related Questions