Inno setup Inno设置-确定哪些任务对应于任务列表中的项目(仅针对特定任务在鼠标上显示文本)

Inno setup Inno设置-确定哪些任务对应于任务列表中的项目(仅针对特定任务在鼠标上显示文本),inno-setup,pascalscript,Inno Setup,Pascalscript,因此,我有这些comtools任务,如您所见,它们在任务列表中的位置可能不同,具体取决于之前选择的组件。此外,如果用户不希望安装这些组件,它们可能根本不存在。 我需要的是显示静态文本,但仅当光标悬停在comtools任务上时才需要 [Tasks] Name: "acorig"; Description: "ac original"; GroupDescription: "Choose which version of ac to install:"; Flags: exclusive; Comp

因此,我有这些
comtools
任务,如您所见,它们在任务列表中的位置可能不同,具体取决于之前选择的组件。此外,如果用户不希望安装这些组件,它们可能根本不存在。 我需要的是显示静态文本,但仅当光标悬停在
comtools
任务上时才需要

[Tasks]
Name: "acorig"; Description: "ac original"; GroupDescription: "Choose which version of ac to install:"; Flags: exclusive; Components: ac
Name: "acenh"; Description: "ac enhanced"; GroupDescription: "Choose which version of ac to install:"; Flags: exclusive unchecked; Components: ac
Name: "ac2comtools"; Description: "ac2"; GroupDescription: "Also install community-made tools (unsupported) for:"; Flags: unchecked; Components: ac2
Name: "bccomtools"; Description: "bc"; GroupDescription: "Also install community-made tools (unsupported) for:"; Flags: unchecked; Components: bc
Name: "bc2comtools"; Description: "bc2"; GroupDescription: "Also install community-made tools (unsupported) for:"; Flags: unchecked; Components: bc
Name: "bc3comtools"; Description: "bc3"; GroupDescription: "Also install community-made tools (unsupported) for:"; Flags: unchecked; Components: bc3
Name: "bc4comtools"; Description: "bc4"; GroupDescription: "Also install community-made tools (unsupported) for:"; Flags: unchecked; Components: bc4
是的,我确实看到了,但这将描述与索引联系起来,这在这里并不实用。此外,该代码还显示了
TasksList
中所有项目的说明

----编辑---

因此,在Martin回答后,我对代码所做的唯一更改(除了将所有内容移到任务页面)是添加Martin的函数,并编辑
HoverComponentChanged
,如下所示:

过程HoverComponentChanged(索引:整数);
变量
描述:字符串;
开始
案例索引
-1:说明:='';
LookupTask('ac2comtools'):Description:=“这是对AC2的描述”;
LookupTask('bccomtools'):Description:=“这是对BC的描述”;
LookupTask('bc2comtools'):Description:=“这是对BC2'的描述”;
LookupTask('bc3comtools'):Description:='这是BC3'的描述;
其他的
说明:='';
结束;
TaskLabel.Caption:=说明;
结束;

-1
是一个故障保护,因为当取消选择中的一个组件时,相应任务的索引为
-1
,这意味着您将看到此列表中第一个取消选择的组件的描述,当光标位于
任务列表
之外时,确实没有直接的方法来识别,哪些任务与
任务列表
中的项目相对应


快速和肮脏的方式是使用项目描述

在这种情况下,最好使用定义描述,以便您可以在代码中引用它。无论如何,如果你的安装程序是本地化的,这是必须的

[自定义消息]
AC2ComTools=ac2
[任务]
名称:“ac2comtools”;描述:{cm:AC2ComTools}
[代码]
函数LookupTask(TaskCustomMessage:string):整数;
变量
描述:字符串;
开始
说明:=自定义消息(TaskCustomMessage);
结果:=WizardForm.TasksList.Items.IndexOf(描述);
日志(格式(“%s”任务的索引为%d”,[说明,结果]);
结束;
像这样使用它:

AC2ComToolsIndex:=LookupTask('ac2comtools');

另一种方法是重现Inno设置的逻辑,以决定显示哪些任务

在Inno Setup 6.0.2之前使用(
IsComponentSelected

{在Inno Setup 6.0.2之前,请使用IsComponentSelected。}
如果选择了向导组件(“ac2”),则
开始
如果选择了向导组件(“ac”),则AC2ComToolsIndex:=4
否则AC2ComToolsIndex:=1;
结束
否则AC2ComToolsIndex:=-1;

如果要自动创建从任务名称到
任务列表
项目索引的完整映射,则每次任务列表更改时,您都可以执行类似操作,即随时调用:

  • 记住当前任务状态
  • 选中所有任务复选框
  • 读取以获取所有任务的名称
  • 生成映射
  • 恢复以前的任务状态
当只有复选框而没有单选按钮时(即没有带
独占
标志的任务),这是相对容易的

var
任务:t英语;
过程CurPageChanged(CurPageID:Integer);
变量
TasksChecked:布尔值数组;
I:整数;
开始
如果CurPageID=wpSelectTasks,则
开始
SetArrayLength(TasksChecked,WizardForm.TasksList.Items.Count);
{记住当前任务状态+选中所有任务复选框}
对于I:=0到WizardForm.TasksList.Items.Count-1 do
开始
TasksChecked[I]:=WizardForm.TasksList.Checked[I];
WizardForm.TasksList.Checked[I]:=True;
结束;
任务:=TStringList.Create;
Tasks.CommaText:=WizardSelectedTasks(False);
对于I:=0到WizardForm.TasksList.Items.Count-1 do
开始
{为“组描述”插入空白项}
如果WizardForm.TasksList.ItemObject[I]=nil,则
任务。插入(I);
{还原以前的任务状态}
WizardForm.TasksList.Checked[I]:=TasksChecked[I];
结束;
结束;
结束;
现在,您可以使用
任务
查找相应的任务索引:

AC2ComToolsIndex:=Tasks.IndexOf('ac2comtools');

虽然您有
独占任务,但您需要更复杂的代码。

@MartinPrikryl关于仅为特定任务显示它,而不管它是如何实现的。当前项目中的独占任务不应该有描述,只应该有comtools组中的任务。选择你的第一个答案,因为它是最“紧凑的”