动态创建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网页无法关闭

解决方案 »

  1.   

    没看出来你使用数组的实际意义, PageControl的标签已经是列表了, 没必要再用数组存放信息.
    下面的例子, 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.