Mykron
Mykron

Reputation: 41

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?

Upvotes: 2

Views: 3127

Answers (2)

Mykron
Mykron

Reputation: 41

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;

Upvotes: 0

Slappy
Slappy

Reputation: 5472

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;

Upvotes: 1

Related Questions