2010-04-09 10 views
2

Existe-t-il un autre moyen de charger des documents MSHTML sans utiliser Application.ProcessMessages?Existe-t-il un autre moyen de charger des documents MSHTML sans utiliser Application.ProcessMessages?

Pour charger un document dans un IHTMLDocument que je dois faire ceci:

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

Je veux pas traiter toute la file d'attente de messages pendant le chargement, parce que je changerai mon flux d'application, autrement dit, certains messages qui devraient être traités après que le chargement soit terminé peuvent être traités plus tôt, même avant la fin du chargement.

Un code de message spécial est-il attendu par IHTMLDocument dans le processus de chargement? Ou il y a une autre façon de charger?

+0

Merci dthorpe –

Répondre

6

L'appel à Application.ProcessMessages est probablement juste nécessaire pour permettre au contrôle MSXML activeX de terminer le chargement du document. Il semble qu'ils utilisent le multitâche coopératif ici pour simuler le chargement du document en arrière-plan - l'ActiveX envoie des messages à lui-même pour traiter le morceau suivant ou quoi que ce soit.

Normalement, cela n'affecterait pas le flux de votre application, car la charge du document se produirait dans le cadre de votre boucle de message normale. Mais parce que vous voulez charger le document de façon synchrone (ne pas faire autre chose tant que le document n'est pas complètement chargé), vous êtes sensible à la façon dont il effectue le chargement en arrière-plan via les messages.

Une solution: voyez si vous pouvez supprimer l'obligation de charger le document de manière synchrone. Laisser la charge se produire quand cela arrive, mais déplacer la vérification de readState = complete dans une minuterie, peut-être sur un intervalle de 1 seconde. Lorsque la minuterie découvre que la charge de doc est terminée, éteignez vos activités de la chaîne alimentaire en aval.

Autre solution: Afficher une boîte de dialogue modale en attendant le chargement du document. Cela a l'avantage de désactiver le reste de votre interface utilisateur pour ne pas risquer d'être réentrant. Appeler ProcessMessages signifie que l'utilisateur peut toujours interagir avec votre fenêtre, cliquer sur les boutons, les menus, etc. En règle générale, cela entraînera des problèmes. L'affichage d'une boîte de dialogue modale ("dialogue de progression?") Évite la réentrance en désactivant tout ce qui se trouve derrière la boîte de dialogue modale.

Troisième possibilité: Remplacez Application.ProcessMessages avec PeekMessage et la logique pour examiner le message pour décider s'il doit le laisser passer ou le remettre dans la file d'attente de messages pour plus tard. C'est un peu sale mais peut fonctionner dans des cas très spéciaux.

Je recommande l'approche # 2, la boîte de dialogue modale.

+0

+1 L'approche 2 est ce que je suis d'accord aussi. –

+0

Je pense que dans la plupart des cas, le # 2 est la meilleure solution. Mais pour moi, quand j'ai besoin de traiter plusieurs documents par seconde, cela diminuerait beaucoup la performance. Donc, je suis la troisième possibilité, mais en utilisant un composant TApplicationEvents et en ignorant les messages du clavier et de la souris. Cela a bien fonctionné. Très tks. –

+0

Le problème même avec une boîte de dialogue modale est qu'il peut y avoir d'autres messages comme WM_TIMER qui causent des problèmes car ils peuvent amener votre application dans un état qui n'était pas prévu pendant que votre fonction attendait le chargement d'IE. –

3

Le composant TEmbeddedWB contient des fonctions d'assistance telles que LoadFromFile et LoadFromStream qui chargeront le document directement dans le contrôle MSHTML. Déplacez votre logique complète dans l'événement onDocumentComplete.

+0

Le lien est rompu –

+0

devrait être http://www.bsalsa.com/downloads.html – skamradt

+0

Le serveur ne répond pas. Avant de commencer à utiliser directement le TWebBrowser, j'ai pensé utiliser TEmbbeddedWB, mais je n'ai pas pu y accéder. –

1

Il existe un événement TEmbeddedWB.OnDocumentComplete, déclenché à la fin du chargement d'un document. Y a-t-il une raison particulière pour laquelle vous ne voulez pas utiliser cela?

+0

Le serveur ne répond pas. Avant de commencer à utiliser directement le TWebBrowser, j'ai pensé utiliser TEmbbeddedWB, mais je n'ai pas pu y accéder. –

+0

TWebBrowser a le même événement. Même si le serveur ne répond pas, il y aura un événement document complet pour le navigateur. – r4w8173