Как заставить Inno Setup динамически устанавливать папку установки с информацией со страницы настраиваемого мастера? - PullRequest
0 голосов
/ 08 сентября 2018

В Inno Setup я добавил настраиваемую страницу мастера, где пользователь может вводить суффикс-код, который должен динамически добавляться в каталог по умолчанию.

Стандарт DefaultDirName - c:\MyApp. Когда пользователь добавляет суффикс 01 на дополнительной странице мастера, DefaultDirName должен измениться на c:\MyApp01.

Как это можно сделать? Очевидно, что я не могу использовать код в разделе [Setup], потому что код проверяется перед любой страницей мастера.

1 Ответ

0 голосов
/ 09 сентября 2018

Когда вы покидаете свою страницу «суффикса», добавьте суффикс к пути установки.

Кроме того, вам необходимо иметь дело с:

  • пользователем, возвращающимся на страницу суффикса и изменяющимсуффикс
  • переустановки (обновления) - мое решение просто не позволяет изменять суффикс для переустановок (полагаясь на поведение Inno Setup по умолчанию, когда у пользователя есть небольшой шанс изменить путь установки).
#define AppId "your-app-id"
#define SetupReg "Software\Microsoft\Windows\CurrentVersion\Uninstall\" + AppId + "_is1"
#define SetupAppPathReg "Inno Setup: App Path"

[Setup]
AppId={#AppId}
[Code]

function IsUpgrade: Boolean;
var S: string;
begin
  Result :=
    RegQueryStringValue(HKLM, '{#SetupReg}', '{#SetupAppPathReg}', S) or
    RegQueryStringValue(HKCU, '{#SetupReg}', '{#SetupAppPathReg}', S);
end;

var
  SuffixPage: TInputQueryWizardPage;

procedure InitializeWizard();
begin
  if not IsUpgrade then
  begin
    SuffixPage := CreateInputQueryPage(wpWelcome, 'Select suffix', '', '');
    SuffixPage.Add('Suffix', False);
  end;
end;

function NextButtonClick(CurPageID: Integer): Boolean;
begin
  { Add suffix to path, when leaving "suffix" page }
  if (SuffixPage <> nil) and (CurPageID = SuffixPage.ID) then
  begin
    WizardForm.DirEdit.Text := WizardForm.DirEdit.Text + SuffixPage.Values[0];
  end;
  Result := True;
end;

function BackButtonClick(CurPageID: Integer): Boolean;
var
  Suffix: string;
  P: Integer;
begin
  { When going back from "select dir" page }
  if (CurPageID = wpSelectDir) and (SuffixPage <> nil) then
  begin
    Suffix := SuffixPage.Values[0];
    P := Length(WizardForm.DirEdit.Text) - Length(Suffix) + 1;
    { ... and the path still contains the suffix [was not edited out by the user] ... }
    if Copy(WizardForm.DirEdit.Text, P, Length(Suffix)) = Suffix then
    begin
      { ... remove it form the path }
      WizardForm.DirEdit.Text := Copy(WizardForm.DirEdit.Text, 1, P - 1);
    end
      else
    { if the suffix was edited out by the user, clear suffix box }
    begin
      SuffixPage.Values[0] := '';
    end;
  end;
  Result := True;
end;

enter image description here

enter image description here

...