如何只允许在InnoSetup中安装特定组件?

时间:2012-04-23 15:26:35

标签: conditional inno-setup

所以问题是: 我在这里问了一个问题:How to allow installation only to a specific folder?

我如何修改它,例如,我有3个文件要安装,其中2个是可选的,只有安装时才可用,如果存在某个文件/文件夹。如果不满足条件,我想要在列表中选择它们的选项是灰色的吗?

提前谢谢你。 泽索特

1 个答案:

答案 0 :(得分:14)

我会尝试执行以下操作。它将访问组件列表项,按其索引禁用和取消选中它们,从[Components]部分的顺序开始从0开始的数字是多少。默认情况下,启用了没有fixed标志的项目(如本例中所示),因此您需要检查是否未满足条件。您也可以查看此帖子的commented version

[Components]
Name: Component1; Description: Component 1
Name: Component2; Description: Component 2
Name: Component3; Description: Component 3

[code]
procedure CurPageChanged(CurPageID: Integer);
begin
  if CurPageID = wpSelectComponents then
    if not SomeCondition then
    begin
      WizardForm.ComponentsList.Checked[1] := False;
      WizardForm.ComponentsList.ItemEnabled[1] := False;
      WizardForm.ComponentsList.Checked[2] := False;
      WizardForm.ComponentsList.ItemEnabled[2] := False;
    end;
end;

上述解决方案至少有一个弱点。当您将[Components]设置为True时,索引可能会从ComponentsList.Sorted部分的原始订单进行洗牌。如果你没有使用它,可能就足够使用上面的代码,如果是的话,那就更复杂了。

没有简单的方法来获取组件名称(它在内部存储为每个项目的TSetupComponentEntry中的ItemObject对象),只有描述,所以这是另一种方法来做同样的事情不同之处在于按照指定的描述搜索项目索引。

procedure CurPageChanged(CurPageID: Integer);
var
  Index: Integer;
begin
  if CurPageID = wpSelectComponents then
    if not SomeCondition then
    begin
      Index := WizardForm.ComponentsList.Items.IndexOf('Component 2');
      if Index <> -1 then
      begin
        WizardForm.ComponentsList.Checked[Index] := False;
        WizardForm.ComponentsList.ItemEnabled[Index] := False;
      end;
      Index := WizardForm.ComponentsList.Items.IndexOf('Component 3');
      if Index <> -1 then
      begin
        WizardForm.ComponentsList.Checked[Index] := False;
        WizardForm.ComponentsList.ItemEnabled[Index] := False;
      end;
    end;
end;