【问题标题】:Hook standard Inno Setup checkbox挂钩标准 Inno 设置复选框
【发布时间】:2011-05-20 05:15:26
【问题描述】:

我添加了一个 InputOptionWizardPage 用于选择任务。这很好用,但我想添加一些自定义功能。一个任务依赖于另一个任务,因此如果选中第二个复选框,则应选中第一个并显示为灰色。

为此,我需要访问复选框的属性。我找到了使用完全自定义页面的方法来执行此操作,我会在其中显式创建复选框,但这将是很多工作,因为到目前为止我所拥有的大部分内容都令人满意。

如何使用 MyInputOptionWizardPage.Add('This will add a checkbox with this caption') 挂钩由 Inno Setup 创建的复选框?

【问题讨论】:

    标签: inno-setup


    【解决方案1】:

    试图直接回答您的问题。

    我怀疑你使用了CreateInputOptionPage(),它返回一个TInputOptionWizardPage

    这有你提到的 '.Add('Example')` 方法。

    TInputOptionWizard 继承 TWizardPage,它继承自 TComponent,它具有您需要的方法。

    更新:替换了原始代码,这个例子是基于对ScriptClasses_C.pas的InnoSetup源代码中可用选项的审查我认为的原始例子 TRadioButtonTCheckBox 单独控制。他们取而代之的是一个名为TNewCheckListBox 的控件。有几种方法可以解决这个问题,但最安全的方法是使用。

    这个例子是一个完整的 Inno 设置脚本。

    [Setup]
    AppName='Test Date Script'
    AppVerName='Test Date Script'
    DefaultDirName={pf}\test
    [Code]
    
    const
     cCheckBox = false;
     cRadioButton  = true;
    
    
    var
      Opt : TInputOptionWizardPage; 
    
    function BoolToStr(Value : Boolean) : String; 
    begin
      if Value then
        result := 'true'
      else
        result := 'false';
    end;
    
    procedure ClickEvent(Sender : TObject);
    var
     Msg : String;
     I   : Integer;
    begin
       // Click Event, allowing inspection of the Values.
        Msg := 'The Following Items are Checked' +#10#13; 
        Msg := Msg + 'Values[0]=' + BoolToStr(Opt.Values[0]) +#10#13;
        Msg := Msg + 'Values[1]=' + BoolToStr(Opt.Values[1]) +#10#13;
        Msg := Msg + 'Values[2]=' + BoolToStr(Opt.Values[2]);
    
        MsgBox(Msg,mbInformation,MB_OK);
    end;
    procedure InitializeWizard();
    var
      I : Integer; 
      ControlType : Boolean;
    begin
      ControlType := cCheckBox;
      Opt := CreateInputOptionPage(1,'Caption','Desc','SubCaption',ControlType, false);
      Opt.Add('Test1');
      Opt.Add('Test2');
      Opt.Add('Test3');
    
      // Assign the Click Event.
      Opt.CheckListBox.OnClickCheck := @ClickEvent;  
    end;
    

    【讨论】:

    • @Robert - 谢谢。我在这一行收到类型不匹配错误:Radio := (InputOptionPage as TRadioButton) ;。这是代码:For CompIndex := 0 to InputOptionPage.ComponentCount -1 do begin if (InputOptionPage is TRadioButton) then begin Radio := (InputOptionPage as TRadioButton) ; Radio.OnClick := RadioButtonClick ; end ; end ;
    • ...我希望我知道如何在 cmets 中正确格式化代码。叹息。
    • 我看到了这个错误......这就是我没有编译/测试代码的结果。注意添加了 .components[I]
    • Radio := (InputOptionPage.Components[CompIndex] as TRadioButton) ; @Robert - 同样的错误 - 类型不匹配!
    • 我真的搞砸了,有一个更简单的方法。已更新。
    【解决方案2】:

    您还可以通过父母关系控制任务,它为您提供与您要求的行为相似的行为,但不是 100% 相同。我知道这并不能直接回答您的问题,而是打算为您提供一个可能更容易实施的选项。这样做您根本不必担心管理自定义对话框。

    [Setup]
    ;This allows you to show Lines showing parent / Child Relationships
    ShowTasksTreeLines=yes
    
    [Tasks]
    ;Parent Tasks don't use "\"
    Name: p1; Description: P1 Test; 
    ;Child Tasks are named ParentTaskName\ChildTaskName
    ;Flag don't inheritcheck:Specifies that the task 
    ;should not automatically become checked when its parent is checked 
    Name: p1\c1; Description: C1 Test; Flags: dontinheritcheck;
    Name: p1\c2; Description: C2 Test; 
    ;Default behavior is that child must be selected 
    ;when a parent is selected
    ;this can be overridden using the:
    ;doninheritcheck flag and the checkablealone flag.
    Name: p2; Description: P2 Test; Flags: checkablealone;
    Name: p2\c1; Description: P2-C1 Test; Flags: dontinheritcheck;
    Name: p2\c2; Description: P2-C2 Test; Flags: dontinheritcheck;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-07
      • 2020-04-09
      • 2013-01-04
      • 2020-11-14
      • 1970-01-01
      • 2011-09-28
      • 2013-03-20
      相关资源
      最近更新 更多