4

コンポーネントセクションのパラメータを使用してCheck、特定のラジオボタンがユーザーによってチェックされたかどうかを確認しています。

カスタムページがユーザーに表示される前に述語が呼び出され、常にデフォルト値が返されます。

カスタムページからユーザー入力を取得して、最終的なコンポーネントの選択に影響を与えるにはどうすればよいですか?

[Components]
Name: common; Description: Common files; Types: server client custom; Flags: fixed
Name: client; Description: Client; Types: client; Check: IsClient
Name: server; Description: Server; Types: server

[Code]
var ClientButton: TNewRadioButton;

procedure InitializeWizard;
var
  CustomPage: TWizardPage;
begin
  CustomPage := CreateCustomPage(wpWelcome, 'Installation type', '');
  { CreateRadioButton function is defined elsewhere }
  ClientButton := CreateRadioButton(CustomPage, 16, 'Client', ''); 
end;

function IsClient: Boolean;
begin
  Log('IsClient() called');
  if Assigned(ClientButton) then
    Result :=  ClientButton.Checked
  else 
    Result :=  True;
end;
4

2 に答える 2

4

次のスクリプトは、カスタム ページに 2 つのラジオ ボタンを作成し、それらの選択に基づいて、(コンポーネント選択ページの) コンボ ボックスからインストール タイプを選択します。この選択は、そのカスタム ページを離れるときにのみ発生するため、そのカスタム ページに再度アクセスしない限り、そのコンボ ボックスで行った選択の変更はそのまま残ります。

[Types]
Name: "client"; Description: "Client installation"
Name: "server"; Description: "Server installation"
Name: "custom"; Description: "Custom installation"; Flags: iscustom

[Components]
Name: "common"; Description: "Common files"; Types: client server custom; Flags: fixed
Name: "client"; Description: "Client files"; Types: client
Name: "server"; Description: "Server files"; Types: server

[Files]
Source: "Common.exe"; DestDir: "{app}"; Components: common
Source: "Client.exe"; DestDir: "{app}"; Components: client
Source: "Server.exe"; DestDir: "{app}"; Components: server

[Code]
var
  CustomPage: TWizardPage;
  ClientButton: TNewRadioButton;
  ServerButton: TNewRadioButton;

function CreateRadioButton(AParent: TWizardPage; ATop: Integer; 
  ACaption: string; AHint: string): TNewRadioButton;
begin
  Result := TNewRadioButton.Create(WizardForm);
  with Result do
  begin
    Parent := AParent.Surface;
    Top := ATop;
    Width := AParent.SurfaceWidth;
    Caption := ACaption;
    Hint := AHint;
  end;
end;

procedure InitializeWizard;
begin
  CustomPage := CreateCustomPage(wpWelcome, 'Installation type', '');
  ClientButton := CreateRadioButton(CustomPage, 16, 'Client', ''); 
  ServerButton := CreateRadioButton(CustomPage, 34, 'Server', '');
end;

function NextButtonClick(CurPageID: Integer): Boolean;
begin
  Result := True;
  if CurPageID = CustomPage.ID then
  begin
    if ClientButton.Checked then
      WizardForm.TypesCombo.ItemIndex := 0
    else
    if ServerButton.Checked then
      WizardForm.TypesCombo.ItemIndex := 1;
    WizardForm.TypesCombo.OnChange(WizardForm);
  end;
end;
于 2013-02-01T04:55:28.827 に答える
1

現在、これを行う方法はありません。コンポーネントのチェック関数は通常、ウィザード ページのいずれかが表示された後InitializeSetup、その前に呼び出されます。InitializeWizard

いくつかの回避策がありますが、この場合はコンポーネントを誤用しているようです。

サーバーまたはクライアントの選択を提供するカスタム ページが既にある場合は、[コンポーネント] ページで同じ選択肢を再度表示する必要はありません (コンポーネントは純粋に UI です。他のインストール システムとは異なり、それ以上の特別な意味はありません)。 )。

そのため、コンポーネントを完全に削除し、条件の代わりにまたはその他のエントリでCheck直接使用する必要があります。FilesComponents

于 2013-01-18T10:07:53.473 に答える