是否可以允许用户跳过Inno Setup中的TInputDirWizardPage?

Mik*_*ike 5 inno-setup pascalscript

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

对于这个提示,我正在使用 TInputDirWizardPage.

当用户使用此文件时它工作正常,但如果他不希望,它会自动抛出错误告诉他必须输入路径.

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

小智 7

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

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

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;
Run Code Online (Sandbox Code Playgroud)


TLa*_*ama 5

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

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

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

  • 该“NextButtonClick”方法是在内部调用的,并且无法拦截它,因此在这种情况下使用“TInputDirWizardPage”就不走运了。但制作自己的目录输入页面并不难。仅当您要查找的文件存在时,它甚至可能接受所选文件夹。 (2认同)