Delphi TChromium Chrometab不工作
我想为我的TChromium做一个标签。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
我有这个:
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:)