2

Application.ProcessMessages を使用せずに MSHTML ドキュメントを読み込む別の方法はありますか?

ドキュメントを IHTMLDocument にロードするには、次のようにする必要があります。

while Doc.readyState <> 'complete' do 
   Application.ProcessMessages;

ロード中にすべてのメッセージ キューを処理したくありません。アプリケーション フローを変更するためです。

IHTMLDocument がロード プロセスで進むと予想される特別なメッセージ コードがありますか? または、ロードする別の方法はありますか?

4

3 に答える 3

6

Application.ProcessMessages の呼び出しは、MSHTML の activeX コントロールがドキュメントの読み込みを完了する時間を確保するために必要な場合がほとんどです。バックグラウンドでのドキュメントの読み込みをシミュレートするために、ここで協調マルチタスクを使用しているようです.ActiveXは、次のチャンクなどを処理するためにメッセージを自分自身に投稿します.

通常、ドキュメントの読み込みは通常のメッセージ ループの一部として発生するため、これはアプリのフローには影響しません。しかし、ドキュメントを同期的にロードしたい (ドキュメントが完全にロードされるまで何もしない) ため、メッセージを介してバックグラウンドでロードする方法に敏感です。

解決策の 1 つ: ドキュメントを同期的にロードする要件を削除できるかどうかを確認してください。ロードが発生したときにロードを実行しますが、readState = complete のチェックを、おそらく 1 秒間隔でタイマーに移動します。タイマーがドキュメントの読み込みが完了したことを検出したら、下流の食物連鎖アクティビティを開始します。

別の解決策: ドキュメントが読み込まれるのを待っている間にモーダル ダイアログを表示します。これには、UI の残りの部分を無効にするという利点があるため、再入可能性のリスクを回避できます。ProcessMessages を呼び出すことは、ユーザーが引き続きウィンドウを操作したり、ボタンやメニューなどをクリックしたりできることを意味します。通常、これは問題を引き起こします。モーダル ダイアログ (「進行状況ダイアログ」) を表示すると、モーダル ダイアログの背後にあるすべてが無効になり、再入可能性が回避されます。

3 番目の可能性: Application.ProcessMessages を PeekMessage とロジックに置き換えて、メッセージを調べて、メッセージを通過させるか、後で使用するためにメッセージ キューに戻すかを決定します。これは少し汚れていますが、非常に特殊な場合に機能する可能性があります。

アプローチ 2 のモーダル ダイアログをお勧めします。

于 2010-04-09T18:26:39.843 に答える
3

コンポーネントTEmbeddedWBには、ドキュメントを MSHTML コントロールに直接ロードする LoadFromFile や LoadFromStream などのヘルパー関数が含まれています。完全なロジックを onDocumentComplete イベントに移動します。

于 2010-04-09T18:27:08.437 に答える
1

ドキュメントの読み込みが完了すると発生する TEmbeddedWB.OnDocumentComplete イベントがあります。それを使いたくない特別な理由はありますか?

于 2010-04-12T08:44:54.170 に答える