5

Inno Setup 5.5.2 を使用して、パスの存在に応じて、条件付きでインストール ディレクトリの選択をスキップしようとしています。具体的には、「D:\」ドライブが使用可能な場合は、事前に定義された場所にプロンプ​​トなしでインストールし、それが使用できない場合は、合理的なデフォルトでプロンプトを提供します。

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私の推測では、イエス、ノー、またはオートの 3 つの状態を取るという事実と関係があると思われます。返す必要があるトライステート ロジックに関連付けられた特定の型はありますか? スクリプト化された定数に関する Inno のヘルプには、次のようにしか書かれていません。

呼び出された関数には、Param という名前の 1 つの文字列パラメーターが必要であり、定数が使用されている場所に応じて、文字列またはブール値を返す必要があります。

4

1 に答える 1

8

次のスクリプトで一定のパスが存在する場合、イベント ハンドラーを使用し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;
于 2012-10-11T13:53:47.450 に答える