5

ユーザーがすべてのユーザーにインストールすることを選択したか、現在のユーザーのみにインストールすることを選択したかに応じて、異なるフォルダーにファイルをインストールしたいと考えています。

CreateInputOptionPage() を追加して、2 つのラジオ ボタンを持つオプション ページを作成しました。

ただし、私のインストーラーには、次の 2 つのような多くの重複行が散らばっています。

Source: {#ProjectRootFolder}\License.txt; DestDir: {userdocs}\{#MyAppName}; Check: NOT IsAllUsers
Source: {#ProjectRootFolder}\License.txt; DestDir: {commondocs}\{#MyAppName}; Check:IsAllUsers

上記を行うよりエレガントな方法はありますか?たとえば、Pascal コードで #define のように変数を作成して、上記の {userdocs} と {commondocs} の代わりに使用できますか?

詳細:

上記の IsAllUsers() 関数は、次のコードを呼び出します。

function IsAllUsers: Boolean;
begin
#ifdef UPDATE
  Result := AllUsersInRegistryIsTRUE;
#else
  Result := AllUsersOrCurrentUserPage.Values[1]; // wizard page second radio button
#endif
end; 

と:

function AllUsersInRegistryIsTRUE: Boolean;  // True if preceding install was to all users' documents 
var
  AllUsersRegValue: AnsiString;
begin
  if RegQueryStringValue(HKEY_LOCAL_MACHINE, 'Software\MyApp', 'AllUsers', AllUsersRegValue) then
    Result := (UpperCase(AllUsersRegValue) = 'YES')
  else
    Result := FALSE;
end; 
4

1 に答える 1

8

このようなものが合うでしょうか?

[Files]
Source: {#ProjectRootFolder}\License.txt; DestDir: {code:GetDir}\{#MyAppName};

...

[Code]
var
  OptionsPage: TInputOptionWizardPage;

procedure InitializeWizard;
begin
  OptionsPage := CreateInputOptionPage(wpUserInfo, 
              'please select', 'the kind of installation', 'and continue..', 
              True, False);
  OptionsPage.Add('All users');
  OptionsPage.Values[0] := True;
  OptionsPage.Add('This user');
end;

function GetDir(Dummy: string): string;
begin
  if OptionsPage.Values[0] then
    Result := ExpandConstant('{commondocs}')
  else
    Result := ExpandConstant('{userdocs}');
end;
于 2012-06-08T00:33:33.397 に答える