5

我正在尝试以编程方式创建 ChromiumOSR,但我不断收到错误(访问冲突)。这是导致问题的示例代码:

var
pChromiumOSR: TChromiumOSR;
begin
  pChromiumOSR := TChromiumOSR.Create(Self);
  pChromiumOSR.OnLoadEnd := pChromiumOSRLoadEnd;
  pChromiumOSR.Browser.MainFrame.LoadUrl('www.google.com');
end;

问题是 pChromiumOSR.Browser.MainFrame 始终为零。如果我这样做 pChromiumOSR.load('www.google.com'); 我没有收到任何错误,但它不会触发 onLoadend。

任何人都可以就我可能做错的事情给我任何建议吗?我正在使用 Delphi XE2 但不确定哪个版本的铬(我在哪里可以找到版本?)

4

1 回答 1

5

您尝试使用Load加载页面的方法是正确的。另一个是错误的,因为Browser没有创建实例而失败。这是因为它TChromiumOSR被设计为设计时组件,而不是动态创建的。

Browser现在,创建实例的唯一位置是Loaded方法,该方法在组件的父表单从流中加载后被调用。而且由于您是动态创建它,因此Browser永远不会创建实例。

出于某种原因,该CreateBrowser方法(创建Browser实例)也被声明为私有,这使得它的调用有点复杂(除非您决定修改源并将其公开)。如果您不想更改 DCEF 源代码,可以使用类助手来提供对该CreateBrowser方法的访问:

uses
  ceflib, cefvcl;

type
  TChromiumOSRHelper = class helper for TCustomChromiumOSR
  public
    procedure CreateBrowserInstance;
  end;

implementation

{ TChromiumOSRHelper }

procedure TChromiumOSRHelper.CreateBrowserInstance;
begin
  Self.CreateBrowser;
end;

然后创建一个Browser实例,在第一次访问实例之前添加CreateBrowserInstance调用Browser(这里是Load方法):

var
  pChromiumOSR: TChromiumOSR;
begin
  pChromiumOSR := TChromiumOSR.Create(Self);
  pChromiumOSR.OnLoadEnd := pChromiumOSRLoadEnd;
  pChromiumOSR.CreateBrowserInstance;
  pChromiumOSR.Load('www.google.com');
end;
于 2013-11-27T21:29:42.347 回答