1

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

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

到目前为止一切顺利 - 但是,在接收到对“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 为已下载的单个资源给我一个事件,以便我可以在下载 index.htm 时阅读它。(而不是等待整个页面和所有资源完成加载)
    1. 答:使用“crmBrowserLoadStart”而不是“crmBrowserLoadEnd”。为了确保它可以在浏览器开始处理下载的文件之前获取 url。
    1. 问:在整个文档完成加载并且 crmBrowserLoadEnd 完成之前,如何阻止所有用户输入。(虽然这不太受欢迎,因为它会降低用户对浏览器的享受):
    1. A:更新:捕获“crmBrowserPreKeyEvent”并添加“if FLoading then Result := True;” 将确保用户无法使用键盘进行导航。设置 crmBrowser.Enabled := False,。将确保用户无法使用鼠标导航。
4

1 回答 1

0

得到了 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;
于 2016-02-28T20:15:27.207 回答