TChromium 单个资源下载完成事件



目前,我已经将TWebBrowser嵌入到一个应用程序中,该应用程序可以"记录"在线游戏中的活动,以便可以向用户显示有关该游戏的统计信息。这目前工作正常,但TWebBrowser似乎比TChromium慢得多。因此,我开始转换我的项目以利用Delphi TChromium嵌入式框架(CEF)-3,从: https://bitbucket.org/chromiumembedded/

从这里我拿了 guiclient,它可以在下载的演示目录中找到。

到目前为止一切顺利 - 但是,在收到对"crmBrowserLoadEnd"的调用之前,用户似乎能够按下按钮离开其当前页面。这导致我的程序错过了数据。

作为替代方案,我认为可以检查哪些资源完成其个人下载。我可以挂接事件"crmBrowserBeforeResourceLoad"以查看哪些资源"开始"加载。但是似乎没有任何事件可以告诉我资源已完成加载。

procedure TFrmDBrowser.crmBrowserBeforeResourceLoad(Sender: TObject; const browser: ICefBrowser; const frame: ICefFrame; const request: ICefRequest; out Result: Boolean);
var
  u: TUrlParts;
  Item: TListItem;
begin
  item := LvDataView.Items.Add();
  item.Caption := request.Url;
end;

因此,它归结为:

    1. 问:如何要求/告诉 CEF 为已下载的单个资源提供事件,以便我可以在下载索引时读取索引.htm索引。(而不是等待整个页面和所有资源完成加载)
    1. 答:使用"crmBrowserLoadStart"而不是"crmBrowserLoadEnd"。以确保它可以在浏览器启动之前抓取网址下载的文件。
    1. 问:如何阻止所有用户输入,直到整个文档完成加载并且 crmBrowserLoadEnd 完成。(虽然这不太受欢迎,因为它会降低用户对浏览器的享受):
    1. 答:更新:捕获"crmBrowserPreKeyEvent"并添加"如果FLoading则结果:= True;"将确保用户无法使用键盘进行导航。设置 crmBrowser.已启用 := 假,.将确保用户无法使用鼠标导航。

从Facebook Delphi小组得到答案,作者:Shariful Alam Khan。"使用 OnLoadStart 事件"

事实证明,这正是上述示例的最佳方法。

源示例:

procedure DataExtractionCallback(const Html: uString);
begin
  try
    FrmDBrowser.RunDataExtraction(Html);
  except
    //
  end;
end;
procedure TFrmDBrowser.crmBrowserLoadStart(Sender: TObject; const browser: ICefBrowser; const frame: ICefFrame);
var
  CefStringVisitor: ICefStringVisitor;
  URL: String;
begin
  if not IsMain(browser, frame) then
    Exit;
  FLoading := True;
  CefStringVisitor := TCefFastStringVisitor.Create(DataExtractionCallback);
  crmBrowser.Browser.MainFrame.GetSource(CefStringVisitor);
end;

相关内容

  • 没有找到相关文章

最新更新