2013-03-24 5 views
1

Оформляйте работу с компонентом в Delphi XE3 TChromium нужно, чтобы добраться до содержимого страницы загружаются форум нашел примеры рабочего кода:Delphi XE3 и TChromium

procedure DoWork (const doc: ICefDomDocument); 
var 
  q: ICefDomNode; 
begin 
  q: = doc.GetElementById ('q'); 
  if Assigned (q) then q.SetElementAttribute ('value', 'Hello, world'); 
end; 

procedure actDomExecute; 
var 
  q: ICefDomNode; 
begin 
   crm.Browser.MainFrame.VisitDomProc (DoWork); 
end; 

Но отладчик как-то обходит исполнение упрямо DoWork. В чем может быть улов?

+0

Зависит от версии Chromium, которую вы используете. Насколько я помню в нескольких версиях, DOM-итерация вообще не работала. – TLama

+0

Последняя версия, загружаемая с официального сайта – LuckyD

+0

Если мы говорим об обертке ['CEF1'] (https://code.google.com/p/delphichromiumembedded/) (поскольку существует также [' CEF3'] (https : //code.google.com/p/dcef3/), то я боюсь, что вы столкнулись именно с этой проблемой (похоже, ['происходит в CEF3'] (https://code.google. com/p/dcef3/issues/detail? id = 10)). Вы можете попробовать более старую версию 'CEF1' (не могу сказать, какая из них самая последняя, ​​где это работает) и проверить, что изменилось с этой версии. – TLama

ответ

1

У меня есть tChromium для работы под Delphi 7, все должно работать одинаково.

Есть шаги, которые я взял для чтения элементов из DOM

Сначала я получил обертку от этого проекта: https://code.google.com/p/delphichromiumembedded/downloads/detail?name=dcef-r306.7z&can=2&q=

Существует также одна для XE2, не займет много, чтобы преобразовать, что XE3, если вам нужна помощь в этом, я с радостью помогу по запросу.

Затем объявить начало и конец в tchromium

procedure TMainForm.crmLoadStart(Sender: TObject; const browser: ICefBrowser; const frame: ICefFrame); begin 
    if (browser <> nil) and (browser.GetWindowHandle = crm.BrowserHandle) and ((frame = nil) or (frame.IsMain)) then FLoading := True; 
end; 

,

procedure TMainForm.crmLoadEnd(Sender: TObject; const browser: ICefBrowser; const frame: ICefFrame; httpStatusCode: Integer; out Result: Boolean); 
begin 
    if (browser <> nil) and (browser.GetWindowHandle = crm.BrowserHandle) and ((frame = nil) or (frame.IsMain)) then begin 
    FLoading := False; 
    // see if loaded 
    while(httpStatusCode <> 200) do begin 
     Application.ProcessMessages; 
     Sleep(50); 
    end; 
    browser.GetMainFrame.VisitDomProc(DomProc); 
    end; 
end; 

Объявить процедуру, которая называется domproc как так:

procedure DomProc(const Doc: ICefDomDocument); 
var 
    Node: ICefDomNode; 
begin 
    url := Doc.BaseUrl; 
    if(url='www.goodwebsite.com') then // check if it is the right page and not add 
    Node := Doc.Body.Document.GetElementById('idofwhatyouarelookingfor'); 
    Node.SetElementAttribute('value','Hello world :D'); 
end; 

Это был самый надежный способ я до сих пор, вам нужно убедиться, что страница хорошо загружена и что вы получаете дом для righ t кадров.

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

Получайте удовольствие от кодирования, скалы Delphi!