【问题标题】:Inno Setup Detect changed task/item in TasksList.OnClickCheck eventInno Setup 检测 TasksList.OnClickCheck 事件中更改的任务/项目
【发布时间】:2017-02-11 08:13:17
【问题描述】:

我陷入了OnClickCheck 属性的简单情况。问题是我每次打开backup 任务时都会看到Msgbox,而且(当它打开时)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;

【问题讨论】:

    标签: inno-setup pascalscript


    【解决方案1】:

    没有办法确切知道在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;
    

    除了使用索引之外,您还可以使用带有WizardSelectedTasksWizardIsTaskSelected 的任务名称。示例见Inno Setup: how to auto select a component if another component is selected?


    另见:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多