よろしくお願いします。環境は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クラスに置くべき、
などと考え、正解が解りません。
どのように考えたらいいでしょうか。
よろしくお願いします。
自己レスです。
3パターンで実験した結果、
Formに置くのが
一度に大量のアドレスを渡したときの、エラーが少なく処理が早く、
リソースが少ないことが解りましたのでFormに置くことにしました。
(#もとより理屈は解りませんが。)
有り難うございました。
別にイベント記述をどこか一つに限定する必要はありません。
適材適所で記述したほうが後々わかりやすいと思います。
イベントを横取りする方法は複数ありますので、
今回の例はあくまで私のサンプルです。
このようにすると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.
monaa さん、お礼が遅くなりすみません。
アドバイス頂けるとは思っていなかったのもですから、
久しぶりに覗いてみました。
初心者にとって少し高度な内容ですから、じっくり勉強してみます。
有り難うございました。
ツイート | ![]() |