2

我有三个组件。其中两个都依赖于第三个。当检查其他两个组件中的任何一个进行安装时,是否有一种编程方式来自动选中第三个组件的框?

这种行为类似于嵌套组件的行为,但它们处于同一级别,我无法使用该功能。如果 Inno 提供了一种组件间依赖关系的方法会很好,但在那之前......

更新
也许我设想的一个虚构的例子会有所帮助:

[Components]
Name: "parent1"; Description: "app 1"
Name: "parent2"; Description: "app 2"; Depends: parent1
Name: "parent2\child"; Description: "feature"
Name: "parent3"; Description: "app 3"; Depends: parent1
Name: "parent3\child"; Description: "feature"
4

2 回答 2

1

默认情况下,选择子组件也会自动选择其父组件(尽管您可以禁用它)。不过,这听起来正是您想要的行为——您只是倒着想。

假设您有独立的组件 A 和 B。您还拥有组件 C 和 D,它们中的每一个都可以彼此单独安装,但需要安装组件 B。

[Components]
Name: "A"; Description: "app 1"
Name: "B"; Description: "app 2"
Name: "B\C"; Description: "feature C of app 2"
Name: "B\D"; Description: "feature D of app 2"

鉴于这种安排,用户将能够根据需要自行选择 A 或 B;他们还可以选择添加 C 或 D(或不添加)。但是选择 C ​​或 D 也会强制选择 B。

(注意:这假设您有其他以所有这些为条件的条目,特别是 B 本身。如果您只是自己测试复选框并且尚未添加Components:条件,那么您将不得不添加Flags: checkablealone到 B in为了获得所需的行为。)

为了更接近您上面的示例,请尝试以下操作:

[Components]
Name: "app1"; Description: "app 1"
Name: "app1\app2"; Description: "app 2"
Name: "app1\app2\child"; Description: "feature"
Name: "app1\app3"; Description: "app 3"
Name: "app1\app3\child"; Description: "feature"

应用程序 1 可以自行安装,应用程序 2 可以与应用程序 3 分开安装 - 但选择应用程序 2 或应用程序 3 将强制包含应用程序 1。(是的,这将显示为一个可见的层次结构——但您可能应该无论如何都应该显示它,以便用户知道为什么他们的选择以这种方式被强制。)

另一种可能性:如果用户没有理由需要自行安装 app1,那么您可以将其从组件中完全删除。只需将条件从 更改Components: app1Components: app2 or app3。(或者如果 app2 和 app3 是唯一的替代方案,并且它们都需要 app1,则完全删除该条件。)

于 2013-04-02T12:22:45.953 回答
0
procedure InitializeWizard();
begin
  WizardForm.ComponentsList.OnClickCheck := @ComponentsClickCheck;
end;

procedure ComponentsClickCheck(Sender: TObject);
var
  ListBox: TNewCheckListBox;
  parent1_top: Integer;
  parent2_top: Integer;
  parent3_top: Integer;
begin
  ListBox := TNewCheckListBox(Sender);
  parent1_top := 0;
  parent2_top := 1;
  parent3_top := 3;
  (* Check if parent2_top was selected. *)
  if (ListBox.State[parent2_top] = cbChecked) or
    (ListBox.State[parent2_top] = cbGrayed) then begin
    (* Check a dependent component. *)
    ListBox.CheckItem(parent1_top, coCheckWithChildren);
  end;
  (* Check if parent3_top was selected. *)
  if (ListBox.State[parent3_top] = cbChecked) or
    (ListBox.State[parent3_top] = cbGrayed) then begin
    (* Check a dependent component. *)
    ListBox.CheckItem(parent1_top, coCheckWithChildren);
  end;
end;

有一个副作用是,在取消选择“依赖”组件之前,“依赖”变得不可更改。更改依赖项的启用状态以进行视觉澄清也会有所帮助。

于 2013-04-01T19:30:18.733 回答