Пользовательская страница Inno Setup с несколькими целевыми папками, которые ведут себя как обычная страница выбора папок - PullRequest
0 голосов
/ 14 декабря 2018

У меня следующий код (взят из Использовать два / несколько выбранных каталогов с пользовательской страницы в разделе «Файлы» ):

[Code]
var
  DirPage: TInputDirWizardPage;

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

procedure InitializeWizard;
var
  S1, S2: String; 
begin
  S1 := SetupMessage(msgSelectDirDesc);
  StringChangeEx(S1, '[name]', 'ProgramName', false);
  S2 := SetupMessage(msgSelectDirLabel3);
  StringChangeEx(S2, '[name]', 'ProgramName', false);

  { create a directory input page }
  DirPage := CreateInputDirPage(
    wpSelectDir, SetupMessage(msgWizardSelectDir), S1, S2, False, '');
  { add directory input page items }
  DirPage.Add('Path to Apache:');
  DirPage.Add('Path to PHP:');
  DirPage.Add('Path to Server Files:');
  { assign default directories for the items from the previously stored data; if }
  { there are no data stored from the previous installation, use default folders }
  { of your choice }
  DirPage.Values[0] := GetPreviousData('Directory1', 'C:\Apache');
  DirPage.Values[1] := GetPreviousData('Directory2', 'C:\PHP');
  DirPage.Values[2] := GetPreviousData('Directory3', 'C:\Apache\htdocs\Server Files');
end;

procedure RegisterPreviousData(PreviousDataKey: Integer);
begin
  { store chosen directories for the next run of the setup }
  SetPreviousData(PreviousDataKey, 'Directory1', DirPage.Values[0]);
  SetPreviousData(PreviousDataKey, 'Directory2', DirPage.Values[1]);
  SetPreviousData(PreviousDataKey, 'Directory3', DirPage.Values[2]);
end; 

Я бы хотел, чтобы это велось кактрадиционная страница выбора папки, поэтому при выборе папки Inno Setup должна сохранять имя папки по умолчанию, если оно не будет перезаписано пользователем вручную.То есть: если я выберу папку "C:\Program Files\", она должна сохранить исходную папку как "C:\Program Files\PHP" или "C:\Program Files\Apache".Возможно ли это?

Ответы [ 2 ]

0 голосов
/ 03 января 2019

Для дальнейшего использования, вот полный рабочий код, основанный на ответе Мартина.Обязательно добавьте «DisableDirPage = yes» в раздел [Setup].

Примечание. Из-за ошибки приведенный ниже код работает только в версии InnoSetup в Юникоде.

[Code]
var
  DirPage: TInputDirWizardPage;
  HiddenPage: TInputDirWizardPage;
  HiddenPage2: TInputDirWizardPage;
  HiddenPage3: TInputDirWizardPage;

procedure AppendDirBrowseClick(Sender: TObject);
begin
  HiddenPage.Values[0] := DirPage.Values[0];
  HiddenPage.Buttons[0].OnClick(HiddenPage.Buttons[0]);
  DirPage.Values[0] := HiddenPage.Values[0];
end;

procedure AppendDirBrowseClick2(Sender: TObject);
begin
  HiddenPage2.Values[0] := DirPage.Values[1];
  HiddenPage2.Buttons[0].OnClick(HiddenPage2.Buttons[0]);
  DirPage.Values[1] := HiddenPage2.Values[0];
end;

procedure AppendDirBrowseClick3(Sender: TObject);
begin
  HiddenPage3.Values[0] := DirPage.Values[2];
  HiddenPage3.Buttons[0].OnClick(HiddenPage3.Buttons[0]);
  DirPage.Values[2] := HiddenPage3.Values[0];
end;

function SkipPage(Sender: TWizardPage): Boolean;
begin
  Result := True;
end;

procedure InitializeWizard();
begin
  DirPage := CreateInputDirPage(
    wpSelectDir, SetupMessage(msgWizardSelectDir), '', '', False, '');

  DirPage.Add('Path to Apache:');
  DirPage.Add('Path to PHP:');
  DirPage.Add('Path to Server Files:');

  { assign default directories for the items from the previously stored data; if }
  { there are no data stored from the previous installation, use default folders }
  { of your choice }
  DirPage.Values[0] := GetPreviousData('Directory1', 'C:\Apache');
  DirPage.Values[1] := GetPreviousData('Directory2', 'C:\PHP');
  DirPage.Values[2] := GetPreviousData('Directory3', 'C:\Apache\htdocs\Server Files');

  DirPage.Buttons[0].OnClick := @AppendDirBrowseClick;
  DirPage.Buttons[1].OnClick := @AppendDirBrowseClick2;
  DirPage.Buttons[2].OnClick := @AppendDirBrowseClick3;

  HiddenPage := CreateInputDirPage(
    wpSelectDir, SetupMessage(msgWizardSelectDir), '', '', True, 'Apache');
  HiddenPage.Add('');
  HiddenPage.OnShouldSkipPage := @SkipPage;

  HiddenPage2 := CreateInputDirPage(
    wpSelectDir, SetupMessage(msgWizardSelectDir), '', '', True, 'PHP');
  HiddenPage2.Add('');
  HiddenPage2.OnShouldSkipPage := @SkipPage;

  HiddenPage3 := CreateInputDirPage(
    wpSelectDir, SetupMessage(msgWizardSelectDir), '', '', True, 'Server Files');
  HiddenPage3.Add('');
  HiddenPage3.OnShouldSkipPage := @SkipPage;
end;
0 голосов
/ 16 декабря 2018

Для получения поведения по умолчанию Просмотр кнопка на «Выбор места назначения» (запускается директивой AppendDefaultDirName ), для Просмотр кнопок на вашей пользовательской странице, установите эти параметры CreateInputDirPage:

  • AAppendDir до True
  • ANewFolderName на "имя папки по умолчанию "

Проблема в том, что это влияет на все поля ввода / кнопки.Хотя вы хотите повлиять только на первое поле ввода / кнопку (или вы хотите различный ANewFolderName для каждого поля / кнопки).


Чтобы изменить поведение только некоторых полей, вы должны переопределитьих функциональность с нуля.Хотя функциональность диалога просмотра не выставлена.Есть только BrowseForFolder функция , которая немного отличается.

var
  DirPage: TInputDirWizardPage;

procedure NormalBrowseClick(Sender: TObject);
var
  Directory: string;
begin
  Directory := DirPage.Values[TButton(Sender).Tag];
  if BrowseForFolder(SetupMessage(msgWizardSelectDir), Directory, False) then
  begin
    DirPage.Values[TButton(Sender).Tag] := Directory;
  end;
end;

procedure InitializeWizard();
begin
  DirPage := CreateInputDirPage(
    wpSelectDir, SetupMessage(msgWizardSelectDir), '', '', True, 'Apache');
  { add directory input page items }
  DirPage.Add('Path to Apache:');
  DirPage.Add('Path to PHP:');
  DirPage.Add('Path to Server Files:');

  DirPage.Buttons[1].Tag := 1;
  DirPage.Buttons[1].OnClick := @NormalBrowseClick;
  DirPage.Buttons[2].Tag := 2;
  DirPage.Buttons[2].OnClick := @NormalBrowseClick;
  { assign default directories for the items from the previously stored data; if }
  { there are no data stored from the previous installation, use default folders }
  { of your choice }
  DirPage.Values[0] := GetPreviousData('Directory1', 'C:\Apache');
  DirPage.Values[1] := GetPreviousData('Directory2', 'C:\PHP');
  DirPage.Values[2] := GetPreviousData('Directory3', 'C:\Apache\htdocs\Server Files');
end;

Чтобы получить точное поведение в том же диалоге «просмотра», вы можете взломать его, вызвавфункциональные возможности скрытой "Выберите место назначения" страницы или другой скрытой TInputDirWizardPage с различными настройками AAppendDir:

var
  DirPage: TInputDirWizardPage;
  HiddenPage: TInputDirWizardPage;

procedure AppendDirBrowseClick(Sender: TObject);
begin
  HiddenPage.Values[0] := DirPage.Values[0];
  HiddenPage.Buttons[0].OnClick(HiddenPage.Buttons[0]);
  DirPage.Values[0] := HiddenPage.Values[0];
end;

function SkipPage(Sender: TWizardPage): Boolean;
begin
  Result := True;
end;

procedure InitializeWizard();
begin
  DirPage := CreateInputDirPage(
    wpSelectDir, SetupMessage(msgWizardSelectDir), '', '', False, '');

  DirPage.Add('Path to Apache:');
  DirPage.Add('Path to PHP:');
  DirPage.Add('Path to Server Files:');

  { assign default directories for the items from the previously stored data; if }
  { there are no data stored from the previous installation, use default folders }
  { of your choice }
  DirPage.Values[0] := GetPreviousData('Directory1', 'C:\Apache');
  DirPage.Values[1] := GetPreviousData('Directory2', 'C:\PHP');
  DirPage.Values[2] := GetPreviousData('Directory3', 'C:\Apache\htdocs\Server Files');

  DirPage.Buttons[0].OnClick := @AppendDirBrowseClick;

  HiddenPage := CreateInputDirPage(
    wpSelectDir, SetupMessage(msgWizardSelectDir), '', '', True, 'Apache');
  HiddenPage.Add('');
  HiddenPage.OnShouldSkipPage := @SkipPage;
end;

Код требует Unicode-версию Inno Setup.Вызов HiddenPage.Buttons[0].OnClick странно не работает в версии Ansi.

...