我使用此代码要求输入密码: 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;
答案 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
(语言)类似,而不是再次要求输入密码。
我实际上并不是真的明白,为什么你在密码之前不要求语言而使事情变得复杂。它实际上是有道理的。获取本地化密码提示。