3

inno でカスタム ウィザード ページを作成しました。これは、ファイルを {app} フォルダーにインストールした後に表示する必要があります。これは、wpInfoAfter を与えることによって実現されます。問題は、「次へ」ボタンのみが表示され、キャンセル/戻るボタンがなく、右上のダイアログの閉じるボタンも無効になっていることです。インストールされているファイルを削除する必要があるため、戻るボタンは必要ないことを理解しています。とにかく「キャンセル」ボタンを表示できるものはありますか?

4

1 に答える 1

6

CancelInnoSetup は、インストール プロセスが完了した後、キャンセルが必要な追加のアクションを実行することを想定していないため、インストール後の段階ではボタンには機能がありません。そのため、その事実に反してボタンを表示しても、アクションなしでボタンが表示されます。

個人的には、インストールを開始する前にデータベースのセットアップに必要な情報を収集することを好みます。これは、ユーザーがアプリケーションをインストールし、インストール後のウィザードを単にキャンセルする状況を考慮したためです (これは簡単に起こり得ることです)。事前に行うことで、ユーザーが実際にアプリケーション自体に到達する前に、必要なものを入力するようにユーザーに強制することができます。ただし、インストール後にまだやりたい場合は、欠落しているキャンセル ボタンの回避策を次に示します。

回避策として、同じ機能で同じ位置にある独自のカスタム ボタンを作成できます。これはサンプル スクリプトで、キャンセル ボタンをシミュレートし、インストール プロセスの後に配置されているカスタム ページにのみ表示します。少なくともこれを修正する必要があるため、これは単なる回避策です。

  • ウィザード フォームのクロージング クロスを有効にします (インストール ステージが完了すると無効になります)。
  • キーショートカットを何らかの方法で処理しESCます(終了プロンプトダイアログも呼び出しますが、これを回避する方法が見つかりませんでした)

[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program

[Code]
procedure ExitProcess(uExitCode: UINT);
  external 'ExitProcess@kernel32.dll stdcall';

var
  CustomPage: TWizardPage;
  CancelButton: TNewButton;

procedure OnCancelButtonClick(Sender: TObject);
begin
  // confirmation "Exit setup ?" message, if user accept, then... 
  if ExitSetupMsgBox then
  begin
    // stop and rollback actions you did from your after install
    // process and kill the setup process itself
    ExitProcess(0);
  end;  
end;

procedure InitializeWizard;
begin
  // create a custom page
  CustomPage := CreateCustomPage(wpInfoAfter, 'Caption', 'Description');
  // create a cancel button, set its parent, hide it, setup the bounds
  // and caption by the original and assign the click event
  CancelButton := TNewButton.Create(WizardForm);
  CancelButton.Parent := WizardForm;
  CancelButton.Visible := False;
  CancelButton.SetBounds(
    WizardForm.CancelButton.Left, 
    WizardForm.CancelButton.Top, 
    WizardForm.CancelButton.Width,
    WizardForm.CancelButton.Height
  );  
  CancelButton.Caption := SetupMessage(msgButtonCancel);  
  CancelButton.OnClick := @OnCancelButtonClick;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  // show your fake Cancel button only when you're on some of your after
  // install pages; if you have more pages use something like this
  // CancelButton.Visible := (CurPageID >= FirstPage.ID) and 
  //   (CurPageID <= LastPage.ID);
  // if you have just one page, use the following instead
  CancelButton.Visible := CurPageID = CustomPage.ID;
end;
于 2012-09-19T08:29:47.333 に答える