2013-11-27 12 views
5

Próbuję programowo utworzyć ChromiumOSR, ale wciąż pojawia się błąd (naruszenie zasad dostępu). Oto przykładowy kod, który powoduje problem:Uzyskiwanie błędów podczas tworzenia ChromiumOSR programowo

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

Problemem jest to, że pChromiumOSR.Browser.MainFrame jest zawsze zero. Jeśli wykonam pChromiumOSR.load ("www.google.com"); Nie dostaję żadnych błędów, ale nie uruchamia onLoadend.

Czy ktoś może dać mi jakieś sugestie na temat tego, co robię źle? Używam Delphi XE2, ale nie wiem, która wersja chromu (gdzie mogę znaleźć wersję?)

Dzięki za pomoc.

Odpowiedz

5

Twoja próba użycia metody Load do załadowania strony była prawidłowa. Ten drugi był błędny i nie powiodło się, ponieważ instancja Browser nie została utworzona. Dzieje się tak dlatego, że model TChromiumOSR został zaprojektowany raczej jako komponent czasu projektowania niż dynamicznie.

Teraz jedynym miejscem, gdzie tworzona jest instancja Browser, jest metoda Loaded, która jest wywoływana dla komponentu po załadowaniu jej formy nadrzędnej ze strumienia. A ponieważ tworzysz go dynamicznie, instancja Browser nigdy nie jest tworzona.

Z jakiegoś powodu również metoda CreateBrowser (która tworzy instancję Browser) jest zadeklarowana jako prywatna, co nieco komplikuje jej wywołanie (chyba że zdecydujesz się zmodyfikować źródło i uczynić je publicznym). Jeśli nie chcesz zmieniać kod źródłowy DCEF, można użyć pomocnika klasy, aby zapewnić dostęp do metody CreateBrowser:

uses 
    ceflib, cefvcl; 

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

implementation 

{ TChromiumOSRHelper } 

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

Następnie stworzyć instancję Browser dodać wywołanie CreateBrowserInstance przed pierwszym dostępie do Browser instancji (który jest tu metoda Load):

var 
    pChromiumOSR: TChromiumOSR; 
begin 
    pChromiumOSR := TChromiumOSR.Create(Self); 
    pChromiumOSR.OnLoadEnd := pChromiumOSRLoadEnd; 
    pChromiumOSR.CreateBrowserInstance; 
    pChromiumOSR.Load('www.google.com'); 
end; 
+0

Dzięki TLama użyłem swój przykład i to działało idealnie. Dzięki za szybką i wspaniałą odpowiedź. – user3032933

+0

Nie ma za co! – TLama

Powiązane problemy