Использовать два / несколько выбранных каталогов с пользовательской страницы в разделе "Файлы"

Мне нужно создать пользовательскую страницу из двух пунктов назначения.

Я сделал:

#define MyAppName "TESTPROG"
[Setup]

AppName={#MyAppName}
DefaultDirName=C:\test\{#MyAppName}
DefaultGroupName={#MyAppName}

[Code]
var
  Page: TInputDirWizardPage;
  DataDir: String;

procedure InitializeWizard;
begin
  Page := CreateInputDirPage(wpWelcome,
    'Select Personal Data Location', 'Where should personal data files be stored?',
    'Personal data files will be stored in the following folder.'#13#10#13#10 +
    'To continue, click Next. ' +
      'If you would like to select a different folder, click Browse.',
    False, 'New Folder');

  Page.Add('Local APP');
  Page.Add('Local Storage');

  Page.Values[0] := ('C:\My Program');
  Page.Values[1] := ('D:\My Program');

  DataDir := Page.Values[0]; 
end;

Мне нужно знать, как и где я устанавливаю DefaultDirName с Page.Values[0] а также Page.Values[1]

Мне это нужно, потому что часть моих файлов будет в папке, а другая - в другой.

Например:

[Files]
Source: C:\TEST\DLL1.bat; DestDir: Page.Values[0]\sys1;
Source: C:\TEST\DLL2.bat; DestDir: Page.Values[1]\sys2;

1 ответ

Решение

Используйте скриптовую константу:

[Files]
Source: C:\TEST\DLL1.bat; DestDir: "{code:GetDir|0}\sys1"
Source: C:\TEST\DLL2.bat; DestDir: "{code:GetDir|1}\sys2"

[Code]

var
  Page: TInputDirWizardPage;

function GetDir(Param: string): string;
begin
  Result := Page.Values[StrToInt(Param)];
end;

procedure InitializeWizard;
begin
  Page := CreateInputDirPage(...);
  ...
end;

Если вы хотите использовать один из (первых) путей из TInputDirWizardPage вместо пути со страницы "Выбор места назначения" у вас есть три варианта.

  1. Отключите страницу "Выбор места назначения", используя DisableDirPage директива:

    DisableDirPage=yes
    

    Скопируйте путь из TInputDirWizardPage на скрытую страницу "Выберите место назначения", когда пользователь нажимает кнопку " Далее":

    var
      Page: TInputDirWizardPage;
    
    function InputDirPageNextButtonClick(Sender: TWizardPage): Boolean;
    begin
      { Use the first path as the "destination path" }
      WizardForm.DirEdit.Text := Page.Values[0];
      Result := True;
    end;
    
    procedure InitializeWizard();
    begin
      Page := CreateInputDirPage(...);
      ...
      Page.OnNextButtonClick := @InputDirPageNextButtonClick;
    end;
    

    В дополнение к этому вы можете также рассмотреть возможность WizardForm.DirEdit к вашей пользовательской коробке. Таким образом, вы убедитесь, что 1) при повторной установке / обновлении ранее выбранное значение используется повторно; 2) /DIR переключатель командной строки работает. Об этом см. В разделе Как заставить переключатель командной строки Inno Setup /DIR работать с пользовательской страницей пути.

  2. Заменить все виды использования {app} постоянный с {code:GetDir|0},

    Сделать Inno Setup не создавать {app} путь с помощью CreateAppDir директива:

    CreateAppDir=no
    

    (Из этого следует DisableDirPage=yes).

    И файлы удаления должны быть сохранены в первом пути, используя UninstallFilesDir директива:

    UninstallFilesDir={code:GetDir|0}
    

    В отличие от 1), при таком подходе предыдущий путь установки не будет повторно использоваться для последующего обновления / переустановки. Чтобы реализовать это, см. Inno Setup Prompt user для папки и сохраните значение.

  3. Не используйте CreateInputDirPage, а лучше добавить второе поле ввода пути на странице "Выбор места назначения" (SelectDirPage).

Другие вопросы по тегам