Mit InnoSetup eine weitere Datei abfragen

Mit InnoSetup eine weitere Datei abfragen


Die Aufgabe ist folgende: Während der Installation einer Software soll der User eine weitere Datei angeben. Es kann verschiedene Gründe geben, warum der Nutzer schon zu Installationszeiten eine Datei angeben soll. Das Setup kann den User z.B. nach einer vorhandenen Lizenzdatei fragen. In diesem Post will ich zeigen wie man in InnoSetup ein Fenster der Installation hinzufügen kann, das nach einer solchen Datei fragt. Dabei lasse ich offen, was mit der Datei anschließend passieren soll.

Als erstes muss dafür gesorgt werden, dass so ein Fenster erstellt wird. Dazu erstelle ich ein Fenster vom Typ TInputFileWizardPage. Fenster diesen Typs bringen eine Eingabemaske und ein Button zum Suchen von Dateien mit. Ich kann hier dann einfach angeben, welche Filter beim Aussuchen der Dateien verwendet werden sollen. Das ganze packe ich in einer eigenen Funktion:

function CreatePageAskForPath(PreviousPageId: Integer): Integer;
var
  Page: TInputFileWizardPage;
begin
  // https://jrsoftware.org/ishelp/index.php?topic=isxfunc_createinputfilepage
  Page := CreateInputFilePage(
    PreviousPageId, 
    'Select license file', 
    'Selecting license file',
    'Giving me finally the license file');

  Page.Add(
    '&Location of license.lic',                // caption
    'License Files|*.lic|All files|*.*',     // filters
    '.lic');                                    // default extension

  // Checks durchführen bevor es dann in nächste Fenster geht
  Page.OnNextButtonClick := @LicensePage_OnNextButtonClick;

  Result := Page;
  exit;
end;

Damit das Fenster dann überhaupt sichtbar wird, muss ich diese Funktion in der InitializeWizard-Funktion aufrufen:

procedure InitializeWizard();
begin
  LicensePage := CreatePageAskForPath(wpWelcome);
end;

Wie man sieht, rufe ich die Funktion mit dem Parameter wpWelcome auf. Dieser Wert wird in der Funktion CreatePageAskForPath an die Funktion CreateInputFilePage weitergegeben. Damit wird InnoSetup gesagt, wann das Lizenz-Fenster aufgerufen werden soll und zwar nach dem Willkommen-Fenster. Wenn man das Fenster wann anders aufrufen möchte, muss man hier eine andere Page-ID angeben.

Die Variable LicensePage ist hier eine globale Variable, die ich direkt hinter [Code] eingeführt habe. Diese wird für die Funktion LicensePage_OnNextButtonClick benötigt um den Wert der Eingabemaske auszulesen:

[Code]

var
  LicensePage: TInputFileWizardPage;
  LicenseLocation: String;

Nun zur Funktion LicensePage_OnNextButtonClick. Bisher habe ich nur ein Fenster bei dem ich die Lizenzdatei angeben kann. Doch möchte ich auch wissen ob der User überhaupt eine Datei angegeben hat und ob das, was der User in dem Fenster angegeben hat, überhaupt existiert. Diese Abfrage soll durchgeführt werden wenn der User auf “Weiter” klickt.

Bei InnoSetup gibt es zwei Möglichkeiten: Man führt die Abfrage in der Funktion NextButtonClick durch oder man erstell eine eigene Funktion und verweist mit der Eigenschaft OnNextButtonClick einer TWizardPage auf diese Funktion hin. Ich habe mich für zweiteres entschieden:

function LicensePage_OnNextButtonClick(Page: TWizardPage): Boolean;
begin
  Result := True;
  
  // Den Wert aus der License-Eingabemaske auslesen
  LicenseLocation := LicensePage.Values[0];
  
  if VarIsEmpty(LicenseLocation) then
  begin
    MsgBox('Error: License path is empty.', mbCriticalError, MB_OK);
    Result := False;
    exit;
  end;

  if not FileExists(LicenseLocation) then
  begin  
    MsgBox('Error: The given license file ' + LicenseLocation + ' could not be read. Please check if file exists.', mbCriticalError, MB_OK);
    Result := False;
    exit;
  end;
end;

Jetzt muss man die verschiedenen Teile im Code nur noch richtig anordnen damit InnoSetup beim Bauen nicht meckert. So sieht es bei mir dann aus:

[Code]

var
  LicensePage: TInputFileWizardPage;
  LicenseLocation: String;

function LicensePage_OnNextButtonClick(Page: TWizardPage): Boolean;
begin
    // ...
end;

function CreatePageAskForPath(PreviousPageId: Integer): Integer;
var
  Page: TInputFileWizardPage;
begin
    // ...
end;

procedure InitializeWizard();
begin
  LicensePage := CreatePageAskForPath(wpWelcome);
end;

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.