如何使用 Inno Setup 构建 Treeview 设计(具有任务嵌套层次结构的任务组)?

How to build a Treeview design (a task group with tasks nesting hierarchy) using Inno Setup?

我正在尝试构建可检查元素和标签的 Treeview 层次结构,这些元素和标签必须或多或少像这样:

Standalone Controls (label, root)
|__Check/Uncheck all controls of all groups (checkbox)
|  |
|  |__Controls group 1 (group description label)
|  |  |__Check/Uncheck all these controls (checkbox)
|  |     |__Control name 1 (task)
|  |     |__Control name 2 (task)
|  |     |__Control name 3 (task)
|  |       
|  |__Controls group 2 (group description label)
|  |  |__Check/Uncheck all these controls (checkbox)
|  |     |__Control name 1 (task)
|  |     |__Control name 2 (task)
|  |     |__Control name 3 (task)

...等等。

或者在上面显示的层次结构的情况下,下面的这个变体可能太难编码了:

Standalone Controls (label, root)
|
|__Controls group 1 (group description label)
|  |__Check/Uncheck all these controls (checkbox)
|     |__Control name 1 (task)
|     |__Control name 2 (task)
|     |__Control name 3 (task)
|       
|__Controls group 2 (group description label)
|  |__Check/Uncheck all these controls (checkbox)
|     |__Control name 1 (task)
|     |__Control name 2 (task)
|     |__Control name 3 (task)

然而,到目前为止我得到的是:

这是我的代码示例:

[CustomMessages]
StandaloneDescr=%nStandalone Controls
ButtonsDescr=%nButtons
CheckboxesDescr=%nCheckboxes
GroupboxesDescr=%nGroupboxes
KnobsDescr=%nKnobs
...

[Tasks]
Name: WinFormsControls; Description: Check/Uncheck all; GroupDescription: {cm:StandaloneDescr}

Name: WinFormsControls; Description: Check/Uncheck all; GroupDescription: {cm:ButtonsDescr}
Name: WinFormsControls\CButton; Description: CButton
Name: WinFormsControls\GlassButton; Description: Glass Button
Name: WinFormsControls\MyCommandButtonNET; Description: My Command Button.NET
Name: WinFormsControls\PulseButton; Description: Pulse Button

Name: WinFormsControls; Description: Check/Uncheck all; GroupDescription: {cm:CheckboxesDescr}
Name: WinFormsControls\DontShowAgainCheckbox; Description: Don't Show Again Checkbox

Name: WinFormsControls; Description: Check/Uncheck all; GroupDescription: {cm:GroupboxesDescr}
Name: WinFormsControls\Grouper; Description: Grouper

Name: WinFormsControls; Description: Check/Uncheck all; GroupDescription: {cm:KnobsDescr}
Name: WinFormsControls\Knob; Description: Knob
Name: WinFormsControls\KnobControl; Description: KnobControl

...

我该怎样做才对?

如果我对你的问题理解正确,问题是主要的“独立控件”复选框不起作用,对吧?因为它不是层次结构的一部分。


最简单的解决方案是放弃 GroupDescription 并将它们移至复选框描述:

[Setup]
ShowTasksTreeLines=yes

[Tasks]
Name: WinFormsControls; Description: "Standalone controls"

Name: WinFormsControls\Buttons; Description: "Buttons"
Name: WinFormsControls\Buttons\CButton; Description: CButton
Name: WinFormsControls\Buttons\GlassButton; Description: Glass Button
Name: WinFormsControls\Buttons\MyCommandButtonNET; Description: My Command Button.NET
Name: WinFormsControls\Buttons\PulseButton; Description: Pulse Button

Name: WinFormsControls\Checkboxes; Description: "Checkboxes"
Name: WinFormsControls\Checkboxes\DontShowAgainCheckbox; Description: Don't Show Again Checkbox

Name: WinFormsControls\Groupboxes; Description: "Groupboxes"
Name: WinFormsControls\Groupboxes\Grouper; Description: Grouper

Name: WinFormsControls\Knobs; Description: "Knobs"
Name: WinFormsControls\Knobs\Knob; Description: Knob
Name: WinFormsControls\Knobs\KnobControl; Description: KnobControl


如果您想保留 GroupDescription,您可以通过编程方式将主要的“Check/Uncheck 全部”绑定到其他复选框:

procedure TasksListClickCheck(Sender: TObject);
var
  Index: Integer;
begin
  if WizardForm.TasksList.ItemIndex = 1 then
  begin
    for Index := 2 to WizardForm.TasksList.Items.Count - 1 do
      WizardForm.TasksList.Checked[Index] := WizardForm.TasksList.Checked[1];
  end;
end;

procedure InitializeWizard();
begin
  WizardForm.TasksList.OnClickCheck := @TasksListClickCheck;
end;

如果你真的需要层级(缩进),你需要建立一个自定义页面。 Inno Setup 不支持 Tasks 部分中的嵌套组描述。它忽略子任务的 GroupDescription 参数。

var
  TasksList: TNewCheckListBox;

procedure InitializeWizard();
var
  CustomSelectTasksPage: TWizardPage;
begin
  CustomSelectTasksPage :=
    CreateCustomPage(wpSelectTasks, SetupMessage(msgWizardSelectTasks), SetupMessage(msgSelectTasksDesc));

  TasksList := TNewCheckListBox.Create(WizardForm);
  TasksList.Left := WizardForm.TasksList.Left; 
  TasksList.Top := WizardForm.SelectTasksLabel.Top; 
  TasksList.Width := WizardForm.TasksList.Width; 
  TasksList.Height := WizardForm.TasksList.Top + WizardForm.TasksList.Height - WizardForm.SelectTasksLabel.Top; 

  TasksList.BorderStyle := WizardForm.TasksList.BorderStyle;
  TasksList.Color := WizardForm.TasksList.Color;
  TasksList.ShowLines := WizardForm.TasksList.ShowLines;
  TasksList.MinItemHeight := WizardForm.TasksList.MinItemHeight;
  TasksList.ParentColor := WizardForm.TasksList.ParentColor;
  TasksList.WantTabs := WizardForm.TasksList.WantTabs;

  TasksList.Parent := CustomSelectTasksPage.Surface;

  TasksList.AddGroup('Standalone controls', '', 0, nil);
  TasksList.AddCheckBox('Check/Uncheck all', '', 0, True, True, False, True, nil);
    TasksList.AddGroup('Buttons', '', 1, nil);
    TasksList.AddCheckBox('Check/Uncheck all', '', 1, True, True, False, True, nil);
      TasksList.AddCheckBox('CButton', '', 2, True, True, False, True, nil);
      TasksList.AddCheckBox('Glass Button', '', 2, True, True, False, True, nil);
      TasksList.AddCheckBox('My Command Button.NET', '', 2, True, True, False, True, nil);
      TasksList.AddCheckBox('Pulse Button', '', 2, True, True, False, True, nil);
    TasksList.AddGroup('Checkboxes', '', 1, nil);
    TasksList.AddCheckBox('Check/Uncheck all', '', 1, True, True, False, True, nil);
      TasksList.AddCheckBox('Don''t Show Again Checkbox', '', 2, True, True, False, True, nil);
    TasksList.AddGroup('Knobs', '', 1, nil);
    TasksList.AddCheckBox('Check/Uncheck all', '', 1, True, True, False, True, nil);
      TasksList.AddCheckBox('KnobControl', '', 2, True, True, False, True, nil);
end;

并且您需要使用 Check parameters:

将任务绑定到 [Files][Run][Registry] 等部分中的操作
[Files]
Source: "CButton.dll"; DestDir: "{app}"; Check: GetCustomTask(2)

[Code]

var
  TasksList: TNewCheckListBox;

{ ... }

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

类似问题见


在 Inno Setup 6 中,除了使用索引之外,您还可以通过 WizardIsTaskSelected and WizardSelectTasks.

使用任务名称