マルチスレッドでWebBrowser1NewWindow2で窓を開くには。

解決


吉田  2009-05-16 06:01:33  No: 34438

よろしくお願いします。環境はWindowsXP sp3  Delphi 6 Personalです。
ただいま、下記のママんさんの書かれたタブブラウザを見本にそのままコピペして
この質問に関連すると思われる箇所だけを書いています。
  https://www.petitmonte.com/bbs/answers?question_id=4078
当然そのままでは作動するのですが、
それをマルチスレッドで実行させたいと思っていろいろやっています。
しかし、TIETabSheet.WebBrowser1NewWindow2手続きの
リンクを右クリックで新しいウィンドウで開くがうまくいきません。
問題点がタブシートクラス、マルチスレッドクラス、Formクラスにまたがるかもしれないと
考え、長くなりましたが下記にコードを書きました。
WebBrowser1のイベントごとマルチスレッドに入れるべきなのか、
その辺のところも解りません。
アドバイスをよろしくお願いいたします。
type
 TIETabSheet = class(TTabSheet)//-------------タブシートクラス
  private
    procedure WebBrowser1NewWindow2(Sender: TObject;
        var ppDisp: IDispatch; var Cancel: WordBool);
  public
    WebBrowser1 : TWebBrowser;
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  end;
  TNaviThread = class(TThread)//---------------TNaviThreadマルチスレッドクラス
     private
       FURL:   string;
     protected
       procedure Execute; override;
     public
       constructor Create(url: String); virtual;
       procedure ThreadAddNewPage;
   end;
  TForm1 = class(TForm)//------------------------TForm1クラス
    Button1: TButton;
    PageControl1: TPageControl;
    procedure Button1Click(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  end;
var
  Form1: TForm1;
implementation
{$R *.dfm}
{ TIETabSheet }//------------------------タブシートクラス
procedure TIETabSheet.WebBrowser1NewWindow2(Sender: TObject;var ppDisp: IDispatch;
            var Cancel: WordBool);
begin
    TNaviThread.Create( ''); //<<■■ここで右クリックの新しいタブが開くには??■■
    ppDisp :=  (Form1.PageControl1.ActivePage as TIETabSheet).WebBrowser1.Application;
end;
constructor TIETabSheet.Create(AOwner: TComponent);
begin         //タブシートの作成と同時にブラウザ作成
  inherited;
  WebBrowser1 := TWebBrowser.Create(self);
  TOleControl(WebBrowser1).Parent := Self;
  WebBrowser1.Align               := alClient;
  //イベント定義
  WebBrowser1.OnNewWindow2        := WebBrowser1NewWindow2;
end;
destructor TIETabSheet.Destroy;//タブシートの破棄と同時にブラウザ破棄
begin                                   WebBrowser1.Free;
  inherited;
end;
{TNaviThread} //------------------------マルチスレッドクラス
constructor TNaviThread.Create(url: String);
begin
    FURL:=url;
    inherited Create(False);
    FreeOnTerminate := True;
end;
procedure TNaviThread.Execute;
begin
  Synchronize(ThreadAddNewPage);
end;
procedure TNaviThread.ThreadAddNewPage; //新規タブ作成
var
  IETab:TIETabSheet;
begin
  IETab :=  TIETabSheet.Create(Form1.PageControl1);
  IETab.Parent       := Form1.PageControl1;
  IETab.PageControl  := Form1.PageControl1;
  IETab.Caption:= FURL;
  IETab.WebBrowser1.Navigate(FURL);
end;
{ TForm1 }//--------------------------Form1クラス
procedure TForm1.Button1Click(Sender: TObject);//Naviボタン
begin  //テストアドレス(失礼します)
    PageControl1.TabWidth:=120;
    TNaviThread.Create( 'http://www.tohoho-web.com/');
    TNaviThread.Create( 'http://www13.plala.or.jp/kmaeda/index.html');
    TNaviThread.Create( 'http://itpro.nikkeibp.co.jp/article/COLUMN/20061127/254990/?ST=develop&P=2');
end;


KHE00221  2009-05-16 07:22:35  No: 34439

procedure TIETabSheet.WebBrowser1NewWindow2(Sender: TObject;var ppDisp: IDispatch;var Cancel: WordBool);
var
    I: Integer;
begin
    I := Form6.PageControl1.PageCount;
    TNaviThread.Create(''); //<<■■ここで右クリックの新しいタブが開くには??■■
    while Form6.PageControl1.PageCount = I do
    begin
      Application.ProcessMessages;
    end;
    ppDisp := (Form6.PageControl1.Pages[Form6.PageControl1.PageCount-1] as TIETabSheet).WebBrowser1.Application;
    Form6.PageControl1.ActivePageIndex := Form6.PageControl1.PageCount-1;
    //ppDisp :=  (Form6.PageControl1.ActivePage as TIETabSheet).WebBrowser1.Application;
end;


吉田  2009-05-16 07:59:02  No: 34440

KHE00221さん、早速教えて頂いて有り難うございました。
Form6をForm1にして組み込んでやってみましたら
見事に成功しました。
まだ、魔法のようで、どうして出来るのか理解できませんが、
ゆっくり勉強したいと思います。
有り難うございました。


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

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






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