TWebBrowser を実行時に生成する
使ってる人には常識的な話でしょうけど。
TWebBrowser
は COM コンポーネント側に Parent
という(IDispatch
型の)プロパティを持っています。で,これが VCL の Parent
プロパティを隠してしまうので,実行時生成しようとすると困ります。
FWebBrowser := TWebBroser.Create(Form1); FWebBrowser.Parent := Form1;
とかやると,「読み込み専用のプロパティ Parent
に値を設定しようとしました」とかなんとか怒られます。
TWebBrowser
は TObject
⇒……⇒ TWinControl
⇒ TOleControl
な継承ツリーの下にいるので,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;
ちなみに動的に生成するメリットは,ですが,
TWebBrowser
は ActiveX コントロールなので,生成に時間がかかる。このため,普通にフォームに貼り付けると起動時にもっさりしてしまうので,自力で生成して挙動を完全に自力でコントロールしたい。SHDocVw.pas
をプロジェクトソースに添付しておける。自己流に手を加えている場合とか,人にソースを送りつけるときとか,いちいち「タイプライブラリから取り込んどいてね」とかいわなくていい。
などがあります。このコンポーネントについてはフォームデザイナからインタラクティブにぐりぐりいじる必要性があんまりないですしね。