I'm trying to build a Treeview hierarchy of checkable elements and labels that must be more or less like this: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)...and so on.Or this variant below in case of the hierarchy shown above could be too hard to code it: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)However, what I got so far is this:This is a sample of the code I have:[CustomMessages]StandaloneDescr=%nStandalone ControlsButtonsDescr=%nButtonsCheckboxesDescr=%nCheckboxesGroupboxesDescr=%nGroupboxesKnobsDescr=%nKnobs...[Tasks]Name: WinFormsControls; Description: Check/Uncheck all; GroupDescription: {cm:StandaloneDescr}Name: WinFormsControls; Description: Check/Uncheck all; GroupDescription: {cm:ButtonsDescr}Name: WinFormsControls\CButton; Description: CButtonName: WinFormsControls\GlassButton; Description: Glass ButtonName: WinFormsControls\MyCommandButtonNET; Description: My Command Button.NETName: WinFormsControls\PulseButton; Description: Pulse ButtonName: WinFormsControls; Description: Check/Uncheck all; GroupDescription: {cm:CheckboxesDescr}Name: WinFormsControls\DontShowAgainCheckbox; Description: Don't Show Again CheckboxName: WinFormsControls; Description: Check/Uncheck all; GroupDescription: {cm:GroupboxesDescr}Name: WinFormsControls\Grouper; Description: GrouperName: WinFormsControls; Description: Check/Uncheck all; GroupDescription: {cm:KnobsDescr}Name: WinFormsControls\Knob; Description: KnobName: WinFormsControls\KnobControl; Description: KnobControl...How can I do this right?. 解决方案 If I understand your question correctly, the problem is that the main "Standalone controls" checkbox does not work, right? Because it's not a part of the hierarchy.The easiest solution is to give up on the GroupDescription's and move them to the checkbox description:[Setup]ShowTasksTreeLines=yes[Tasks]Name: WinFormsControls; Description: "Standalone controls"Name: WinFormsControls\Buttons; Description: "Buttons"Name: WinFormsControls\Buttons\CButton; Description: CButtonName: WinFormsControls\Buttons\GlassButton; Description: Glass ButtonName: WinFormsControls\Buttons\MyCommandButtonNET; Description: My Command Button.NETName: WinFormsControls\Buttons\PulseButton; Description: Pulse ButtonName: WinFormsControls\Checkboxes; Description: "Checkboxes"Name: WinFormsControls\Checkboxes\DontShowAgainCheckbox; Description: Don't Show Again CheckboxName: WinFormsControls\Groupboxes; Description: "Groupboxes"Name: WinFormsControls\Groupboxes\Grouper; Description: GrouperName: WinFormsControls\Knobs; Description: "Knobs"Name: WinFormsControls\Knobs\Knob; Description: KnobName: WinFormsControls\Knobs\KnobControl; Description: KnobControlIf you want to keep the GroupDescription's, you can bind the main "Check/Uncheck all" to the other checkboxes programmatically: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;If you really need the hierarchy (indentation), you need to build a custom page. Inno Setup does not support nested group descriptions in the Tasks section. It ignores the GroupDescription parameter for child tasks.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;And you will need to bind the tasks to actions in sections like [Files], [Run] or [Registry] using a Check parameters:[Files]Source: "CButton.dll"; DestDir: "{app}"; Check: GetCustomTask(2)[Code]var TasksList: TNewCheckListBox;{ ... }function GetCustomTask(TaskIndex: Integer): Boolean;begin Result := TasksList.Checked[TaskIndex];end;For a similar question, see How to split tasklist at tasks page of Inno Setup into multiple columns?In Inno Setup 6, instead of using indexes, you can also use task names with use of WizardIsTaskSelected and WizardSelectTasks. 这篇关于如何使用Inno Setup构建Treeview设计(具有任务嵌套层次结构的任务组)?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持! 上岸,阿里云!
08-04 08:40
查看更多