componentsinno-setuppreviewpascalscript

Preview Inno Setup component on extra window


The following questions shows how to display an image depicting a selected components within the Inno Setup wizard window:
Enlarge Inno Setup component page only with preview and description

Instead, I'd like to modify the code to display the image on an separate window (512x400 dimensions).

Like this:

enter image description here


Solution

  • Building upon my answer to Long descriptions on Inno Setup components. You will need to copy HoverTimerProc and it's supporting functions and global variables.

    This answer modifies the HoverComponentChanged and InitializeWizard procedures to support an image window in addition to description labels.

    [Files]
    ...
    Source: Main.bmp; Flags: dontcopy
    Source: Additional.bmp; Flags: dontcopy
    Source: Help.bmp; Flags: dontcopy
    
    [Code]
    
    var
      CompLabel: TLabel;
      CompForm: TSetupForm;
      CompImage: TBitmapImage;
      LoadingImage: Boolean;
    
    procedure HoverComponentChanged(Item: Integer);
    var 
      Description: string;
      Image: string;
      ImagePath: string;
    begin
      case Item of
        0: begin Description := 'This is the description of Main Files'; Image := 'main.bmp'; end;
        1: begin Description := 'This is the description of Additional Files'; Image := 'additional.bmp'; end;
        2: begin Description := 'This is the description of Help Files'; Image := 'help.bmp'; end;
      else
        Description := 'Move your mouse over a component to see its description.';
      end;
      CompLabel.Caption := Description;
    
      if Image <> '' then
      begin
        // The ExtractTemporaryFile pumps the message queue, prevent recursion
        if not LoadingImage then
        begin
          LoadingImage := True;
          try
            ImagePath := ExpandConstant('{tmp}\' + Image);
            if not FileExists(ImagePath) then
            begin
              ExtractTemporaryFile(Image);
            end;
            CompImage.Bitmap.LoadFromFile(ImagePath);
          finally
            LoadingImage := False;
          end;
        end;
        CompForm.Left := WizardForm.Left + WizardForm.Width;
        CompForm.Top := WizardForm.Top;
        CompForm.Visible := True;
      end
        else
      begin
        CompForm.Visible := False;
      end;
    end;
    
    procedure InitializeWizard();
    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(32);
      CompLabel.Top :=
        WizardForm.ComponentsList.Top + WizardForm.ComponentsList.Height -
        CompLabel.Height;
      CompLabel.AutoSize := False;
      CompLabel.WordWrap := True;
      CompLabel.Anchors := [akLeft, akRight, akBottom];
    
      CompForm := CreateCustomForm;
      CompForm.ClientWidth := 512;
      CompForm.ClientHeight := 400;
      CompImage := TBitmapImage.Create(CompForm);
      CompImage.Parent := CompForm;
      CompImage.Top := 0;
      CompImage.Left := 0;
      CompImage.Width := CompForm.ClientWidth;
      CompImage.Height := CompForm.ClientHeight;
    
      WizardForm.ComponentsList.Height :=
        WizardForm.ComponentsList.Height - CompLabel.Height - ScaleY(8);
    end;
    

    Component preview window