Inno Setup c'est bien, mais la documentation est un peu brouillon et trouver des informations précises n'est pas chose facile.
Pour la prochaine version de Pombo, j'avais besoin d'avoir une liste contenant plusieurs choix sur une seule page, et surtout pouvoir utiliser l'élément sélectionné par la suite.

Voici le code source de getmark.iss, pour l'utiliser, il suffit d'ajouter cette instruction dans la section [Code] :

#include "getmark.iss"

Avant d'entrer plus dans les détails, pour récupérer l'élément sélectionné (pour les section [Files] ou [Registry] par exemple) : {code:GetTheMark} renverra "ASUS".


Dans les entrailles du monstre script

Voici les différents composants :

  • une procédure standard InitializeWizard : ajout de la page personnalisée dans l'installeur global
  • une procédure standard CurPageChanged : pour déterminer quand il y a un changement de page (boutons Précédent et Suivant)
  • une procédure CreatePageStealthMode : création de la page personnalisée
  • une procédure OnPageStealthModeClicked : action(s) à effectuée(s) lorsqu'un choix est fait dans la liste
  • une fonction GetTheMark() : permet de récupérer le choix de la liste pour les autres étapes/sections

Les procédures suivantes s'occupent de l'intégration de la page personnalisée.

C'est simple, ici on vient ajouter la page personnalisée à l'installeur :

procedure InitializeWizard;
begin
    CreatePageStealthMode;
end;

La portion de code suivante sert uniquement à désactiver le bouton Suivant lorsque l'on est sur la page personnalisée afin d'obligé l'utilisateur à faire un choix :

procedure CurPageChanged(CurPageID: Integer);
begin
    if CurPageID = PageStealthMode.ID then
        if ChosenMark.ItemIndex = -1 then
            WizardForm.NextButton.Enabled := False;
end;

Les procédures suivante s'occupent de la création et de la gestion de la page personnalisée.

La fonction CreateCustomPage() permet de spécifier après quelle page standard il faut insérer la nôtre, un titre et un texte explicatif. Ici, je choisis d'afficher la page personnalisée juste après la page qui affiche la licence (wpLicense). La liste de choix est une simple TListBox ajoutée en pleine page :

procedure CreatePageStealthMode;
var
    j : Integer;
begin
    PageStealthMode := CreateCustomPage(wpLicense, ExpandConstant('{cm:marque_title}'), ExpandConstant('{cm:marque_texte}'));
    ChosenMark := TListBox.Create(PageStealthMode);
    ChosenMark.Width := PageStealthMode.SurfaceWidth;
    ChosenMark.Height := PageStealthMode.SurfaceHeight - 10;
    ChosenMark.Parent := PageStealthMode.Surface;
    { Assignement de la procédure lorsqu'un élément est choisi. }
    ChosenMark.OnClick := @OnPageStealthModeClicked;
    for j := 0 to High(Marks) do begin
        ChosenMark.Items.Add(Marks[j]);
    end;
end;

On stocke l'élément sélectionné dans la variable TheMark puis on réactive le bouton Suivant, ça peut toujours être pratique :

procedure OnPageStealthModeClicked(Sender: TObject);
var
    list : TListBox;
begin
    list := TListBox(Sender);
    TheMark := list.Items[list.ItemIndex];
    WizardForm.NextButton.Enabled := True;
end;

Il nous reste la fonction GetTheMark(), qui est on ne peut plus simple :

function GetTheMark(Param: String): String;
begin
    Result := TheMark;
end;

Elle sert uniquement à avoir accès à l'élément sélectionné en dehors du code, pour les autres pages/étapes de l'installeur.