必要なActiveXが実行環境にない場合の起動エラー回避

 DelphiでActiveXコントロール(以下ActiveX)を用いたプログラムを作成した場合、実行環境によってはそのActiveXがない場合にプログラムを起動すると(当然ですが)エラーが発生します。ActiveXそのものを動的に生成すれば良いように思えますが、この方法では実際にはうまくいかないようです(インターネットエクスプローラをインストールすると出来上がるTWebBrowserも動的には生成出来ますが、どうやっても表示させることが出来ません)。回避方法としては、あらかじめActiveXを貼付けたフォームを「選択可能なフォーム」として、起動後に動的に生成してその生成に例外処理を行なうといった手段が考えられます。しかしながら、メインフォームでActiveXを使用したい場合にはこの方法は取れませんね。
 ここではMiViewで用いた、他のフォームを生成してメインフォームに貼付けるという方法を紹介します。

  1. 使用したいActiveXを貼付けたフォームを作成して、そのフォームのボーダースタイルをbsNoneにしておきます。
  2. このフォームをプロジェクトマネージャーで「自動生成」から「選択可能なフォーム」に変更します。
  3. メインフォームにはActiveXを使用したい部分にパネルを貼付けます。
  4. メインフォームの FormCreateイベントでActiveXを貼付けたフォームを生成します。
  5. エラーが発生しなければ、そのActiveXは使用可能ということですからメインフォームに表示する処理を行ないます。
  6. エラーが発生した場合にはその処理を行ないます(代替えの処理を準備しておくとか、これこれの機能は使用出来ませんとメッセージを表示する等)


以下は簡単なサンプルです。

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ExtCtrls;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    procedure FormCreate(Sender: TObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

// Form2を使用する
uses Unit2;

{$R *.DFM}

// Form2を選択可能なフォームにしてここで宣言する
var
  Form2: TForm2;

procedure TForm1.FormCreate(Sender: TObject);
begin
  try
    // Form2を動的に生成する
    // Form2のBorderStyleはbsNoneにしておくこと
    Form2 := TForm2.Create(self);
    // Panel1をParentにすることでForm2をメインフォームの一部にしてしまう
    Form2.Parent  := Panel1;
    // Form2のAlignをalClientにすることによりPanel1に合せる
    Form2.Align   := alClient;
    // Form2を表示させる
    Form2.Visible := True;
  except
    // Form2の生成に失敗した場合の処理
    MessageDlg('IEがインストールされていません.', mtWarning, [mbOK], 0);
  end;
end;

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  // Form1を閉じるときにForm2が生成されていた場合に破棄する
  if Assigned(Form2) then
    Form2.Release;
end;

end.


サンプルプロジェクトのダウンロード(2,132byte)