在 Inno Setup 中创建页面,用户可以从安装文件中打包的文件夹中 select 文件

In Inno Setup create page where the user may select files from a folder that is packaged in the setup file

在 Inno Setup 中,我想创建一个页面,其中包含一个复选框列表,这些复选框与我在 [Files] 部分中列出的文件夹中的文件相对应。

如何读取此文件夹中的文件,然后仅复制用户选择的那些文件?现在,我什至没有得到列表,因为文件夹 {tmp}\list 不存在。

[Files]
Source: "list\*"; DestDir:"{tmp}"; Flags: recursesubdirs

[Code]

var
  karten : TNewCheckListBox;
  FileListBox : TNewListBox;
  KartenFormular: TWizardPage;

procedure KartenEinlesen(const Directory: string; Files: TStrings);
var
  FindRec: TFindRec;
begin
  Files.Clear;
  if FindFirst(ExpandConstant(Directory + '*'), FindRec) then
  try
    repeat
      if FindRec.Attributes and FILE_ATTRIBUTE_DIRECTORY = 1 then
        Files.Add(FindRec.Name);
    until
      not FindNext(FindRec);
  finally
    FindClose(FindRec);
  end;  
end;

procedure InitializeWizard;
var 
  AfterID: Integer;
begin
  AfterID := wpSelectTasks;
  KartenFormular := 
    CreateCustomPage(
      AfterID, 'Kartendaten', 'Ort für den Ordner Kartendaten auswählen');
  FileListBox := TNewListBox.Create(WizardForm);
  FileListBox.Parent := KartenFormular.Surface;
  FileListBox.Align := alClient;
  AfterID := KartenFormular.ID;
    
  KartenEinlesen('{tmp}\maptiles\*',FileListBox.Items)
end;

InitializeWizard 发生在最开始,远在文件被提取之前。此外,将(所有)文件提取到 {tmp} 然后在用户选择要安装的文件后将它们复制到其他地方的效率很低。而且您必须编写实际安装过程的代码。


正确的解决方案是在编译(而非安装)时生成列表框内容,使用 Inno Setup preprocessor

以下问题显示了类似的内容。它为每个文件创建一个 Inno Setup component。它甚至可能比自定义页面更好。

但如果您想要自定义页面,解决方案不会有太大差异。您只需为每个文件生成 FileListBox.Items.Add 调用,而不是 [Components] 部分条目。代码有点复杂,因为它递归地工作(你似乎不需要)。对于平面解,可以简化。


另请注意,CreateInputOptionPage 可以更轻松地创建带有复选框的自定义页面。