Installation Inno设置-条件禁用目录页
使用Inno Setup 5.5.2,我试图根据路径的存在,有条件地跳过安装目录的选择。具体地说,如果“D:\”驱动器可用,我希望将其安装到预定义的位置,而不需要任何提示;如果不可用,请提供带有合理默认值的提示 我的代码适用于Installation Inno设置-条件禁用目录页,installation,inno-setup,Installation,Inno Setup,使用Inno Setup 5.5.2,我试图根据路径的存在,有条件地跳过安装目录的选择。具体地说,如果“D:\”驱动器可用,我希望将其安装到预定义的位置,而不需要任何提示;如果不可用,请提供带有合理默认值的提示 我的代码适用于DefaultDirName,但不适用于DisableDirPage: [Code] const DefaultDrive = 'D:\'; AppFolder = 'SomeDir'; function GetDefaultDir( Param: Stri
DefaultDirName
,但不适用于DisableDirPage
:
[Code]
const
DefaultDrive = 'D:\';
AppFolder = 'SomeDir';
function GetDefaultDir( Param: String ) : String;
begin
if DirExists( DefaultDrive ) then begin
Result := DefaultDrive + AppFolder;
end else begin
Result := ExpandConstant('{pf}\') + AppFolder;
end;
end;
function DefaultDirValid( Param: String ) : Boolean;
begin
Result := DirExists( DefaultDrive );
end;
[Setup]
; Works as expected
DefaultDirName={code:GetDefaultDir}
...
; Compiler Error - Value of [Setup] section directive "DisableDirPage" is invalid.
DisableDirPage={code:DefaultDirValid}
我曾尝试使用DisableDirPage
函数返回“yes”和“no”字符串,以及0和1的整数。我还尝试将调用内联到DirExists
。它们都产生了相同的编译器错误
我最好的猜测是,这与DisableDirPage
采用是、否或自动三种状态有关。是否存在需要返回的与三态逻辑相关联的特定类型?上的Inno帮助仅说明:
被调用函数必须有一个名为Param的字符串参数,并且必须根据常量的使用位置返回字符串或布尔值
当DefaultDrive
常量路径与以下脚本一起存在时,可以使用事件处理程序跳过目录选择页面:
[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={code:GetDefaultDir}
[Code]
const
DefaultDrive = 'D:\';
AppFolder = 'Some Folder';
function GetDefaultDir(Param: string): string;
begin
Result := DefaultDrive + AppFolder;
if not DirExists(DefaultDrive) then
Result := ExpandConstant('{pf}\') + AppFolder;
end;
function ShouldSkipPage(PageID: Integer): Boolean;
begin
Result := (PageID = wpSelectDir) and DirExists(DefaultDrive);
end;
这是
ShouldSkipPage
事件处理程序的任务。工作非常出色,谢谢!出于好奇,有没有办法为DisableDirPage编写响应代码,或者是因为存在ShouldSkipPage事件处理程序而被禁止?这是一个很好的问题,从尝试使用string
作为DefaultDirValid
函数的结果类型的快速测试中可以看出,编译器因无效值而失败,所以它可能是被禁止的。通常情况下,常量只适用于那些采用字符串值的设置(并且只在运行时使用)。因此,大多数布尔设置不支持代码函数,但通常有其他选项。@Miral,agree,但不是布尔指令。它接受3个可能的值这就是我试图返回字符串的原因。它最初是一个布尔指令,现在是一个小的枚举指令。基本上是一样的;它只是在最终的安装程序中被编码到位标志中,所以它没有任何地方可以存储常量。此外,这也是应该跳过年龄的原因。