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

时间:2016-06-17 16:21:34

标签: inno-setup

是否可以在选择其他任务页面拆分任务列表,如下图所示?

示例:

enter image description here

感谢。

1 个答案:

答案 0 :(得分:4)

不,Inno Setup不支持多列(检查)列表框。

但您可以轻松实现一个自定义页面,其中包含标准"选择其他任务" 页面的外观,只需三个单独的复选框。然后,您可以使用Check parameter代替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;

Custom tasks page