TWebBrowser を実行時に生成する

使ってる人には常識的な話でしょうけど。

TWebBrowser は COM コンポーネント側に Parent という(IDispatch 型の)プロパティを持っています。で,これが VCLParent プロパティを隠してしまうので,実行時生成しようとすると困ります。

FWebBrowser := TWebBroser.Create(Form1);

FWebBrowser.Parent := Form1;

とかやると,「読み込み専用のプロパティ Parent に値を設定しようとしました」とかなんとか怒られます。

TWebBrowserTObject ⇒……⇒ TWinControlTOleControl な継承ツリーの下にいるので,TWinControl にキャストしてやれば OK です。

で勇んで

(FWebBrowser1 as TOleControl).Parent := Form1;

とやるとまだ怒られる罠。Object Pascal むずかしーな。

TOleControl(FWebBrowser).Parent := Form1;

とほんとに静的キャストする必要があるのでした。

Panel1 の内部に alClient で動的に作成する例。

FWebBrowser := TWebBrowser.Create(Form1);

with TOleControl(FWebBrowser) do begin
  Parent := Panel1;
  Name   := 'FWebBrowser';
end;

with FWebBrowser do begin
  Align := alClient;

  AddressBar  := False;
  FullScreen  := False;
  MenuBar     := False;
  Offline     := False;
  Silent      := False;
  StatusBar   := False;
  TheaterMode := False;

  Visible := True;
end;

ちなみに動的に生成するメリットは,ですが,

  • TWebBrowserActiveX コントロールなので,生成に時間がかかる。このため,普通にフォームに貼り付けると起動時にもっさりしてしまうので,自力で生成して挙動を完全に自力でコントロールしたい。
  • SHDocVw.pas をプロジェクトソースに添付しておける。自己流に手を加えている場合とか,人にソースを送りつけるときとか,いちいち「タイプライブラリから取り込んどいてね」とかいわなくていい。

などがあります。このコンポーネントについてはフォームデザイナからインタラクティブにぐりぐりいじる必要性があんまりないですしね。