Ошибка на LoadURL с TChromium - PullRequest
       45

Ошибка на LoadURL с TChromium

4 голосов
/ 17 сентября 2011

Я нашел блестящий проект Delphi Chromium для встраивания Chrome в форму Delphi. Он хорошо работает в Delphi7 после небольшого взлома, и я могу запустить демонстрационное приложение.

Однако, когда я делаю свое собственное приложение с компонентом, я не могу загрузить свой собственный URL. Я получаю нарушение прав доступа.

Chromium2.Browser.MainFrame.LoadUrl('http://www.example.com');

Компонент TChromium работает, и у меня все библиотеки DLL в нужном месте, так как, если я установлю DefaultUrl, он будет работать нормально.

У меня Chromium2 на странице TPageControl, и с помощью события OnClick кнопки я вызываю приведенный выше код. Я получаю AccessViolation. Базовый блок - nil.

Я не могу найти способ обойти это, кто-нибудь заставил это работать?

Ответы [ 5 ]

4 голосов
/ 17 сентября 2011

Я до сих пор не нашел разрешение, но нашел следующую работу вокруг

procedure TForm1.lblWebsiteClick(Sender: TObject);
var MainFrame : ICefFrame;
begin
  MainFrame := Chromium2.Browser.GetMainFrame;
  MainFrame.LoadUrl('http://www.cookingisfun.ie');
end;
3 голосов
/ 17 сентября 2011

Проблема в том, что мэйнфрейм загружается только после загрузки страницы.

Для начала нужно сделать:

if Assigned(Chromium2.Browser.MainFrame)
    then  Chromium2.Browser.MainFrame...

Тем не менее, это не предпочтительный способ навигации, но вместо этого вы должны сделать:

Chromium1.Load( theUrl );

Если вы все еще хотите использовать MainFrame, сделайте это в событии OnLoadEnd.

2 голосов
/ 24 сентября 2011

Были схожие проблемы и через несколько часов обнаружена проблема:

  1. Если TChromium находится в основной форме заявки, тогда ок.

  2. Если TChromium не находится на главной форме (или на рамке), то:

    1. Откройте cef.inc и удалите точку, чтобы определить:

      {.$DEFINE CEF_MULTI_THREADED_MESSAGE_LOOP} 
      
    2. Удалите значение DefaultURL, чтобы оно представляло собой пустую строку.

Я погуглил CEF_MULTI_THREADED_MESSAGE_LOOP, но он вообще ничего не дал.1024 *

Наконец, возникли проблемы с изменением размера / обновлением (даже с выравниванием, установленным в alClient).Краткосрочное исправление в событии
crmLoadEnd делает что-то вроде:

     if crm.Height < panclient.Height then
        crm.Height := panclient.Height;
0 голосов
/ 07 июля 2014

Была и эта проблема. Кажется, что MainFrame сначала создается, когда рамка / окно становится видимой. Но есть простой способ обойти это. Просто вызовите .Load ('about: blank') прямо на вашем объекте TChromium. Это инициализирует отсутствующий кадр ранее.

0 голосов
/ 17 сентября 2011

У вас есть все необходимые библиотеки DLL в папке, где создается ваше приложение?

Вам нужно: libcef.dll, icudt.dll, ...

Проверьте это thread в их группе поддержки.


Когда вы создаете / запускаете демки, они создаются в этой подпапке (* DCC_ExeOutput *): DCEF \ bin \, поэтому он работает с ними...

...