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

Inno Setup - Merging implementations of event functions that return boolean (like InitializeSetup)

我用这个代码来询问密码:

自定义语言选择器的代码:

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

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

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; 

Inno 设置 6

Inno Setup 6 具有 event attributes 有助于解决此问题的功能。

只需确保您的每个事件实现都有一个唯一的名称,例如附加唯一后缀。并使用已实施事件的名称添加 event 属性。

[Code]
function InitializeSetup(): Boolean;
begin
  Result := ...
end;

<event('InitializeSetup')>
function InitializeSetup2(): Boolean;
begin
  Result := ...
end;

Inno 设置 5

一般来说,最简单的方法是将事件函数的两个实现分开,并添加一个调用两者的包装器实现。

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;

有关该问题的更一般性讨论,请参阅


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

所以实际上,InitializeSetup2(密码)实现必须与 InitializeSetup1(语言)类似,而不是再次询问密码。

其实我不是很明白,你为什么不在密码前询问语言就把事情搞得这么复杂。这实际上是有道理的。获取本地化密码提示。