动态创建pagecontrol,其中包含webbrowser网页 就是多选项卡的浏览器
打开2个页面如A1、A2 关闭页面是 顺序和倒序关闭都没问题 如先关A1再关A2 或先关A2 再关A1 无异常
先关A1 然后再打开一个页面 以前的A2变成A1 新打开的页面pageindex是A2 这样的话 关闭A2无错 关闭A1就报错了
也许说的不明白 挺绕的 上源码
动态创建网页(我只让打开2个网页 再打开都是在pagecontrol的tabsheet[2]中打开)
procedure TFrmMain.WebBrowserNewWindow2(Sender: TObject; var ppDisp: IDispatch;var Cancel: WordBool);
begin
{========多页面部分=======}
if i<2 then
begin
i:=i+1;
j:=j+1;
x:=0;
TS[i]:=TRzTabSheet.Create(self);
TS[i].PageControl := RzPageControl1;
WB[i]:=TWebBrowser.Create(self);
WB[i].Align := alClient;
WB[i].Silent:=true;
WB[i].OnDocumentComplete :=WebBrowserDocumentComplete;
WB[i].OnNewWindow2:= WebBrowserNewWindow2;
TS[i].InsertControl(WB[i]);
RzPageControl1.ActivePageIndex:=i;
RzPageControl1.ActivePage := TS[i];
ppDisp := WB[i].Application;
end
else
begin
i:=2;
j:=2;
x:=0;
WB[i].Navigate('about:blank');
Application.ProcessMessages;
WB[i]:=TWebBrowser.Create(self);
WB[i].Align := alClient;
WB[i].Silent:=true;
WB[i].OnDocumentComplete :=WebBrowserDocumentComplete;
WB[i].OnNewWindow2:= WebBrowserNewWindow2;
TS[i].InsertControl(WB[i]);
RzPageControl1.ActivePageIndex:=i;
RzPageControl1.ActivePage := TS[i];
ppDisp := WB[i].Application;
end;
end;pagecontrol关闭代码
procedure TFrmMain.RzPageControl1Close(Sender: TObject;
var AllowClose: Boolean);
var
lsIndex:Integer;
begin
lsIndex:=RzPageControl1.ActivePageIndex;
if j=lsIndex then
begin
lsIndex:=lsIndex+x;
WB[lsIndex].Navigate('about:blank');
Application.ProcessMessages;
(RzPageControl1.ActivePage.Controls[0] as TWebBrowser).Free;
WB[lsIndex]:=nil;
RzPageControl1.ActivePage.Free;
if lsIndex>RzPageControl1.PageCount-1 then
lsIndex:=RzPageControl1.PageCount-1;
RzPageControl1.ActivePageIndex:=lsIndex;
i:=i-1;
j:=j-1;
x:=0;
end
else
begin lsIndex:=lsIndex+x;
WB[lsIndex].Navigate('about:blank');
Application.ProcessMessages;
(RzPageControl1.ActivePage.Controls[0] as TWebBrowser).Free;
WB[lsIndex]:=nil;
RzPageControl1.ActivePage.Free;
if lsIndex>RzPageControl1.PageCount-1 then
lsIndex:=RzPageControl1.PageCount-1;
RzPageControl1.ActivePageIndex:=lsIndex;
i:=i-1;
j:=j-1;
x:=1;
end;
end;求大侠们帮忙看看 为什么打开2个网页1和2 把1关了再开一个网页 此时原来的2网页无法关闭
打开2个页面如A1、A2 关闭页面是 顺序和倒序关闭都没问题 如先关A1再关A2 或先关A2 再关A1 无异常
先关A1 然后再打开一个页面 以前的A2变成A1 新打开的页面pageindex是A2 这样的话 关闭A2无错 关闭A1就报错了
也许说的不明白 挺绕的 上源码
动态创建网页(我只让打开2个网页 再打开都是在pagecontrol的tabsheet[2]中打开)
procedure TFrmMain.WebBrowserNewWindow2(Sender: TObject; var ppDisp: IDispatch;var Cancel: WordBool);
begin
{========多页面部分=======}
if i<2 then
begin
i:=i+1;
j:=j+1;
x:=0;
TS[i]:=TRzTabSheet.Create(self);
TS[i].PageControl := RzPageControl1;
WB[i]:=TWebBrowser.Create(self);
WB[i].Align := alClient;
WB[i].Silent:=true;
WB[i].OnDocumentComplete :=WebBrowserDocumentComplete;
WB[i].OnNewWindow2:= WebBrowserNewWindow2;
TS[i].InsertControl(WB[i]);
RzPageControl1.ActivePageIndex:=i;
RzPageControl1.ActivePage := TS[i];
ppDisp := WB[i].Application;
end
else
begin
i:=2;
j:=2;
x:=0;
WB[i].Navigate('about:blank');
Application.ProcessMessages;
WB[i]:=TWebBrowser.Create(self);
WB[i].Align := alClient;
WB[i].Silent:=true;
WB[i].OnDocumentComplete :=WebBrowserDocumentComplete;
WB[i].OnNewWindow2:= WebBrowserNewWindow2;
TS[i].InsertControl(WB[i]);
RzPageControl1.ActivePageIndex:=i;
RzPageControl1.ActivePage := TS[i];
ppDisp := WB[i].Application;
end;
end;pagecontrol关闭代码
procedure TFrmMain.RzPageControl1Close(Sender: TObject;
var AllowClose: Boolean);
var
lsIndex:Integer;
begin
lsIndex:=RzPageControl1.ActivePageIndex;
if j=lsIndex then
begin
lsIndex:=lsIndex+x;
WB[lsIndex].Navigate('about:blank');
Application.ProcessMessages;
(RzPageControl1.ActivePage.Controls[0] as TWebBrowser).Free;
WB[lsIndex]:=nil;
RzPageControl1.ActivePage.Free;
if lsIndex>RzPageControl1.PageCount-1 then
lsIndex:=RzPageControl1.PageCount-1;
RzPageControl1.ActivePageIndex:=lsIndex;
i:=i-1;
j:=j-1;
x:=0;
end
else
begin lsIndex:=lsIndex+x;
WB[lsIndex].Navigate('about:blank');
Application.ProcessMessages;
(RzPageControl1.ActivePage.Controls[0] as TWebBrowser).Free;
WB[lsIndex]:=nil;
RzPageControl1.ActivePage.Free;
if lsIndex>RzPageControl1.PageCount-1 then
lsIndex:=RzPageControl1.PageCount-1;
RzPageControl1.ActivePageIndex:=lsIndex;
i:=i-1;
j:=j-1;
x:=1;
end;
end;求大侠们帮忙看看 为什么打开2个网页1和2 把1关了再开一个网页 此时原来的2网页无法关闭
解决方案 »
- delphi 2007任务栏出现两个
- 没有报错,但是想要的图像之类的显示不出来
- 在现在的英文版xp上,好多软件的中文可以显示,为何我用delphi写的中文就是乱码?
- 用delphi如何向word模板的指定位置贴入图像~~~~困扰一个星期的问题~`
- 想做一个类似于VC调试器中内存查看器,又没有这方面的控件?谢谢!
- 关于SQL SERVER2000 C/S结构客户端访问服务器端数据的问题
- 如何在dbgrid中实现edit1的onchange功能。
- delphi 自定义控件的问题
- 怎么样用代码实现可执行文件的复制?(在线等)
- 急死我了,帮帮忙!怎么从一个工程的窗体调用另一个工程的窗体?
- 小游戏盒子(客户端)用什么软件开发的!
- delphi webbrowser內存圖片到IMAGE
下面的例子, delphi XE 测试通过
-------------------------------
窗体有一个pgc1: TPageControl
单元文件如下:
unit Unit11;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, OleCtrls, SHDocVw, ComCtrls;type
TForm11 = class(TForm)
pgc1: TPageControl;
procedure FormCreate(Sender: TObject);
procedure pgc1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
private
function NewWindow(const URL : string = ''): TWebBrowser;
procedure MyBeforeNavigate2(ASender: TObject; const pDisp: IDispatch;
var URL, Flags, TargetFrameName, PostData, Headers: OleVariant;
var Cancel: WordBool);
procedure MyNewWindow2(ASender: TObject; var ppDisp: IDispatch;
var Cancel: WordBool);
procedure closePage(aTab: TTabSheet);
{ Private declarations }
public
{ Public declarations }
end;var
Form11: TForm11;implementation{$R *.dfm}
function TForm11.NewWindow(const URL : string = '') : TWebBrowser;
var
aTab : TTabSheet;
begin
aTab := TTabSheet.Create(pgc1);
aTab.PageControl := pgc1;
aTab.Caption := 'tab' + IntToStr(pgc1.PageCount);
pgc1.ActivePage := aTab;
aTab.Align := alClient; result := TWebBrowser.Create(self);
aTab.InsertControl(result);
result.Align := alClient;
result.OnBeforeNavigate2 := MyBeforeNavigate2;
result.OnNewWindow2 := MyNewWindow2;
if URL <> '' then
result.Navigate(url);
end;procedure TForm11.closePage(aTab : TTabSheet);
var
i : integer;
begin
if aTab = nil then Exit; for I := aTab.ComponentCount - 1 downto 0 do
begin
if aTab.Components[i] is TWebBrowser then
TWebBrowser(aTab.Components[i]).Stop;
aTab.Components[i].Free;
end; aTab.Free;
end;procedure TForm11.pgc1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
Index: Integer;
begin
//左键点击并且双击
if (Button = mbLeft) and (ssDouble in Shift) then
begin
Index := pgc1.IndexOfTabAt(X, Y);
if Index >= 0 then
closePage(pgc1.Pages[Index]); end;end;procedure TForm11.MyNewWindow2(ASender: TObject; var ppDisp: IDispatch;
var Cancel: WordBool);
begin
//新链接事件处理
ppDisp := NewWindow().DefaultInterface;
end;procedure TForm11.FormCreate(Sender: TObject);
begin
NewWindow('http://news.baidu.com');
end;procedure TForm11.MyBeforeNavigate2(ASender: TObject; const pDisp: IDispatch;
var URL, Flags, TargetFrameName, PostData, Headers: OleVariant;
var Cancel: WordBool);
begin
//Todo 事务处理
end;end.