Inno setup Inno设置:强制组件始终具有与其父组件相同的检查状态

Inno setup Inno设置:强制组件始终具有与其父组件相同的检查状态,inno-setup,Inno Setup,我的组件部分: [Components] Name: "client"; Description: "Client"; Types: full default monitor; Name: "server"; Description: "Server"; Types: full default server; Name: "server/feature"; Description: "Optional feature"; Name: "se

我的组件部分:

[Components]           
  Name: "client"; Description: "Client"; Types: full default monitor; 
  Name: "server"; Description: "Server"; Types: full default server; 
    Name: "server/feature"; Description: "Optional feature";   
    Name: "server/Db"; Description: "Always supported server feature"; Types: full default server; Flags: fixed
      Name: "server/Db/latest"; Description: "Latest"; Types: full default server; Flags: exclusive       
      Name: "server/Db/2_10"; Description: "2.10"; Flags: exclusive 
我希望在选择其父服务器时始终选择组件服务器/Db。我可以用fixed flag完成它,但是我不能选择server/Db/2_10。若我试图选择第二个独占组件,那个么server/Db将完全不被收集。 如果server/Db没有固定,我只能选择server/Db/2_10,但我可以取消选择它

编辑: 我添加了类似于中的程序。刚刚更改了ComponentListCheckChanges过程,如下所示,因为我不想让用户取消选中:

procedure ComponentsListCheckChanges;
begin
  // No metter what you chceck/uncheck force component if needed.
  if WizardIsComponentSelected('server') then
  begin 
    WizardSelectComponents('server/Db');
  end
  else
  begin
    WizardSelectComponents('!server/Db');
  end
end;
我刚刚发现,如果我尝试取消选中server/Db,它会被重新选中,这很好,但是类型会更改为Custom,即使它与其他预定义类型匹配。我犯了一些错误吗

旧的: 我还尝试在代码中将其标记为禁用。我可以选择两个独占组件,但不能再取消选中组件服务器

通过将自定义类型添加到列表中,我能够在组件部分创建与上面代码相同的行为。我可以选择这两个独占组件,但不能取消选中服务器

我尝试的最后一件事是,若服务器被选中,那个么在代码中将其设置为True。我尝试使用以下代码:,它强制服务器/Db按照我想要的方式运行,但在组件上方的下拉菜单中,所选类型停止更改,它始终显示为默认安装,而不是自定义或任何其他类型,因此我认为这不是一个有效的解决方案

如何强制服务器/Db始终与服务器进行检查,并且能够选择服务器/Db的子项之一,并且仍然可以取消选中服务器?
或者是否有其他方法可以对专有组件进行分组?

我通过编辑的答案使其正确工作,但必须添加组件单击检查前零;要在调用WizardSelectComponents后正确更新类型选择,请执行以下操作

[守则] 变量 类型mboonchangeprov:TNotifyEvent; 组件列表单击CheckPrev:TNotifyEvent; 程序组件列表检查更改; 开始 {如果组件的检查状态不同} {将子级的状态更新为父级的状态。} 如果WizardIsComponentSelected'server'WizardIsComponentSelected'server/Db',则 开始 如果WizardIsComponentSelected'server',则{if checked parent} 开始 WizardSelectComponents'server/Db';{检查组件} 终止 其他的 开始 向导选择组件'!服务器/数据库';{取消选中组件} 终止 组件列表单击CheckPrevNil;{编辑后更新类型选择} 终止 终止 过程组件列表点击检查发送方:对象; 开始 {首先让Inno安装程序更新组件选择} 组件列表单击检查前置发送器; {然后检查更改} 组件检查更改; 终止 程序类型mboonChangeSender:ToObject; 开始 {首先让Inno安装程序更新组件选择} 类型mboonChangePrevSender; {然后检查更改} 组件检查更改; 终止 程序初始化; 开始 {Inno设置本身依赖于TypesCombo.OnChange和OnClickCheck。} {所以我们必须保留他们的处理程序。} ComponentsListClickCheckPrev:=WizardForm.ComponentsList.OnClickCheck; WizardForm.ComponentList.OnClickCheck:=@ComponentsListClickCheck; typescomboonchangeprov:=WizardForm.TypesCombo.OnChange; WizardForm.TypesCombo.OnChange:=@TypesComboOnChange; 终止
请参阅此步骤,在选中/取消选中任何组件后,将停止类型更改。它保留上次选择的类型,从不更改为自定义或任何其他类型。我编辑了答案。我以前没有保存该答案,它现在更新了什么类型?我编辑了问题并添加了我的组件列表检查更改。我发现,如果我尝试取消选中server/Db,它会被重新选中,这很好,但类型会更改为Custom,即使它与其他预定义类型匹配。我犯了一些错误吗?我应该为这最后一件事而烦恼,还是复制我的ComponentsListCheckChanges来回答并标记它已完成?如果这最后一件事奏效的话,我认为它将是完美的。在帖子文本的下方有一个链接指向任何修改后的历史记录-
[code]
procedure CurPageChanged(CurPageID: Integer);
begin
  if CurPageID = wpSelectComponents then
      WizardForm.ComponentsList.ItemEnabled[3] := False;
end;
[Components]           
  Name: "client"; Description: "Client"; Types: full default monitor; 
  Name: "server"; Description: "Server"; Types: full default server; 
    Name: "server/feature"; Description: "Optional feature";   
    Name: "server/Db"; Description: "Always supported server feature"; Types: full default server custom; Flags: fixed
      Name: "server/Db/latest"; Description: "Latest"; Types: full default server; Flags: exclusive       
      Name: "server/Db/2_10"; Description: "2.10"; Types: custom; Flags: exclusive