よろしくお願いします。環境は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;
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;
KHE00221さん、早速教えて頂いて有り難うございました。
Form6をForm1にして組み込んでやってみましたら
見事に成功しました。
まだ、魔法のようで、どうして出来るのか理解できませんが、
ゆっくり勉強したいと思います。
有り難うございました。
ツイート | ![]() |