全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:3453
推到 Plurk!
推到 Facebook!

pagecontrol上放了WebBrowser,点击链接后产生新的tabsheet

尚未結案
wzpuma
一般會員


發表:10
回覆:19
積分:5
註冊:2003-02-27

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-02-27 17:08:11 IP:218.5.xxx.xxx 未訂閱
请教个问题。我在pagecontrol控件上放了WebBrowser控件,希望点击WebBrower中的打开链接后还在该WebBrowser中显示,即产生新的tabsheet,上面有WebBrowser,显示新的网页,而不是跳出IE浏览器,(最好把该IE关掉)。 我曾用NewWindow2和 BeforeNavigate2事 件。 WebBrowser1NewWindow2(Sender: TObject;var ppDisp: IDispatch; var Cancel: WordBool);设 置 Cancel:= False来禁止IE弹出广告之类的小窗体,但也无法打开新窗口了。 我曾用var t :TTabSheet; W: TWebBrowser; begin t := TTabSheet.Create(self); t.PageControl := pagecontrol1; w:=TWebBrowser.Create(self); t.InsertControl(w); w.Align:=alclient; w.Visible:=true; t.caption:=w.LocationName; 但新tabsheet上有时(怪)没有TWebBrowser,且caption上一片空白, 發表人 - wzpuma 於 2003/02/27 17:13:19 發表人 - wzpuma 於 2003/02/27 17:16:12 發表人 - wzpuma 於 2003/02/27 17:21:33
wzpuma
一般會員


發表:10
回覆:19
積分:5
註冊:2003-02-27

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-02-27 20:33:53 IP:218.5.xxx.xxx 未訂閱
补充:主要问题是 怎么禁止网页代码自动打开窗口,保留用户点击超链接打开窗口,并使打开的窗 口显示于WebBrowser上,而不是跳出IE浏览器。
wushang
一般會員


發表:2
回覆:13
積分:13
註冊:2003-02-10

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-02-27 22:15:49 IP:218.16.xxx.xxx 未訂閱
可以寫以下事件﹕ procedure TForm1.WebBrowser1NewWindow2(Sender: TObject; var ppDisp: IDispatch; var Cancel: WordBool); var newtab : TTabSheet; newweb : TWebBrowser; begin newtab := TTabSheet.Create(Self) ; newtab.PageControl := PageControl1; newtab.Caption := 'PageControl1'; newweb := TWebBrowser.Create(self); newweb.ParentWindow := newtab.Handle; newweb.Align := alClient; ppDisp := newweb.DefaultDispatch; end;
wzpuma
一般會員


發表:10
回覆:19
積分:5
註冊:2003-02-27

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-02-28 09:30:15 IP:218.5.xxx.xxx 未訂閱
我加入了wushang教我的代码,但还有几个小问题(我太笨): 每点击超链接链接到一新网页或有网页代码自动打开窗口,就产生一个TTabSheet,自然TTabSheet上什么也没有。 我的意思是希望点击超链接时才打开窗口,链接到一新网页或有网页代码自动打开窗口时不要产生一个空白的TTabSheet。 另外虽然用了newtab.Caption := newweb.LocationName;newtab的Caption还是一片空白。 最后谢谢wushang先生。
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-03-01 20:54:30 IP:61.221.xxx.xxx 未訂閱
wushang 兄的程式要加入一行使得 alClient 有作用, 修改如下:    
procedure TForm1.WebBrowser1NewWindow2(Sender: TObject;
  var ppDisp: IDispatch; var Cancel: WordBool);
var
newtab : TTabSheet;
newweb : TWebBrowser;
begin
  newtab := TTabSheet.Create(Self) ;
  newtab.PageControl := PageControl1;
  newtab.Caption := 'PageControl1';
  newweb := TWebBrowser.Create(self);
  newweb.ParentWindow := newtab.Handle;
  TOleControl(newweb).Parent :=newtab; //加入此行
  newweb.Align := alClient;
  ppDisp := newweb.DefaultDispatch;
end;
wzpuma
一般會員


發表:10
回覆:19
積分:5
註冊:2003-02-27

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-03-01 21:28:19 IP:218.5.xxx.xxx 未訂閱
timhuang兄的程式还有个小问题: 用户点击超链接,有时是跳出IE浏览器,而不是使打开的窗 口显示于TTabSheet的WebBrowser上。有时是指上www.21cn.com 或www.sohu.com 等网站看新闻,点击新闻标题后即启动了IE。 且有时网页代码自动打开窗口(广告条)时产生一个空白的TTabSheet。
wushang
一般會員


發表:2
回覆:13
積分:13
註冊:2003-02-10

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-03-01 22:30:13 IP:218.16.xxx.xxx 未訂閱
你的問題可能在對新創建的NEWWEB沒有設定OnNewWindow2 事件處理過程﹕ 在timhuang兄回貼中紅色語句后再加一句﹕ newweb.OnNewWindow2 := WebBrowser1.OnNewWindow2 這樣每個新創建的WebBrowser也具有用新窗口打開網頁的功能﹐不過彈出廣告的問題確實不好解決﹐我在試驗時發現它也會被作為新聯接打開(即創建新的TABSHEET和WEBBROWSER﹐但是不會顯示空白)﹐如果廣告比網頁先載入﹐它創建的TABSHEET在網頁創建的之前﹐反之同理﹒ 另外建議加一個全局變數使得每打開一個新的TABSHEET即將它顯示在最上層(用PAGECONTROL的TABINDEX屬性)
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-03-02 01:01:49 IP:61.221.xxx.xxx 未訂閱
誠如 wushang 兄所述, 你的新建 webbrowser 沒有指定該 OnNewWindow2 event 的 處理, 修改可以如同 wushang 兄的方式, 或是加入 (a) 部分:
procedure TForm1.WebBrowser1NewWindow2(Sender: TObject;
  var ppDisp: IDispatch; var Cancel: WordBool);
var
newtab : TTabSheet;
newweb : TWebBrowser;
begin
  newtab := TTabSheet.Create(Self) ;
  newtab.PageControl := PageControl1;
  newtab.Caption := 'PageControl1';
  newweb := TWebBrowser.Create(self);
  newweb.ParentWindow := newtab.Handle;
  TOleControl(newweb).Parent :=newtab;
  newweb.Align := alClient;
  newweb.OnNewWindow2 := WebBrowser1NewWindow2; //加入這行 (a)
  newweb.OnBeforeNavigate2 := WebBrowser1BeforeNavigate2; //後面敘述之功能 (b)
  ppDisp := newweb.DefaultDispatch;
end;
即可, 這樣每一個新建的 WebBrowser 都可以具備相同的 OnNewWindow2 Event 了!! 功能(b) 另外你要抓 url 的部分, 小弟試了一下, LocationName 必須是在 BeforeNavigate2 之後才抓得到, 所以建議你在原來的 WebBrowser1 中的 BeforeNavigate2 event 中取得 url 或是 LocationName 皆可, 再進行填回 tabsheet 的 caption 中即可. 程式如下: 加入原來的 webbrowser1 中的 BeforeNavigate2 event 如下:
procedure TForm1.WebBrowser1BeforeNavigate2(Sender: TObject;
  const pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData,
  Headers: OleVariant; var Cancel: WordBool);
begin
  TTabSheet(TOleControl(Sender).Parent).Caption := url;
end;
另外在前面的WebBrowser1NewWindow2中加入紅色的功能 (b)即可!!
wzpuma
一般會員


發表:10
回覆:19
積分:5
註冊:2003-02-27

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-03-03 09:44:59 IP:218.5.xxx.xxx 未訂閱
问题基本解决了,感谢二位。最后请问: timhuang兄的代码TTabSheet(TOleControl(Sender).Parent).Caption := url; 将使TTabSheet.caption上显示一长串的URL,如www.yahoo.com, 如只要显现雅虎二字要用什么?BeforeNavigate2 event参数中没有 LocationName 。 有时Caption还是一片空白,如上雅虎即如此。 如我觉得newtab 太多,想关闭几个,用pagecontrol1.Pages[i].Destroy是否会造成pagecontrol1.Pages[i]上的TWebBrowser继续占用系统资源?
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-03-03 10:36:35 IP:210.58.xxx.xxx 未訂閱
要取得瀏覽器中網頁的 title 必須要在網頁下載完成後,  取用其 document 中的 title 即可. 所以你可以先寫在 DocumentComplete event 中, 如下,  即可取得文件中的 title!!
procedure TForm1.WebBrowser1DocumentComplete(Sender: TObject;
  const pDisp: IDispatch; var URL: OleVariant);
var
  hd : IHTMLDocument2;
begin
  hd := TWebBrowser(Sender).Document as IHTMLDocument2;
  TTabSheet(TOleControl(Sender).Parent).Caption := hd.title;
end;
另外在上面的藍色 (a), 紅色 (b), 後再加入一行
  newweb.OnDocumentComplete := WebBrowser1DocumentComplete; //取得文件標題 功能(c) 
如此一來即可取得 title 了, 記得要 use MSHtml !! 另外你問的除去 pagecontrol 中的 tabsheet 是否會發生 TWebBrowser 佔用資源的問題, 這部分因為我們在建立 TWebBrowser 時, 其 owner 是 Form1, 所以在 Form1 結束時會去 釋放我們建立的 TWebBrowser, 而不是在 TabSheet 釋放的時候發生, 不過你仍可自行撰寫 程式碼在 TabSheet 釋放時, 也將其上面的 TWebBrowser 釋放即可!!
wzpuma
一般會員


發表:10
回覆:19
積分:5
註冊:2003-02-27

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-03-03 12:00:57 IP:218.5.xxx.xxx 未訂閱
多谢二位指点。贵网站真是高手如云。困扰我二星期的问题让你们一下就解决了。
系統時間:2024-05-05 0:35:10
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!