如何使用 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
.
使用任务名称
我正在尝试构建可检查元素和标签的 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
.