Search code examples
inno-setuppascalscript

How can I add a check box for optional files during install in Inno Setup?


I'm trying to make a custom checkbox in my custom page (because it's a one page installer), is needed only a checkbox without dialogs or anything, the installer that I'm trying to compile is very linear and simple.

I want to bind FILE3.EXE on a checkbox in this way: if checkbox is checked copy the file (FILE3.EXE) in DestDir, otherwise if checkbox is unchecked skip the file (FILE3.EXE) during installation.

This is the code that I used, obviously the checkbox code is missing because I'm not able to do that

[Files]
Source: FILE1.EXE; DestDir: {app};
Source: FILE2.EXE; DestDir: {app};
Source: FILE3.EXE; DestDir: {app}; //OPTIONAL
[Code]
procedure ExitProcess(uExitCode: UINT);
external 'ExitProcess@kernel32.dll stdcall';

var
  MainPage : TWizardPage;
  FolderToInstall : TEdit;
  InstallLocation : String;

procedure CancelClick(Sender: TObject);
begin
  if ExitSetupMsgBox then
  begin
    ExitProcess(0);
  end;
end;

procedure BrowseClick(Sender : TObject);
var
  Dir : String;

begin
  Dir := FolderToInstall.Text;
  if BrowseForFolder('Browse',Dir,false) then
    FolderToInstall.Text := Dir;
  WizardForm.DirEdit.Text := Dir;
end;

procedure InitializeWizard();
var
  LabelFolder : TLabel;
begin
  MainPage := CreateCustomPage(wpWelcome,'','');
  LabelFolder := TLabel.Create(MainPage);
  LabelFolder.Parent := WizardForm;
  LabelFolder.Top := 164;
  LabelFolder.Left := 6;
  LabelFolder.Caption := 'Directory:'

  FolderToInstall := TEdit.Create(MainPage);
  FolderToInstall.Parent := WizardForm;
  FolderToInstall.Top := 182;
  FolderToInstall.Left := 85;
  FolderToInstall.Width := 380;
  FolderToInstall.Text :=  WizardDirValue;
  FolderToInstall.ReadOnly := True;
end;

Solution

  • You need to make a Check function which will return state of the check box from the [Code] section of your script. Something like this might do what you want, but before the code script I would correct you in the following:

    • use TNew... classes where you're able to, so in your case use TNewEdit instead of TEdit
    • use TWizardPage.Surface as a Parent if you want to have a certain component on the page (here I'm not sure if that's your intention, just pointing this out :-)
    • format your code, it doesn't need to be so flat

    In the following example I've used Check function called InstallHelpFile for conditional install of a certain file, in this case MyProg.chm. The Check function works simply; when you return True to the function, the file is processed, skipped is when you return False.

    [Setup]
    AppName=My Program
    AppVersion=1.5
    DefaultDirName={pf}\My Program
    OutputDir=userdocs:Inno Setup Examples Output
    
    [Files]
    Source: "MyProg.exe"; DestDir: "{app}"
    Source: "MyProg.chm"; DestDir: "{app}"; Check: InstallHelpFile;
    
    [Code]
    var
      InstallHelpCheckBox: TNewCheckBox;  
    
    procedure InitializeWizard;
    var  
      LabelFolder: TLabel;  
      MainPage: TWizardPage;  
      FolderToInstall: TNewEdit;  
    begin
      MainPage := CreateCustomPage(wpWelcome, '', '');
      LabelFolder := TLabel.Create(MainPage);
      LabelFolder.Parent := WizardForm;
      LabelFolder.Top := 164;
      LabelFolder.Left := 6;
      LabelFolder.Caption := 'Directory:'
    
      FolderToInstall := TNewEdit.Create(MainPage);
      FolderToInstall.Parent := MainPage.Surface;
      FolderToInstall.Top := 182;
      FolderToInstall.Left := 85;
      FolderToInstall.Width := 380;
      FolderToInstall.Text :=  WizardDirValue;
      FolderToInstall.ReadOnly := True;
    
      InstallHelpCheckBox := TNewCheckBox.Create(MainPage);
      InstallHelpCheckBox.Parent := MainPage.Surface;
      InstallHelpCheckBox.Top := FolderToInstall.Top + FolderToInstall.Height + 8;
      InstallHelpCheckBox.Left := FolderToInstall.Left;
      InstallHelpCheckBox.Width := FolderToInstall.Width;
      InstallHelpCheckBox.Caption := 'Install help file';
    end;
    
    function InstallHelpFile: Boolean;
    begin
      { here is the Check function used above; if you return True to this }
      { function, the file will be installed, when False, the file won't }
      { be installed }
      Result := InstallHelpCheckBox.Checked;
    end;