如何将 Inno Setup 任务页面的任务列表拆分为多列?

How to split tasklist at tasks page of Inno Setup into multiple columns?

是否可以在Select附加任务页面拆分任务列表,如下图所示?

示例:

谢谢。

不,Inno Setup 不支持多列(复选)列表框。


但是您可以轻松实现具有标准 "Select Additional Tasks" 页面外观的自定义页面,只需使用三个单独的复选框。然后,您可以使用 Check parameter instead of the Tasks parameter 将自定义任务绑定到 FilesIcons 等部分

[Files]
Source: "FileForSubTask_0_1.txt"; DestDir: "{app}"; Check: GetCustomTask(0, 1);
Source: "FileForSubTask_0_2.txt"; DestDir: "{app}"; Check: GetCustomTask(0, 2);
...

[Code]

var
  CustomSelectTasksPage: TWizardPage;
  TasksLists: array of TNewCheckListBox;

const
  TaskColumns = 3;

procedure InitializeWizard();
var
  TasksList: TNewCheckListBox;
  I, GapWidth: Integer;
begin
  CustomSelectTasksPage :=
    CreateCustomPage(
      wpSelectTasks, SetupMessage(msgWizardSelectTasks),
      SetupMessage(msgSelectTasksDesc));

  SetArrayLength(TasksLists, TaskColumns);

  GapWidth := ScaleX(16);

  for I := 0 to TaskColumns - 1 do
  begin
    TasksList := TNewCheckListBox.Create(WizardForm);
    TasksList.Width :=
      (CustomSelectTasksPage.SurfaceWidth - (GapWidth * (TaskColumns - 1))) div
        TaskColumns; 
    TasksList.Left := I * (TasksList.Width + GapWidth);
    TasksList.Top := 0;
    TasksList.Height := WizardForm.InnerNotebook.Height - ScaleY(8);

    TasksList.BorderStyle := bsNone;
    TasksList.Color := clBtnFace;
    TasksList.ShowLines := False;
    TasksList.MinItemHeight := ScaleY(22);
    TasksList.ParentColor := True;
    TasksList.WantTabs := True;

    TasksList.Parent := CustomSelectTasksPage.Surface;

    TasksLists[I] := TasksList;
  end;

  TasksLists[0].AddCheckBox('TASK 0:0', '', 0, False, True, False, False, nil);
  TasksLists[0].AddCheckBox('Subtask 0:1', '', 1, False, True, False, False, nil);
  TasksLists[0].AddCheckBox('Subtask 0:2', '', 1, False, True, False, False, nil);

  TasksLists[1].AddCheckBox('TASK 1:0', '', 0, False, True, False, False, nil);
  TasksLists[1].AddCheckBox('Subtask 1:1', '', 1, False, True, False, False, nil);
  TasksLists[1].AddCheckBox('Subtask 1:2', '', 1, False, True, False, False, nil);

  TasksLists[2].AddCheckBox('TASK 2:0', '', 0, False, True, False, False, nil);
  TasksLists[2].AddCheckBox('Subtask 2:1', '', 1, False, True, False, False, nil);
  TasksLists[2].AddCheckBox('Subtask 2:2', '', 1, False, True, False, False, nil);
end;


function GetCustomTask(ListIndex: Integer; TaskIndex: Integer): Boolean;
begin 
  Result := TasksLists[ListIndex].Checked[TaskIndex];
end;