TWebBrowserのイベントをどこに置くべきか解りません

解決


吉田  2009-05-22 02:21:57  No: 34488

よろしくお願いします。環境はWindowsXP sp3  Delphi 6 Personalです。
https://www.petitmonte.com/bbs/answers?question_id=6291
で示したようにタブブラウザを作成しています。
Pagecontrolに作成したタブに作成したTIETabSheetクラスのタブシートを貼り付け
そのタブシートにTWebBrowserコンポーネントを貼り付けています。

質問:TWebBrowserは、NavigateComplete2  BeforeNavigate2  StateChangeなど
いろいろなイベントを使うことになりますが、下記のクラスで
TIETabSheet = class(TTabSheet)//-------------タブシートクラス
TNaviThread = class(TThread)//---------------TNaviThreadマルチスレッドクラス
TForm1 = class(TForm)//------------------------TForm1クラス
実験した結果、TWebBrowserコンポーネントのイベントをどのクラスに置いても
作動するのですが、初心者が浅はかな考えを巡らせると
タブシートに貼り付けたTWebBrowserのイベントだからタブシートクラスに置くべき、
いや、マルチスレッドでタブを作成しているからマルチスレッドクラスに置くべき、
いや、PagecontrolはFormに貼り付けてあるのだからFormクラスに置くべき、
などと考え、正解が解りません。
どのように考えたらいいでしょうか。
よろしくお願いします。


吉田  2009-05-24 22:27:10  No: 34489

自己レスです。
3パターンで実験した結果、
Formに置くのが
一度に大量のアドレスを渡したときの、エラーが少なく処理が早く、
リソースが少ないことが解りましたのでFormに置くことにしました。
(#もとより理屈は解りませんが。)
有り難うございました。


monaa  2009-05-25 01:11:42  No: 34490

別にイベント記述をどこか一つに限定する必要はありません。
適材適所で記述したほうが後々わかりやすいと思います。
イベントを横取りする方法は複数ありますので、
今回の例はあくまで私のサンプルです。
このようにするとNavigateComplete2を二か所で記述可能になります。
もっといい書き方があるかもしれませんが、
Delphiのイベントならどんなイベントでも同じ方法で記述可能です。

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, OleCtrls, SHDocVw;

type
  TMonaBrowser = class(TWebBrowser)
  private
    FOnNavigateCompleteEx2: TWebBrowserNavigateComplete2;
    property OnNavigateComplete2;
  protected
    procedure MonaBrowserNavigateComplete2(ASender: TObject; const pDisp: IDispatch; var URL: OleVariant);
    property OnNavigateComplete2Ex: TWebBrowserNavigateComplete2 read FOnNavigateCompleteEx2 write FOnNavigateCompleteEx2;
    constructor Create(AOwner: TComponent); override;
  end;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private 宣言 }
    WebBrowser1: TMonaBrowser;
    procedure WebBrowser1NavigateComplete2Ex(ASender: TObject; const pDisp: IDispatch; var URL: OleVariant);
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TMonaBrowser }
constructor TMonaBrowser.Create(AOwner: TComponent);
begin
  inherited;
  //イベントをトラップ
  OnNavigateComplete2 := MonaBrowserNavigateComplete2;
end;

procedure TMonaBrowser.MonaBrowserNavigateComplete2(ASender: TObject;
  const pDisp: IDispatch; var URL: OleVariant);
begin
  //共通動作が必要な場合ここに記述
  ShowMessage('TMonaBrowser.MonaBrowserNavigateComplete2');

  if Assigned(FOnNavigateCompleteEx2) then
    OnNavigateComplete2Ex(ASender,pDisp,URL);
end;

{ TForm1 }
procedure TForm1.Button1Click(Sender: TObject);
begin
  WebBrowser1.Navigate('http://www.google.co.jp/');
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  WebBrowser1 := TMonaBrowser.Create(self);
  WebBrowser1.SetBounds(0,0,200,200);
  WebBrowser1.SetParent(self);
  WebBrowser1.Show;
  //新しいNavigateComplete2Exイベント
  WebBrowser1.OnNavigateComplete2Ex := WebBrowser1NavigateComplete2Ex;
end;

procedure TForm1.WebBrowser1NavigateComplete2Ex(ASender: TObject;
  const pDisp: IDispatch; var URL: OleVariant);
begin
  ShowMessage('TForm1.WebBrowser1NavigateComplete2Ex');
end;

end.


吉田  2009-05-27 08:02:25  No: 34491

monaa さん、お礼が遅くなりすみません。
アドバイス頂けるとは思っていなかったのもですから、
久しぶりに覗いてみました。

初心者にとって少し高度な内容ですから、じっくり勉強してみます。
有り難うございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加