2012-10-11 297 views
4

使用Inno Setup 5.5.2我试图根据路径的存在情况有条件地跳过安装目录的选择。具体来说,如果'D:\'驱动器可用,我希望将它安装到预定义的位置而不提示,如果不可用,请提供合理的默认提示。Inno Setup - Conditional DisableDirPage

我有对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返回的字符串“是”和“不”,以及0整数和我还试着呼吁DirExists。所有产生了相同的编译器错误。

我最好的猜测是它与DisableDirPage需要三态yes,no或auto这个事实有关。是否存在与需要返回的三态逻辑相关的特定类型?在Scripted Constants的创新科技帮助只是说:

被调用的函数必须有一个名为参数1个字符串参数,并且必须返回一个字符串或取决于常数使用中的Boolean值。

+1

这对'ShouldSkipPage'事件处理程序的任务。 – TLama

回答

6

使用ShouldSkipPage事件处理程序时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; 
+0

工作就像一个魅力,谢谢!出于好奇,有什么办法可以为DisableDirPage编写响应,还是仅仅因为ShouldSkipPage事件处理程序存在而被禁止? – Terrance

+0

好问题,从试图使用'string'作为'DefaultDirValid'函数的结果类型的快速测试,编译器因无效值失败,因此可能是被禁止的。 – TLama

+1

通常,常量只能用于那些带有字符串值的设置(并且仅在运行时使用)。大多数布尔设置不支持代码函数,但通常有其他选择。 – Miral