1

用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 的执行。可能有什么问题?

4

1 回答 1

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。

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

玩得开心编码,德尔福摇滚!

于 2013-04-06T17:20:20.327 回答