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
(语言)类似,而不是再次询问密码。
其实我不是很明白,你为什么不在密码前询问语言就把事情搞得这么复杂。这实际上是有道理的。获取本地化密码提示。
我用这个代码来询问密码:
自定义语言选择器的代码:
当我合并它们时,它不起作用。
在语言选择器之前我需要密码,所以这是不正确的:
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
(语言)类似,而不是再次询问密码。
其实我不是很明白,你为什么不在密码前询问语言就把事情搞得这么复杂。这实际上是有道理的。获取本地化密码提示。