Inno Setup - 合并返回布尔值的事件函数的实现(如InitializeSetup)

时间:2017-01-04 13:17:12

标签: inno-setup

我使用此代码要求输入密码: Inno Setup - Move the password page before the welcome page (first page)

这个自定义语言选择器的代码:
Inno Setup - Language selector with VCL Styles

当我合并它们时,它不起作用。

在语言选择器之前我需要密码,所以这是不正确的:

function InitializeSetup(): Boolean;
var
  Language: string;
begin
  Result := True;
  Language := ExpandConstant('{param:LANG}');
  if Language = '' then
  begin
    Log('No language specified, showing language dialog');
    SelectLanguage();
    Result := False;
    Exit;
  end
    else
  begin
    Log('Language specified, proceeding with installation');
    Result := AskPassword();
  end;
end;

这样,如果密码不正确,设置将继续。

function InitializeSetup(): Boolean;
var
  Language: string;
begin
  Result := True;
  Language := ExpandConstant('{param:LANG}');
  if Language = '' then
  begin
    Result := AskPassword();
    Log('No language specified, showing language dialog');
    SelectLanguage();
    Result := False;
    Exit;
  end
    else
  begin
    Log('Language specified, proceeding with installation');
  end;
end; 

1 个答案:

答案 0 :(得分:1)

通常,最简单的方法是将事件函数的两个实现分开,并添加一个调用它们的包装器实现。

function InitializeSetup1(): Boolean;
var
  Language: string;
begin
  Result := True;
  Language := ExpandConstant('{param:LANG}');
  if Language = '' then
  begin
    Log('No language specified, showing language dialog');
    SelectLanguage();
    Result := False;
    Exit;
  end
    else
  begin
    Log('Language specified, proceeding with installation');
    Result := True;
  end;
end;

function InitializeSetup2(): Boolean;
begin
  Result := AskPassword();
end;

function InitializeSetup(): Boolean;
begin
  { Order the calls the way you want the checks to be performed }
  Result :=
    InitializeSetup2() and
    InitializeSetup1();
end;

有关问题的更一般性讨论,请参见
Merging event function (InitializeWizard) implementations from different sources

虽然在您的特定情况下,它更复杂,因为您还需要将密码从第一个实例传递到另一个实例,类似于语言从第一个实例传递到另一个实例的方式。 / p>

实际上,InitializeSetup2(密码)实现必须与InitializeSetup1(语言)类似,而不是再次要求输入密码。

我实际上并不是真的明白,为什么你在密码之前不要求语言而使事情变得复杂。它实际上是有道理的。获取本地化密码提示。