2013-03-24 97 views
1

做出與在Delphi XE3 TChromium組件工作 需要獲得頁面的內容加載 論壇發現的工作代碼示例:德爾福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 2013-03-24 14:56:00

+0

最新版本,從官方網站下載 – LuckyD 2013-03-24 15:07:44

+0

如果我們在討論['CEF1'](https://code.google.com/p/delphichromiumembedded/)封裝(因爲也有''CEF3'](https ://code.google.com/p/dcef3/)wrapper),那麼恐怕你只是碰到了這個問題(同樣的問題似乎發生在CEF3中)(https://code.google。 com/p/dcef3/issues/detail?id = 10)。你可以嘗試一些舊版本的'CEF1'(不能告訴你哪個是最新的,哪裏工作的),並檢查自該版本以來發生了什麼變化。 – TLama 2013-03-24 15:18:58

回答

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; 

這是最可靠的方法我到目前爲止,已經發現,你需要確保頁面裝載得很好,並且你得到了正確的dom t框架。

希望它可以幫助你,請務必查看上面的下載鏈接中的示例代碼,這幫助我了很多。

玩得開心編碼,Delphi岩石!