2016-11-22 76 views
0

我试图建立辨认的元素和标签必须或多或少这样的树形层级:如何使用Inno安装程序构建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) 

不过,我走到这一步,是这样的:

enter image description here

这是我的代码示例:

[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 

... 

我该如何才能做对吗?

回答

2

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


最简单的解决方法是放弃对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 

Task tree


如果你想保持GroupDescription“ s,您可以编程方式将主“Check/Uncheck all”与其他复选框绑定在一起:

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; 

Custom task page

而且你需要使用绑定的任务行动的部分像[Files][Run][Registry]一个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; 

对于类似的问题,请参见How to split tasklist at tasks page of Inno Setup into multiple columns?

+0

太棒了,谢谢你在编写这个说明性答案时的时间,我选择了第一个设计选项,而不是“选中/取消全选”。 – ElektroStudios