Inno Setup Detect在TasksList.OnClickCheck事件中更改了任务/项目

时间:2017-02-11 08:13:18

标签: inno-setup

我坚持使用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;

1 个答案:

答案 0 :(得分:1)

OnClickChange事件中,无法准确说明更改了哪个任务(列表项)。

要告知用户检查了哪个项目,您可以使用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;