【问题标题】:Is it possible to allow a user to skip a TInputDirWizardPage in Inno Setup?是否可以允许用户在 Inno Setup 中跳过 TInputDirWizardPage?
【发布时间】:2018-03-19 23:06:40
【问题描述】:

我有一个使用 Inno Setup 的安装程序,它允许用户在安装时选择文件位置。该文件有点像帮助安装的答案文件。

对于这个提示,我使用的是TInputDirWizardPage.

当用户使用这个文件时它工作正常,但如果他不想这样做,它会自动抛出一个错误,告诉他他必须输入一个路径。

有没有办法不强制验证,以便用户可以点击下一步,让我弄清楚他没有文件?

【问题讨论】:

    标签: inno-setup pascalscript


    【解决方案1】:

    很遗憾,没有。这是在TInputDirWizardPage.NextButtonClick 方法中硬编码的,该方法通过调用ValidateCustomDirEdit 函数在内部验证所有编辑框,它不关心编辑是否故意留空;它只是检查它是否包含有效的目录路径。或者,换句话说,TInputDirWizardPage 字段不是可选的,它们此时必须包含有效路径。

    嗯,我不认为这是预期的行为。如果您比较文件和目录输入页面,它们会有所不同。在文件输入页面中,您可以将编辑框留空,而在目录输入页面中则不能。我认为,如果可以检查编辑框是否为空,并且仅在不是时,验证其内容就足够了。您可以自己检查编辑是否为空(如果您需要必填字段),并在该页面上停止用户,但如果编辑为空,您将无法禁止该验证。

    在您的情况下,我会考虑在您谈论文件输入或创建自己的目录输入页面时使用TInputFileWizardPage

    【讨论】:

    • 这就是我所担心的。昨晚我还尝试在页面上放置我自己的“跳过”按钮,该按钮有效,但似乎无法让安装程序在单击时实际移动到下一页。感谢您的信息。
    • 内部调用了 NextButtonClick 方法,无法拦截它,因此在这种情况下,您对 TInputDirWizardPage 不走运。但是制作自己的目录输入页面并不难。只有当您要查找的文件存在时,它甚至可以接受所选文件夹。
    • 再次感谢@TLama。
    【解决方案2】:

    正如 TLama 所说,没有办法不强制验证,它是硬编码的。但这并不意味着我们不能破解它!!!

    在下面的示例中,我们覆盖表单NextButtonclick,如果目录为空,我们只需输入一个值以通过验证,然后我们可以清除目录。

    var
      InputDirPage: TInputDirWizardPage;
      Old_WizardForm_NextButton_OnClick: TNotifyEvent;
    
    procedure WizardForm_NextButton_OnClick(Sender: TObject);
    var
        IsDirEmpty: Boolean;
    begin
        if (WizardForm.CurPageID = InputDirPage.ID) and (InputDirPage.Values[0] = '') then
        begin
            IsDirEmpty := True;
            InputDirPage.Values[0] := WinDir; { Force value to pass validation }
        end;
    
        Old_WizardForm_NextButton_OnClick(Sender);
    
        if IsDirEmpty then
            InputDirPage.Values[0] := '';
    end;
    
    procedure InitializeWizard();
    begin
        InputDirPage := CreateInputDirPage(
            wpWelcome,      { AfterID }
            'ACaption',
            'ADescription',
            'ASubCaption',
            False,          { AAppendDir }
            ''              { ANewFolderName }
        );  
    
        InputDirPage.Add('doc dir:');
    
        { override wizard NextButton click }
        Old_WizardForm_NextButton_OnClick := WizardForm.NextButton.OnClick;
        WizardForm.NextButton.OnClick := @WizardForm_NextButton_OnClick;
    end;
    

    【讨论】:

    • 绝对!我错过了您可以存储OnClick事件方法并在那时自己调用它。您可以通过一些 默认目录 或一些标志来改进此代码,这些标志将传递用户将字段留空的信息,以便您可以决定如何处理输入。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-09
    • 2011-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-07
    • 1970-01-01
    相关资源
    最近更新 更多