2012-10-11 295 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