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

Har*_*can 5 inno-setup

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

例:

在此处输入图片说明

谢谢。

Mar*_*ryl 5

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


但是,只需三个单独的复选框,您就可以轻松实现具有标准“选择其他任务”页面外观的自定义页面。然后,你可以使用Check参数替代的Tasks参数来绑定定制任务部分喜欢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;
Run Code Online (Sandbox Code Playgroud)

自定义任务页面