Delphi XE3和TChromium

时间:2013-03-24 13:01:13

标签: delphi 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的执行。在什么可能是一个捕获?

1 个答案:

答案 0 :(得分: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。

希望它对您有所帮助,请务必查看上面下载链接中的示例代码,这对我帮助很大。

有趣的编码,Delphi摇滚!