inno-setup - Inno Setup 在选中另一个任务时取消选中一个任务

标签 inno-setup pascalscript

我正在尝试拦截 WizardForm.TasksList.OnClickCheck 事件,以便在选择另一个任务时可以取消选中一个任务。我知道在这种情况下通常会使用单选按钮,但在选择另一个任务时自动取消选中一个任务在这里效果更好,因为使用了多个分层任务,并且如果使用单选按钮,则始终必须具有以下之一位于任务子树顶部时选择的两个。为了保持一致性而重新设计任务层次结构是不可行的,因为这将包括两个临时任务,这些任务将在安装程序的 future 版本中删除。为此,我编写了以下内容:

var
  DefaultTasksClickCheck: TNotifyEvent;

{ Uncheck tasks based on what other tasks are selected }
procedure UpdateTasks();
var
  intIndex: Integer;
begin
  with WizardForm.TasksList do
    begin
      if IsTaskSelected('Task1') then
        begin
          intIndex := WizardForm.TasksList.Items.IndexOf('Task36 Description');
          CheckItem(intIndex, coUncheck);
        end;
      if IsTaskSelected('Task36') then
        begin
          intIndex := WizardForm.TasksList.Items.IndexOf('Task1 Description');
          CheckItem(intIndex, coUncheck);
        end;
    end;
end;

{ Update the task states if the task states change and restore the original event handler procedure }
procedure TasksClickCheck(Sender: TObject);
begin
  DefaultTasksClickCheck(Sender);
  UpdateTasks;
end;

procedure InitializeWizard();
begin
  { Store the original Tasks Page OnClickCheck event procedure and assign custom procedure }
  DefaultTasksClickCheck := WizardForm.TasksList.OnClickCheck;
  WizardForm.TasksList.OnClickCheck := @TasksClickCheck;
end;

但是,当我运行代码时,我得到一个:

Out of Proc Range

单击任何复选框时出错,DefaultTasksClickCheck(Sender); 突出显示为有问题的行。如果我注释掉这一行,我将不再收到错误,但显然不再恢复原始事件处理程序,并且它仍然无法正确检查和取消选中任务,当检查 Task1 时,Task36 不可检查。我做错了什么?

最佳答案

  1. WizardForm.TasksList.OnClickCheck 不是由 Inno Setup 本身分配的(与 WizardForm.ComponentsList.OnClickCheck 相反),因此您无法调用它。

    要解决该问题,可以执行以下任一操作:

    • 完全删除DefaultTasksClickCheck
    • 或者,如果您希望在 Inno Setup 的 future 版本中开始使用该事件时得到保护,请在调用之前检查它是否为 nil
  2. 您无法知道 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 .

关于inno-setup - Inno Setup 在选中另一个任务时取消选中一个任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39297075/

相关文章:

inno-setup - Inno Setup 遍历目录及其子目录

visual-studio-2010 - 使用哪一个,Visual Studio 安装程序或 Inno 安装程序?

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

inno-setup - Inno Setup - 带有 VCL 样式的语言选择器

inno-setup - 将 SetupIconFile 设置为某些图标也会更改目标位置和开始菜单页面上的图标

inno-setup - Inno 安装编译器 : How to auto start the default browser with given url?

installation - 使用 Inno Setup 联系许可证 key 服务器?

inno-setup - Inno Setup 没有图标

installation - Inno Setup 中的函数指针