2017-06-05 23 views
1

因此,我有这些comtools任务,您可以看到,这些任务可以在任务列表,取决于以前选择的组件。而且,如果用户不希望安装这些组件,则它们可能完全不存在。 我需要的是显示的静态文本,但只有当光标悬停在comtools任务上时。Inno安装程序 - 确定哪些任务对应于TaskList的项目(仅显示某些任务的鼠标移动文本)

[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 

是的,我确实看到了this,但捆绑的描述指标,在这里是不实际的。此外,该代码显示TasksList中所有项目的说明。

---- ----编辑

所以,我的代码马丁的回答后(从到任务页面移动通通放下)做出的唯一变化是加入马丁的功能,和编辑HoverComponentChanged这样的:

procedure HoverComponentChanged(Index: Integer); 
var 
    Description: string; 
begin 
    case Index of 
    -1: Description := ''; 
    LookupTask('ac2comtools'): Description := 'This is the description of AC2'; 
    LookupTask('bccomtools'): Description := 'This is the description of BC'; 
    LookupTask('bc2comtools'): Description := 'This is the description of BC2'; 
    LookupTask('bc3comtools'): Description := 'This is the description of BC3'; 
    else 
    Description := ''; 
    end; 
    TaskLabel.Caption := Description; 
end; 

-1是一种可靠的,因为,当在取消选择的组分之一,则对于相应的任务的索引是-1,这意味着你将看到的内容描述,在此,第一取消选择部件列表,w你的光标不在TasksList之外。

+0

@MartinPrikryl关于仅针对**特定**任务展示它,无论它是如何实现的。 –

回答

1

确实没有直接的方法来确定哪些任务对应于TaskList的项目。


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

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

[CustomMessages] 
AC2ComTools=ac2 

[Tasks] 
Name: "ac2comtools"; Description: {cm:AC2ComTools} 
[Code] 

function LookupTask(TaskCustomMessage: string): Integer; 
var 
    Description: string; 
begin 
    Description := CustomMessage(TaskCustomMessage); 
    Result := WizardForm.TasksList.Items.IndexOf(Description); 
    Log(Format('Index of "%s" task is %d', [Description, Result])); 
end; 

这样使用它:

AC2ComToolsIndex := LookupTask('ac2comtools'); 

另一种方式是复制Inno Setup的逻辑来决定,表现出什么任务。使用IsComponentSelected function

if IsComponentSelected('ac2') then 
begin 
    if IsComponentSelected('ac') then AC2ComToolsIndex := 4 
    else AC2ComToolsIndex := 1; 
end 
    else AC2ComToolsIndex := -1; 

如果你想自动创建任务名称TaskList项指标全映射,可以将每个任务列表的变化,随叫随到即CurPageChanged(wpSelectTasks)时间做这样的事情:

  • 记住当前任务状态
  • 检查所有任务复选框
  • WizardSelectedTasks(False)让所有塔斯的名字ks
  • 生成映射
  • 恢复以前的任务状态。

当只有复选框而不是单选按钮(即没有0​​标志的任务)时,这相对比较容易。现在

var 
    Tasks: TStringList; 

procedure CurPageChanged(CurPageID: Integer); 
var 
    TasksChecked: array of Boolean; 
    I: Integer; 
begin 
    if CurPageID = wpSelectTasks then 
    begin 
    SetArrayLength(TasksChecked, WizardForm.TasksList.Items.Count); 
    { Remember current task state + Check all task checkboxes } 
    for I := 0 to WizardForm.TasksList.Items.Count - 1 do 
    begin 
     TasksChecked[I] := WizardForm.TasksList.Checked[I]; 
     WizardForm.TasksList.Checked[I] := True; 
    end; 
    Tasks := TStringList.Create; 
    Tasks.CommaText := WizardSelectedTasks(False); 
    for I := 0 to WizardForm.TasksList.Items.Count - 1 do 
    begin 
     { Insert blank items for "group descriptions" } 
     if WizardForm.TasksList.ItemObject[I] = nil then 
     Tasks.Insert(I, ''); 
     { Restore previous task state } 
     WizardForm.TasksList.Checked[I] := TasksChecked[I]; 
    end; 
    end; 
end; 

可以使用Tasks来查找相应的任务指标:

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

虽然你有exclusive任务,你将需要更为复杂的代码。

+0

当前项目中的独占任务,**不**应该具有描述,只有comtools组中的那些描述。选择你的第一个答案,因为它是最“紧凑的” –

相关问题