Получение ошибок при программном создании ChromiumOSR

Я пытаюсь создать 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, но не знаю, какая версия хрома (где я могу найти версию?)


person user3032933    schedule 27.11.2013    source источник


Ответы (1)


Ваша попытка использовать метод 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;
person TLama    schedule 27.11.2013
comment
Спасибо, TLama, я использовал ваш пример, и он сработал отлично. Спасибо за быстрый и отличный ответ. - person user3032933; 28.11.2013