PageControl 控制 多页面浏览时 WebBrowser 被关闭掉 如何释放掉TabSheet!!!郁闷了好些天 散尽我家产了(100分)

  • 主题发起人 主题发起人 su_sh
  • 开始时间 开始时间
S

su_sh

Unregistered / Unconfirmed
GUEST, unregistred user!
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, OleCtrls, SHDocVw, ImgList,Registry,MSHTML,ActiveX;


type
TBrowser = class(TForm)
PageControl1: TPageControl;
TabSheet1: TTabSheet;
WebBrowser: TWebBrowser;
procedure FormCreate(Sender: TObject);
procedure WebBrowserNewWindow2(Sender: TObject; var ppDisp: IDispatch;
var Cancel: WordBool);
procedure WebBrowserDocumentComplete(Sender: TObject;
const pDisp: IDispatch; var URL: OleVariant);
private
{ Private declarations }
TS: TTabSheet;
WB: TWebBrowser;
WBDocumentComplete: TWebBrowserDocumentComplete; //为生成页面标题的过程
WBNewWindow2 : TWebBrowserNewWindow2;

//WBTitleChange : TWebBrowserTitleChange;
//WBStatusTextChange : TWebBrowserStatusTextChange;
//WBProgressChange : TWebBrowserProgressChange;
//WBBeforeNavigate2:TWebBrowserBeforeNavigate2;
public
{ Public declarations }
end;

var
Browser: TBrowser;
implementation

{$R *.dfm}

procedure TBrowser.FormCreate(Sender: TObject);
var
OUrl: OleVariant;
begin
OUrl := 'about:blank';
WebBrowser.Navigate2(OUrl);
WBDocumentComplete := WebBrowser.OnDocumentComplete;
WBNewWindow2 := WebBrowser.OnNewWindow2;
//WBTitleChange := WebBrowser.OnTitleChange;
//WBStatusTextChange := WebBrowser.OnStatusTextChange;
//WBProgressChange := WebBrowser.OnProgressChange;
//WBBeforeNavigate2 := WebBrowser.OnBeforeNavigate2;
//WBDocumentComplete := WebBrowser.OnDocumentComplete;
if Assigned(TabSheet1) then
TabSheet1.Destroy;

{========多页面部分=======}
TS := TTabSheet.Create(nil);
TS.PageControl := PageControl1;
TS.Align:=alClient;

WB := TWebBrowser.Create(nil);
TS.InsertControl(WB);
WB.ParentWindow:=PageControl1.Pages[PageControl1.PageCount-1].Handle;
WB.TheaterMode:=true;
WB.RegisterAsBrowser;
WB.Align := alClient;
PageControl1.ActivePage := TS;

WB.Navigate('www.baidu.com');
WB.Show;


//WBDocumentComplete := WebBrowser.OnDocumentComplete;
WB.OnDocumentComplete := WBDocumentComplete;
WB.OnNewWindow2 := WBNewWindow2;
//WB.OnTitleChange:= WBTitleChange;
//WB.OnStatusTextChange:=WBStatusTextChange;
//WB.OnProgressChange:=WBProgressChange;
//WB.OnBeforeNavigate2:=WBBeforeNavigate2;
//WB.OnDocumentComplete := WBDocumentComplete;
end;

procedure TBrowser.WebBrowserNewWindow2(Sender: TObject;
var ppDisp: IDispatch; var Cancel: WordBool);
begin
if Assigned(TabSheet1) then
TabSheet1.Destroy;

{========多页面部分=======}
TS := TTabSheet.Create(nil);
TS.PageControl := PageControl1;
TS.Align:=alClient;

WB := TWebBrowser.Create(nil);
TS.InsertControl(WB);
WB.ParentWindow:=PageControl1.Pages[PageControl1.PageCount-1].Handle;
WB.TheaterMode:=true;
WB.RegisterAsBrowser;
WB.Align := alClient;
PageControl1.ActivePage := TS;

ppDisp := WB.Application;
WB.Show;


//WBDocumentComplete := WebBrowser.OnDocumentComplete;
WB.OnDocumentComplete := WBDocumentComplete;
WB.OnNewWindow2 := WBNewWindow2;
//WB.OnTitleChange:= WBTitleChange;
//WB.OnStatusTextChange:=WBStatusTextChange;
//WB.OnProgressChange:=WBProgressChange;
//WB.OnBeforeNavigate2:=WBBeforeNavigate2;
//WB.OnDocumentComplete := WBDocumentComplete;
end;

procedure TBrowser.WebBrowserDocumentComplete(Sender: TObject;
const pDisp: IDispatch; var URL: OleVariant);
var
Doc : IHTMLDocument2;
begin
Doc := WB.Document as IHtmlDocument2;
if Assigned(WB) and assigned(WB.Document) then
begin
if length(Doc.title)>20 then
TS.Caption:=copy(Doc.title,0,20)+'......'
else
TS.Caption:=IHtmlDocument2(WB.Document).title;
end;
end;

initialization
{ TODO : 引进了TRegistry类,WebBrowser是OLE对象,需要对它初始化 }
OleInitialize(nil);
finalization
try
OleUninitialize;
except
end;

end.
 
在Webbrowser的CloseQuery事件中可以捕获该对象的关闭请求。
 
来自:kkkchenA, 时间:2006-9-13 21:40:27, ID:3571606
在Webbrowser的CloseQuery事件中可以捕获该对象的关闭请求。
Webbrowser有CloseQuery事件吗? 饶恕我愚钝.
 
这个问题我也看到了。我知道。
首先。在你的pagecontrol中,要加一个函数
function TPageControlEx.ClosePage(hWebBrowser: HWND): boolean;
var
i: integer;
Sheet: TTabSheetEx;
begin
Result := false;
for i := PageCount-1 downto 0 do
begin
Sheet := TTabSheetEx(Pages);
if (Sheet.PageType < 0) and
(Sheet.LinkControl.Handle = hWebBrowser) then
begin
Sheet.Parent := nil;
if assigned(OnSheetStateChange) then OnSheetStateChange(Sheet, ssDestroy);
Sheet.Free();
Result := true;
end;
end;
end;
这个函数的作用就是得到被关闭的webbrower的handle,然后关闭对应的sheet。
然后在使用你的这个pagecontrol的程序中。要加一消息拦截函数
procedure TMainForm.IEMessageHandle(var Msg: tagMSG; var Handled: Boolean);
begin
Handled := False;
if Msg.Message = WM_CLOSE then
begin
if IExplore.ExploreView.ClosePage(Msg.HWND) then
begin
exit;
end;
end;
inherited;
end;

这个函数的作用是从程序的消息循环中处理自动关闭消息
当然,在程序运行开始处,要接上这个过程
procedure TMainForm.FormCreate(Sender: TObject);
begin
inherited;
Application.OnMessage := IEMessageHandle;
end;

我的这个是能处理那些有自动关闭脚本的网页的过程,不知道是不是你想要的
 
基本上是我想要的 高手 呵呵 能够领会低手的需求就是高手 我试试先哦 谢谢哦
 
xuegaoyili
下面这个函数没有怎么看懂
function TPageControlEx.ClosePage(hWebBrowser: HWND): boolean;
var
i: integer;
Sheet: TTabSheetEx;
begin
Result := false;
for i := PageCount-1 downto 0 do
begin
Sheet := TTabSheetEx(Pages);
if (Sheet.PageType < 0) and
(Sheet.LinkControl.Handle = hWebBrowser) then
begin
Sheet.Parent := nil;
if assigned(OnSheetStateChange) then OnSheetStateChange(Sheet, ssDestroy);
Sheet.Free();
Result := true;
end;
end;
end;
这个函数的作用就是得到被关闭的webbrower的handle,然后关闭对应的sheet。
 
这个函数就是循环页控件,从最后一个页找,如果找到的页sheet中的webbrowser的handle是发close消息的handle,则表明这页想关闭。你就设置这个sheet去free掉就可以了。
你不要看pagetype这句,这是我自定义的。有些页类型不想关闭。呵
 
TEmbeddedWB有关闭事件
http://www.bsalsa.com/
 
问题最后我自己解决了 谢谢你们
 
后退
顶部