关于pagecontrol中含有webbrowser的页面关闭问题

lyyailxj13 天津许愿网络 项目经理  2013-01-27 01:06:03
动态创建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网页无法关闭
...全文
60 1 点赞 打赏 收藏 举报
写回复
1 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
simonhehe 2013-01-29
没看出来你使用数组的实际意义, PageControl的标签已经是列表了, 没必要再用数组存放信息. 下面的例子, delphi XE 测试通过 ------------------------------- 窗体有一个pgc1: TPageControl 单元文件如下:
unit Unit11;

interface

uses
  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.
  • 打赏
  • 举报
回复
相关推荐
发帖
Delphi
加入

4970

社区成员

Delphi 开发及应用
申请成为版主
帖子事件
创建了帖子
2013-01-27 01:06
社区公告
暂无公告