-
这个
WizardForm.TasksList.OnClickCheck
不是由Inno设置本身指定的(与
WizardForm.ComponentsList.OnClickCheck
),所以您不能调用它。
要解决此问题,请执行以下操作之一:
-
完全移除
DefaultTasksClickCheck
;
-
或者,如果您希望在Inno Setup的未来版本中开始使用该事件,请检查它是否
nil
在调用之前。
-
您无法知道最近在
OnClickCheck
处理程序。因此,您必须记住以前检查过的任务,才能正确决定要取消选择的任务。
[Tasks]
Name: Task1; Description: "Task1 Description"
Name: Task36; Description: "Task36 Description"; Flags: unchecked
[Code]
var
DefaultTasksClickCheck: TNotifyEvent;
Task1Selected: Boolean;
procedure UpdateTasks;
var
Index: Integer;
begin
{ Task1 was just checked, uncheck Task36 }
if (not Task1Selected) and IsTaskSelected('Task1') then
begin
Index := WizardForm.TasksList.Items.IndexOf('Task36 Description');
WizardForm.TasksList.CheckItem(Index, coUncheck);
Task1Selected := True;
end
else
{ Task36 was just checked, uncheck Task1 }
if Task1Selected and IsTaskSelected('Task36') then
begin
Index := WizardForm.TasksList.Items.IndexOf('Task1 Description');
WizardForm.TasksList.CheckItem(Index, coUncheck);
Task1Selected := False;
end;
end;
procedure TasksClickCheck(Sender: TObject);
begin
if DefaultTasksClickCheck <> nil then
DefaultTasksClickCheck(Sender);
UpdateTasks;
end;
procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID = wpSelectTasks then
begin
{ Only now is the task list initialized, check what is the current state }
{ This is particularly important during upgrades, }
{ when the task does not have its default state }
Task1Selected := IsTaskSelected('Task1');
end;
end;
procedure InitializeWizard();
begin
DefaultTasksClickCheck := WizardForm.TasksList.OnClickCheck;
WizardForm.TasksList.OnClickCheck := @TasksClickCheck;
end;
在Inno Setup 6中,您也可以使用任务名称和
WizardIsTaskSelected
和
WizardSelectTasks
。有关示例,请参见
Inno Setup: how to auto select a component if another component is selected?
.
有关检测已检查项目的更通用解决方案,请参阅
Inno Setup Detect changed task/item in TasksList.OnClickCheck event
.