【问题标题】:How to get Inno setup to display message with only a cancel button so the install stops如何让 Inno 设置仅显示带有取消按钮的消息,以便安装停止
【发布时间】:2012-09-05 21:59:32
【问题描述】:

我正在使用 Inno setup 来交付软件包。它会检测 Access 的版本并弹出一条消息。我想让消息告诉用户他们下载了错误的版本并停止安装。目前 Inno 脚本使用

itd_downloadafter(NoRuntimePage.ID);

显示一条消息,告诉用户他们需要安装 AccessRuntime。当他们用户按下下一步时,它会下载 AccessRuntime 并继续。我想为我的新脚本更改此设置,以告诉用户他们的版本错误,然后在他们按下一步或取消时结束安装脚本。谁能帮我解决这个问题?

【问题讨论】:

    标签: inno-setup


    【解决方案1】:

    为什么要使用 InitializeSetup ?

    如果您想在向导启动之前有条件地退出设置,请不要将InitializeWizard 事件函数与Abort 异常引发一起使用。您将浪费时间,需要创建整个向导表单。请改用InitializeSetup 事件函数。在那里,您可以引发Abort 异常或更好地将 False 返回到其布尔结果,然后按预期退出函数 - 最终效果肯定是一样的。

    在内部,InitializeSetup 函数在您从脚本返回 False 时仅引发此 Abort 异常。与InitializeWizard 事件相反,当InitializeSetup 事件被触发时,向导窗体尚未创建,因此您不会浪费时间,也不会使用系统资源。

    代码示例:

    在下面的伪代码中,您需要有一个类似 UserDownloadedWrongVersion 的函数,如果您返回 True,则设置将终止,否则不会发生任何事情。

    [Code]
    function UserDownloadedWrongVersion: Boolean;
    begin
      // make your check here and return True when you detect a wrong 
      // version, what causes the setup to terminate; False otherwise
    end;
    
    function InitializeSetup: Boolean;
    begin
      Result := not UserDownloadedWrongVersion;
      if not Result then
      begin
        MsgBox('You''ve downloaded the wrong version. Setup will now exit!', 
          mbError, MB_OK);
        Exit;   // <-- or use Abort; instead, but there's no need for panic
      end;
    end;
    

    【讨论】:

    • 如果你有一些额外的代码你想遵循上面的(但仅当设置没有被中止时):在第一个代码块中的Result := False; 行之后,放置exit;。这相当于其他语言中的 return 语句——它会在设置返回值后立即退出函数,并且避免将函数中的任何剩余代码放在 else 块中。 (而且它比Abort()“轻”得多。)或者对于第二个示例,将MsgBox 放在begin end 块内,然后将exit; 放在MsgBox 之后。
    • @Miral,是的,你是对的。我会更新这个。谢谢!关于InitializeSetup 的轻量级,内部当你返回False 到InitializeSetup 时,内部会调用Abort。重点是表单创建;-)
    【解决方案2】:

    ** TLama 的回答更准确。 **

    您可以使用 InitializeWizard 过程在开始时运行访问检查...如果失败,您应该能够显示您的消息框然后调用 Abort()。

    [code]
    var CustomPage: TInputQueryWizardPage;
    
    procedure InitializeWizard;
    begin;
      {your checking Access version and message box}
      Abort();
    end;
    

    【讨论】:

    • @TLama 是正确的...我从头顶输入了这个然后去我的代码库获取示例...忘记返回布尔值会与中止相同!干得好 TLama!
    • 由于我使用的脚本在初始化中进行检查,因此我使用了 TLama 中的 Msgbox 和初始化过程中的 abort 命令,它运行良好。谢谢
    • @Mark,现在我希望you can see InitializeSetupInitializeWizard 事件之间的区别以及在 InitializeWizard 中这样做是多么浪费。在这两种情况下,您都可以提出您最喜欢的静默异常。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-26
    • 2022-08-22
    • 2011-11-19
    • 2017-11-21
    相关资源
    最近更新 更多