3

編集 この1行に絞り込み、

HTML := wb.OleObject.Document.documentElement.innerHTML;

これは時間を消費します...どうすればスピードアップできますか?

次のコードを使用すると、ページ (Delphi XE) の HTML にアクセスしようとしているときに、アプリケーションが 1 ~ 2 秒間ハングすることがあります。

function Button1Click(Sender : TObject);
begin
   wb.navigate('http://10.0.0.154/stats');
   // Use a timer to poll the page - dont wait and process app messages
   timer1.enabled := true;
end;

procedure Timer1Timer(Sender : TObject);
var
  HTML : WideString;
begin
   If GetHTML(HTML) = true then
   begin
      Timer1.enabled := false;
      { do something }
   end;
end;


function GetHTML(var HTML : WideString) : boolean;
var
  Document : IHTMLDocument2;
begin
  HTML := '';
  Result := false;

  Document := wb.DOcument as IHTMLDocument2;
  If Assigned(Document) then
  begin
    try
      HTML := wb.OleObject.Document.documentElement.innerHTML;
      Result := true;
    except
      Result := false;
    end;
  end;
end;

ただし、GetHTML メソッドで何かを返すのに 1 ~ 2 秒かかり、UI がロックされることに気付きました。Delphi XE で AQTime を見ると、メソッド呼び出しが遅い (1 ~ 2 秒) と表示されます。散発的で、ページがまだロードされているときに失敗するのではないかと思います。

私が読み込んでいるページは社内ページであり、javascript でいっぱいで 500k の大きさです。ページの準備が整う前に起動するため、OnDocumentComplete を使用できません。

TWebbrowser の HTML にアクセスできる高速な方法があれば、誰でも光を当てることができますか?

4

3 に答える 3

4

ページをナビゲートするとき、OnDocumentComplete は複数回 (フレーム) 発生する可能性があることに注意してください。

OnDocumentComplete を適切に実装する方法:

procedure YourForm.OnDocumentComplete(
  Sender: TObject;
  const pDisp: IDispatch;
  var URL: OleVariant);
var
  currentBrowser: IWebBrowser;
  topBrowser: IWebBrowser;
  document: OleVariant;
  windowName: string;
begin
  currentBrowser := pDisp as IWebBrowser;
  topBrowser := (Sender as TWebBrowser).DefaultInterface;
  if currentBrowser = topBrowser then
    ShowMessage('Complete document was loaded')
  else
  begin
    document := currentBrowser.Document;
    windowName := document.ParentWindow.Name;
    ShowMessage(Format('Frame "%s" was loaded', [windowName]));
  end;
end;

ソース:

http://www.cryer.co.uk/brian/delphi/twebbrowser/twebbrowser_events.htm#OnDocumentComplete

于 2011-06-22T21:16:18.427 に答える
2

あなたの問題は、HTML を取得しようとする前に、TWebBrowser がページの読み込みを完了できないことにあるようです。wb.Navigate を呼び出すコードが表示されておらず、InnerHTML を取得する例外に対処する必要があるため、これは単なる推測です。

次のことを試してください。

procedure TForm1.GetHTML(URL: string; var HTML: string);
begin
  wb.Navigate(URL);
  Application.ProcessMessages;
  while wb.Busy do
    Application.ProcessMessages;
  HTML := wb.OleObject.Document.documentElement.innerHTML;
end;
于 2011-05-09T01:27:40.070 に答える
0

@crefirdの回答と同様に、ブラウザが作業を完了する前にInnerHTMLにアクセスしようとしていると思われます...

ReadState/Busy が TWebBrowser のビジー状態の正確な表現を返さない場合は、次のようにすることができます。

1)グローバル変数、またはフォームのプライベートメンバーを作成します...「FBrowserBusy:Boolean」など(「.Navigate」を呼び出す直前にTRUEに初期化することを忘れないでください)2)@crefirdが示したように彼の答えでは、「while」ループを使用し、「FBrowserBusy」を「wb.Busy」に置き換えるだけです。3) OnDocumentComplete イベントを TWebBrowser インスタンスに追加し、これを FBusy := False; に設定します。

これにより衝突が解消され、TWebBrowser オブジェクトがドキュメントの読み込みを完了してから、外部ルーチンが問い合わせを開始するようになります。

これがお役に立てば幸いです。

于 2011-05-12T01:24:53.007 に答える