pagecontrol上放了WebBrowser,点击链接后产生新的tabsheet |
尚未結案
|
wzpuma
一般會員 發表:10 回覆:19 積分:5 註冊:2003-02-27 發送簡訊給我 |
请教个问题。我在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 發送簡訊給我 |
|
wushang
一般會員 發表:2 回覆:13 積分:13 註冊:2003-02-10 發送簡訊給我 |
可以寫以下事件﹕
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 發送簡訊給我 |
|
timhuang
尊榮會員 發表:78 回覆:1815 積分:1608 註冊:2002-07-15 發送簡訊給我 |
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 發送簡訊給我 |
|
wushang
一般會員 發表:2 回覆:13 積分:13 註冊:2003-02-10 發送簡訊給我 |
你的問題可能在對新創建的NEWWEB沒有設定OnNewWindow2 事件處理過程﹕
在timhuang兄回貼中紅色語句后再加一句﹕
newweb.OnNewWindow2 := WebBrowser1.OnNewWindow2
這樣每個新創建的WebBrowser也具有用新窗口打開網頁的功能﹐不過彈出廣告的問題確實不好解決﹐我在試驗時發現它也會被作為新聯接打開(即創建新的TABSHEET和WEBBROWSER﹐但是不會顯示空白)﹐如果廣告比網頁先載入﹐它創建的TABSHEET在網頁創建的之前﹐反之同理﹒ 另外建議加一個全局變數使得每打開一個新的TABSHEET即將它顯示在最上層(用PAGECONTROL的TABINDEX屬性)
|
timhuang
尊榮會員 發表:78 回覆:1815 積分:1608 註冊:2002-07-15 發送簡訊給我 |
誠如 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 發送簡訊給我 |
问题基本解决了,感谢二位。最后请问:
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 發送簡訊給我 |
要取得瀏覽器中網頁的 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 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |