2016-04-25 2 views
0

Hier ist eine Liste meiner Aufgaben:Inno Setup - Pascal-Script - Bedingtes hide/show eine Aufgabe

[Tasks] 
Name: "D3D"; Description: "Install D3D Engine"; GroupDescription: "Engines:" 
Name: "GL"; Description: "Install OpenGL Engine"; GroupDescription: "Engines:"; Flags: unchecked 
Name: "SW"; Description: "Install Software Engine"; GroupDescription: "Engines:"; Flags: unchecked 
Name: "DesktopIcon"; Description: "{cm:CreateDesktopIcon} for the Launcher"; GroupDescription: "{cm:AdditionalIcons}" 
Name: "DesktopIconD3D"; Description: "{cm:CreateDesktopIcon} for the D3D Engine"; GroupDescription: "{cm:AdditionalIcons}" 
Name: "DesktopIconGL"; Description: "{cm:CreateDesktopIcon} for the OpenGL Engine"; GroupDescription: "{cm:AdditionalIcons}" 
Name: "DesktopIconSW"; Description: "{cm:CreateDesktopIcon} for the Software Engine"; GroupDescription: "{cm:AdditionalIcons}" 

Nun, was ich erreichen möchte die Aufgabe versteckt (n) mit dem Namen DesktopIcon{engine}, wenn die Aufgabe {engine} benannt ist nicht ausgewählt.

Das Problem, wenn ich eine der Aufgaben ausblenden, ändert sich die Indexliste, und ich brauche sie, um sie spezifisch zu verweisen.

+0

Randbemerkung: '{cm: CreateDesktopIcon} für die D3D Engine' - Sie kombinieren lokalisierbare Zeichenfolge mit hartcodierte Zeichenfolge. Das ist kein guter Weg. –

Antwort

0

Ich bin sicher, es gibt eine Möglichkeit, Ihr Problem mit Indizes zu lösen. Sie haben uns jedoch weder Ihren Code angezeigt, der die Aufgaben löscht, noch Ihren Code, der auf die Aufgaben verweist. Also können wir dir damit nicht helfen.

Wie auch immer, das Verstecken der Aufgaben ist nicht die übliche Lösung. Es gibt eine integrierte Aufgabenhierarchie, mit der Sie die Beziehung lösen können. Oder Sie können die Aufgaben einfach deaktivieren, anstatt sie zu löschen.


Eine "Icon" -Task zu einer Teilaufgabe der jeweiligen "Engine" -Task machen.

[Tasks] 
Name: "DesktopIcon"; Description: "{cm:CreateDesktopIcon} for the Launcher" 
Name: "D3D"; Description: "Install D3D Engine"; GroupDescription: "Engines:"; Flags: checkablealone 
Name: "D3D\DesktopIcon"; Description: "{cm:CreateDesktopIcon} for the D3D Engine" 
Name: "GL"; Description: "Install OpenGL Engine"; GroupDescription: "Engines:"; Flags: unchecked checkablealone 
Name: "GL\DesktopIcon"; Description: "{cm:CreateDesktopIcon} for the OpenGL Engine" 
Name: "SW"; Description: "Install Software Engine"; GroupDescription: "Engines:"; Flags: unchecked checkablealone 
Name: "SW\DesktopIcon"; Description: "{cm:CreateDesktopIcon} for the Software Engine" 

Dies macht Inno Setup automatisch das Kind „Symbol“ Task deaktivieren, wenn die Eltern „Motor“ Aufgabe nicht aktiviert ist.

Beachten Sie die checkablealone Flag in Motoraufgaben.

Subtasks


das "Symbol" Task deaktivieren, wenn die jeweilige "Motor" Aufgabe nicht aktiviert ist.

procedure UpdateIconTask(IconIndex: Integer; EngineIndex: Integer); 
begin 
    WizardForm.TasksList.ItemEnabled[IconIndex] := WizardForm.TasksList.Checked[EngineIndex]; 
    if not WizardForm.TasksList.Checked[EngineIndex] then 
    begin 
    WizardForm.TasksList.Checked[IconIndex] := False; 
    end; 
end; 

procedure UpdateIconTasks(); 
begin 
    UpdateIconTask(6, 1); 
    UpdateIconTask(7, 2); 
    UpdateIconTask(8, 3); 
end; 

procedure TasksListClickCheck(Sender: TObject); 
begin 
    UpdateIconTasks(); 
end; 

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

procedure CurPageChanged(CurPageID: Integer); 
begin 
    if CurPageID = wpSelectTasks then 
    begin 
    { Initial update } 
    UpdateIconTasks(); 
    end; 
end; 

enter image description here