2016-11-22 21 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