1

現在、オンライン ゲームのアクティビティを「ログ」するアプリケーションに TWebBrowser を埋め込んで、そのゲームに関する統計をユーザーに表示できるようにしています。これは現在問題なく動作しますが、TWebBrowser は TChromium よりも少し遅いようです。したがって、 https ://bitbucket.org/chromiumembedded/ から Delphi TChromium 組み込みフレームワーク (CEF)-3 を使用するようにプロジェクトを変換し始めました。

これから、ダウンロードの demos ディレクトリにある 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. Q: ダウンロードされた個々のリソースのイベントを提供するよう CEF に依頼/通知するにはどうすればよいですか。これにより、ダウンロードされたときに index.htm を読み取ることができます。(ページ全体とすべてのリソースの読み込みが完了するのを待つ代わりに)
    1. A: 「crmBrowserLoadEnd」の代わりに「crmBrowserLoadStart」を使用します。ブラウザがダウンロードしたファイルを処理する前に URL を取得できるようにします。
    1. Q: ドキュメント全体の読み込みが完了し、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 に答える