我陷入了具有
OnClickCheck
属性的简单情况。问题是,每次打开 Msgbox
任务时,我都会看到 backup
,而且(在打开时)按下 OnClickCheck
任务时也会出现 uninst
!似乎OnClickCheck
检查所有点击,但我只需要检查第一个任务的点击。
添加到
WizardForm.TasksList.OnClickCheck
确切的任务数量(WizardForm.TasksList.OnClickCheck[0]
)是合乎逻辑的,但编译器不同意它。
[Tasks]
Name: backup; Description: do backup
Name: uninst; Description: do not create uninstaller
[Code]
procedure TaskOnClick(Sender: TObject);
begin
if IsTaskSelected('backup') then
begin
MsgBox('backup task has been checked.', mbInformation, MB_OK)
end;
end;
procedure InitializeWizard();
begin
WizardForm.TasksList.OnClickCheck := @TaskOnClick;
end;
无法准确判断
OnClickCheck
事件中更改了哪些任务(列表项)。
要了解用户检查了哪个项目,您可以使用
ItemIndex
属性。用户只能检查所选项目。
尽管如果您有任务层次结构,由于子/父项目的更改,即使未选择的任务也可以由安装程序自动切换。因此,要告诉所有更改,您所能做的就是记住以前的状态并将其与当前状态进行比较,当调用
OnClickCheck
时。
var
TasksState: array of TCheckBoxState;
procedure TasksClickCheck(Sender: TObject);
var
I: Integer;
begin
for I := 0 to WizardForm.TasksList.Items.Count - 1 do
begin
if TasksState[I] <> WizardForm.TasksList.State[I] then
begin
Log(Format('Task %d state changed from %d to %d',
[I, TasksState[I], WizardForm.TasksList.State[I]]));
TasksState[I] := WizardForm.TasksList.State[I];
end;
end;
end;
procedure CurPageChanged(CurPageID: Integer);
var
I: Integer;
begin
if CurPageID = wpSelectTasks then
begin
{ Only now is the task list initialized (e.g. based on selected setup }
{ type and components). Remember what is the current/initial state. }
SetArrayLength(TasksState, WizardForm.TasksList.Items.Count);
for I := 0 to WizardForm.TasksList.Items.Count - 1 do
TasksState[I] := WizardForm.TasksList.State[I];
end;
end;
procedure InitializeWizard();
begin
WizardForm.TasksList.OnClickCheck := @TasksClickCheck;
end;
WizardSelectedTasks
或 WizardIsTaskSelected
来使用任务名称。有关示例,请参阅 Inno Setup:如果选择了另一个组件,如何自动选择一个组件?
另请参阅: