【问题标题】:Inno Setup custom page with multiple destination folders that behave like the normal folder select page具有多个目标文件夹的 Inno Setup 自定义页面,其行为类似于普通文件夹选择页面
【发布时间】:2018-12-14 17:40:05
【问题描述】:

我有以下代码(取自Use two/multiple selected directories from custom page in Files section):

[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"。这可能吗?

【问题讨论】:

    标签: inno-setup pascalscript


    【解决方案1】:

    要获得“选择目标位置”浏览按钮的默认行为(由AppendDefaultDirName directive触发),对于浏览按钮您的自定义页面,设置CreateInputDirPage的这些参数:

    • AAppendDirTrue
    • ANewFolderName 到“默认文件夹名称”

    问题是,这会影响所有输入框/按钮。虽然您只想影响第一个输入框/按钮(或者您希望每个框/按钮使用不同的ANewFolderName)。


    要仅修改某些框的行为,您必须从头开始重新实现它们的功能。虽然浏览对话框功能没有公开。只有BrowseForFolder function,略有不同。

    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 版本中不起作用。

    【讨论】:

    • 那么我假设 “您只想影响第一个输入框/按钮” 有错吗?然后使用第一部分中建议的简单解决方案。
    • 我想影响每个按钮的特定目录。 Button1 应将“Apache”、Button2“PHP”、Button3“Server Files”添加到浏览的路径中。所以我不能使用第一个代码示例(或者我不知道如何自定义它)。
    • 好的,我明白了。所以你可以使用第三部分的代码。只是你需要创建两个隐藏页面,每个页面都有AAppendDir = TrueANewFolderName的不同设置。
    • 这行得通,我已经用最终代码发布了答案。
    【解决方案2】:

    为了将来参考,这里是基于 Martin 回答的完整工作代码。确保将“DisableDirPage=yes”添加到 [Setup] 部分。

    注意:由于一个错误,下面的代码仅适用于 InnoSetup 的 unicode 版本。

    [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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-04
      • 1970-01-01
      • 2013-10-11
      • 2020-09-29
      • 2011-05-02
      • 2022-11-04
      • 2023-01-11
      相关资源
      最近更新 更多