Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi TChromium Chrometab不工作_Delphi_Delphi Xe3_Tchromium - Fatal编程技术网

Delphi TChromium Chrometab不工作

Delphi TChromium Chrometab不工作,delphi,delphi-xe3,tchromium,Delphi,Delphi Xe3,Tchromium,我想为我的TChromium做一个标签。 我有这个: Browsers: array[0..1000] of TChromium; 这个Chrometab程序: procedure TForm1.ChromeTabsActiveTabChanged(Sender: TObject; ATab: TChromeTab); var c:integer; begin for c := 0 to ChromeTabs.Tabs.Count do

我想为我的TChromium做一个标签。
我有这个:

   Browsers: array[0..1000] of TChromium;
这个Chrometab程序:

    procedure TForm1.ChromeTabsActiveTabChanged(Sender: TObject; ATab: TChromeTab);
    var
    c:integer;
    begin
    for c := 0 to ChromeTabs.Tabs.Count do
       if browsers[c]<>NIL then
        if c=ChromeTabs.ActiveTabIndex then browsers[c].Visible:=true else browsers[c].visible:=false;
    end;



procedure TForm1.ChromeTabsButtonAddClick(Sender: TObject;
  var Handled: Boolean);
begin
browsers[ChromeTabs.ActiveTabIndex]:=TChromium.Create(Chromium);
browsers[ChromeTabs.ActiveTabIndex].OnAddressChange:=Chromium.OnAddressChange;
browsers[ChromeTabs.ActiveTabIndex].OnAfterCreated:=Chromium.OnAfterCreated;
browsers[ChromeTabs.ActiveTabIndex].OnBeforeContextMenu:=Chromium.OnBeforeContextMenu;
browsers[ChromeTabs.ActiveTabIndex].OnBeforePopup:=Chromium.OnBeforePopup;
browsers[ChromeTabs.ActiveTabIndex].OnLoadEnd:=Chromium.OnLoadEnd;
browsers[ChromeTabs.ActiveTabIndex].OnLoadError:=Chromium.OnLoadError;
browsers[ChromeTabs.ActiveTabIndex].OnLoadingStateChange:=Chromium.OnLoadingStateChange;
browsers[ChromeTabs.ActiveTabIndex].OnProcessMessageReceived:=Chromium.OnProcessMessageReceived;
browsers[ChromeTabs.ActiveTabIndex].OnStatusMessage:=Chromium.OnStatusMessage;
browsers[ChromeTabs.ActiveTabIndex].DefaultEncoding:=Chromium.DefaultEncoding;

browsers[ChromeTabs.ActiveTabIndex].parent:=Form1;
browsers[ChromeTabs.ActiveTabIndex].Align:=alClient;
browsers[ChromeTabs.ActiveTabIndex].Show;
browsers[ChromeTabs.ActiveTabIndex].Load(Chromium.DefaultUrl);
end;



procedure TForm1.ChromeTabsButtonCloseTabClick(Sender: TObject;
  ATab: TChromeTab; var Close: Boolean);
begin
browsers[ATab.Index].Destroy;
Close:=True;
end;
程序TForm1.chrometabactivatebchanged(发送方:TObject;ATab:tcrometab);
变量
c:整数;
开始
对于c:=0到chrometab.Tabs.Count do
如果浏览器[c]为零,则
如果c=ChromeTabs.ActiveTabIndex,则浏览器[c]。可见:=true,否则浏览器[c]。可见:=false;
结束;
程序TForm1.ChromeTabsButtonAddClick(发送方:ToObject;
变量:布尔值);
开始
浏览器[chrometab.ActiveTabIndex]:=tcromium.Create(Chromium);
浏览器[chrometab.ActiveTabIndex].OnAddressChange:=Chromium.OnAddressChange;
浏览器[chrometab.ActiveTabIndex].OnAfterCreated:=Chromium.OnAfterCreated;
浏览器[ChromeTab.ActiveTabIndex].OnBeforeContextMenu:=Chromium.OnBeforeContextMenu;
浏览器[ChromeTab.ActiveTabIndex].OnBeforePopup:=Chromium.OnBeforePopup;
浏览器[chrometab.ActiveTabIndex].OnLoadEnd:=Chromium.OnLoadEnd;
浏览器[ChromeTab.ActiveTabIndex].OnLoadError:=Chromium.OnLoadError;
浏览器[ChromeTab.ActiveTabIndex].OnLoadingStateChange:=Chromium.OnLoadingStateChange;
浏览器[ChromeTab.ActiveTabIndex].OnProcessMessageReceived:=Chromium.OnProcessMessageReceived;
浏览器[chrometab.ActiveTabIndex].OnStatusMessage:=Chromium.OnStatusMessage;
浏览器[ChromeTabs.ActiveTabIndex].DefaultEncoding:=Chrome.DefaultEncoding;
浏览器[ChromeTabs.ActiveTabIndex].parent:=Form1;
浏览器[chrometab.ActiveTabIndex].Align:=alClient;
浏览器[chrometab.ActiveTabIndex].Show;
浏览器[chrometab.ActiveTabIndex].Load(Chromium.DefaultUrl);
结束;
程序t用于m1.ChromeTabsButtonCloseTabClick(发送方:ToObject;
ATab:TChromeTab;var Close:Boolean);
开始
浏览器[ATab.Index]。销毁;
关闭:=真;
结束;
Chromium对象是我的默认浏览器,我将其放置在窗体上

因此,当我试图关闭其中一个选项卡时,有时会出现访问冲突错误。
当我试图从地址行加载Url时,会出现访问冲突错误。
此外,当我打开2个或更多选项卡时,它们看起来很糟糕,如下-

请帮助我解决所有这些问题:(


谢谢。

访问冲突异常的问题是由于在已销毁的对象上调用
Destroy
方法造成的。让我解释一下这种情况

假设您有3个选项卡,其中包含下一个索引和
Browsers
数组,其中包含以下浏览器实例:

chrometab.Tabs浏览器
----------------------     ----------------------
索引选项卡名称索引浏览器
----------  ----------     ----------  ----------
0选项卡1 0浏览器1
1选项卡2 1浏览器2
2选项卡3浏览器3
现在,单击中间选项卡的关闭按钮(选项卡索引为1),然后在
OnButtonCloseTabClick
中运行以下操作:

程序TForm1.ChromeTabsButtonCloseTabClick(发送方:ToObject;
ATab:TChromeTab;var Close:Boolean);
开始
//ATab.Index等于1
浏览器[ATab.Index]。销毁;
关闭:=真;
结束;
这将破坏上表中名为
browser 2
的浏览器实例。当数组按照
选项卡
集合的操作重新编制索引时,这不会出现问题。让我们看看选项卡和数组会发生什么情况:

chrometab.Tabs浏览器
----------------------     ----------------------
索引选项卡名称索引浏览器
----------  ----------     ----------  ----------
0选项卡1 0浏览器1

1选项卡3 1---您需要重新为
TChromium
对象数组编制索引。假设您有三个选项卡,第一个是索引0,第二个是索引1,第三个是索引2。现在您用索引1关闭第二个选项卡,用索引1销毁
TChromium
对象(浏览器的元素
和索引1),但数组中的元素仍然指向一个已销毁的对象。然后选项卡被重新索引,因此第一个选项卡仍然为0,但之前的第三个选项卡获得索引1。当您关闭第二个选项卡时,您尝试使用索引1访问元素。AV是因为您对已销毁的对象调用了
Destroy
方法。但defini更好的方法是使用
TObjectList
泛型集合而不是该数组。我如何重新索引该数组?什么是TObjectList?请帮助我,我需要使其工作我做了一些更改,它确实工作,但我不知道什么是TObjectList:)