1

yop,

Pour avoir un affichage un peu plus sympa qu'un mode texte, je voudrais afficher le résultat d'un log en HTML. Un composant "WebBrowser" est disponible en .NET, et on peut écrire à la main le code HTML, mais il a quand même quelques problèmes. Déjà, il n'a pas l'air tout à fait au point, le champ pour lire/écrire du code HTML (WebBrowser.DocumentText) a l'air de bugger, d'après ce que je lis sur le net il semblerait qu'on ne puisse le modifier qu'une seule fois, donc il me reste WebBwoser.Document.Write mais ça ne permet que d'ajouter du contenu à la page, pas de modifier celui qui aurait déjà été présent. En plus, je n'ai pas pu trouver un moyen de lui faire automatiquement scroller l'affichage vers le bas (comme c'est un log qui s'affiche, et qu'il grandit, je veux que l'affichage le suive au fur et à mesure). Enfin, ce composant m'a l'air un peu "lourd" puisqu'il integre tout un tas de features d'Internet Explorer pour naviger sur le web, ce qui ne m'interesse absolument pas.

Quelqun connaitrait un composant ou une solution pour régler ces problèmes ?

Merci happy
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

2

passer par le javascript pour effacer/remplacer le contenu ou pour scroller vers le bas de la page ? (et je pense pas que ça soit plus lourd qu'un tab d'ie, si ?)

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

3

heu et y'a moyen d'appeler mon javascript quand je veux pr éditer le contenu ensuite ?

(pkoi pas, c'est un peu tordu comme méthode mais si ça marche parfaitement...)
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

4

Je ne sais pas si tu peux appeler le code JS à partir de ton projet en C#, mais sinon au pire tu peux très facilement mettre un timer dans le code JS qui scrolle en bas de la page toutes les n millisecondes.

5

là par contre c'est super moche grin

faudrait soit que le JS fasse tout, soit qu'il ne fasse rien; si y'a moyen de l'appeler depuis le programme en C# c'est pas mal, mais si c'est une solution hybride c'est bof je trouve :/
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

6

ah ben c'est sûr que ça ressemble à rien, mais bon... tripo (genre le mec (ou la jeune fille, après tout embarrassed) qui reprend le code, il peut chercher longtemps pourquoi le scrollpane descend tout seul... triso)

Après ça dépend aussi de la deadline de ton projet (si c'est pour hier, je te conseille d'utiliser settimeout & cie et de passer à autre chose trioui)


EDIT : je viens de penser, y'a peut être moyen de jouer avec les orientations CSS (je crois savoir qu'on peut définir si on veut écrire de droite à gauche ou l'inverse, peut être qu'il y a la même chose en vertical confus (après je n'ai auccune idée de comment ça pourrait se comporter (surtout sous IE...)))

7

ah nan y'a pas de deadline, c'est un projet perso ^^

ms à y réflechir la solution d'écrire via js ça me semble de mieux en mieux en fait, ça permet d'écrire ailleurs qu'à la fin de la page, de laisser tte la partie présentation/transformation du texte dans la page, etc... je chercherai si c'est faisable, en attendant si Pollux a la solution ça m'interesse happy

[edit] trouvé, ça marche pas mal, je garde happy
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

8

edit > ben poste la solution tongue (si tu veux faire ça bien faut prévoir aussi un scroll-lock parce que ça peut être chiant si ça se met à défiler pendant que tu es en train de lire wink)

9

Et pourquoi ne pas utiliser un RichTextControl ?
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

10

Pen² > ah stu veux, c'est tout con :

HTML :
<html>
   <head>
      <script language="javascript">
         function add_line (line)
         {
            document.getElementById ("log").innerHTML += line + "<br />";
            window.location = "#scroll";
         }
      </script>
   </head>
   <body>
      <div id="log"></div>
      <a name="scroll"></a>
   </body>
</html>


C# :
String path = "file:///" + Path.GetDirectoryName (Application.ExecutablePath) + "\test.htm";
this.webBrowser1.Url = new Uri (path);
this.webBrowser1.Document.InvokeScript ("add_line", new object[] { "kikoo" });


Godzil > pke c'est de la merde ? ^^ (je veux pvoir faire des skins, et le RTF c'est pas manipulable hors programme)
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

11

mais si y avait pas eu InvokeScript() tu aurais pu simplement rajouter du code entre balises <script> en plus du code html oui

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

12

oui mais si faut appeler le même javascript à chaque fois que je veux scroller la page (donc à chaque insertion) c'est pabo ^^
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

13

jsais pas si c'est ce que voulais faire mais j'avais fait un truc qui ressemble en ecrivant le html dans un fichier texte (ya plein de fonctions pour ca), avec une ancre html sur la derniere ligne, et ensuite webBrowser.Navigate(fichier.html#derniereLigne) pour rafraichir et scroller en bas

14

ouep ça marche, mais le problème de cette solution c'est que ça clignote pas mal vu que ça refresh la page à chaque fois
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

15

merci (je ne développe pas en C# mais ça m'arrivera bien un jour... embarrassed)

16

Bon, ça marche presque, j'ai juste un dernier problème étrange :

Avant de pouvoir executer un script sur la page, il faut qu'elle soit chargée entièrement, sinon le "InvokeScript" échoue; jusque là c'est logique. J'utilise donc la propriété "ReadyState" pour faire un truc du genre avant d'afficher un message :

while (this.webBrowser1.ReadyState != WebBrowserReadyState.Complete)
   Application.DoEvents ();


Le problème est que ce bout de code se trouve dans un event ("OnMsg") qui a été appelé ailleurs, et j'ai l'impression que pendant le DoEvents cet event se retrouve dupliqué un certain nombre de fois; le résultat c'est que lors de l'affichage du 1er message (qui implique l'ouverture de la fenêtre et donc le chargement de la page HTML), il est affiché plusieurs fois comme si j'avais déclanché plusieurs fois "OnMsg" avec les mêmes arguments. Y a-t-il une explication logique ?
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

17

pourquoi tu ne fais pas une boucle vide en attendant que ca charge ?

sinon ton truc ca doit etre parce que l'event OnMsg n'est pas encore retiré de la pile de messages au moment ou tu fais ta boucle, tu peux peut etre le virer a la main avec des trucs genre RemoveMessageFilter ... (mais je dis peut etre des conneries)

18

Nheryvra (./17) :
pourquoi tu ne fais pas une boucle vide en attendant que ca charge ?

Parceque ça provoquerait un freeze de l'application ^^
sinon ton truc ca doit etre parce que l'event OnMsg n'est pas encore retiré de la pile de messages au moment ou tu fais ta boucle, tu peux peut etre le virer a la main avec des trucs genre RemoveMessageFilter ... (mais je dis peut etre des conneries)

Oui ça doit être un truc comme ça, par contre je connaissais pas de fonction permettant de retirer un event manuellement, je vais vérifier happy
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

19

et c'est vraiment embetant que ca freeze le temps du chargement d'un html local (ce qui doit etre moult pas long) ?

20

Oui puisque ça freeze totalement : si je n'appelle pas DoEvents, le chargement du webbrowser ne sera jamais repris donc jamais terminé, et la boucle ne finira jamais :/

Je viens de vérifier que c'était bien lié aux évenements et c'est le cas, par contre je capte pas trop pkoi il est dupliqué... il est pas supposé être supprimé de la file dès que son traitement commence ? (parceque là chaque appel à DoEvents semble traiter une nouvelle instance du même évenement, donc selon le temps de chargement de l'html je peux avoir plein de fois la 1ere ligne qui s'affiche). Sinon j'ai pas trop capté le fonctionnement de RemoveMessageFilter vu la tronche de son prototype, v aller voir msdn :/
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

21

Zephyr (./20) :
Oui puisque ça freeze totalement : si je n'appelle pas DoEvents, le chargement du webbrowser ne sera jamais repris donc jamais terminé, et la boucle ne finira jamais :/


ah ouais j'avais pas pensé à ca smile et ya pas moyen de lancer ton "this.webBrowser1.Url = new Uri (path);" dans un autre thread, et bloquer le premier en attendant que dans le deuxieme la page se charge ? (c'est un peu tordu j'avoue smile)

Sinon j'ai pas trop capté le fonctionnement de RemoveMessageFilter vu la tronche de son prototype, v aller voir msdn :/


le probleme de RemoveMessageFilter c'est que ca vire tout en type de messages et pas un event particulier (enfin doit yavoir moyen de RemoveMessageFilter(un truc) attendre et AddMessageFilter(le truc) ... mais ca a l'air moche)

22

Nheryvra (./21) :
ah ouais j'avais pas pensé à ca smile et ya pas moyen de lancer ton "this.webBrowser1.Url = new Uri (path);" dans un autre thread, et bloquer le premier en attendant que dans le deuxieme la page se charge ? (c'est un peu tordu j'avoue smile)

J'ai pas essayé mais je pense que non : tu ne peux pas accéder au webBrowser depuis un autre thread que celui de sa form principale. (à vrai dire j'ai pensé à des solutions à peu près aussi tordues qui auraient pê une chance de marcher, mais je préfererais éviter grin)

Rah c'est chiant ce pb... surtout que je comprends pas du tout la logique dans ce comportement :/
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

23

ah apparemment ya un event DocumentCompleted qui attend que tout soit charger dans les webBrowser, tu doit pouvoir mettre ton InvokeScript là dedans non ?

edit : cf. l'exemple de http://tinyurl.com/2geee8 qui imprime une page apres qu'elle soit completement chargée

24

oui mais mon InvokeScript c'est lui qui écrit le texte, et il a été appelé autre event externe à cette Form, je ne choisis pas quand il arrive ^^

L'autre solution que j'avais envisagée était, quand un event arrive mais que le webBrowser n'est pas "prêt", d'enregistrer le message dans une liste et de vérifier au moment du DocumentCompleted si la liste contenait quelque chose, et de l'afficher le cas échéant. Ça marchera surement mais c'est du bidouillage, j'aime pas trop et j'aurais préferé trouver une vraie solution sans contourner le problème :/
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

25

Zephyr (./22) :
J'ai pas essayé mais je pense que non : tu ne peux pas accéder au webBrowser depuis un autre thread que celui de sa form principale.

:/ et qu'est-ce que ça fait ? ça plante ? ça lance une exception ?

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

26

uep, exception, je n'ai plus le nom en tête

(c'est chiant, mais il y avait la même limitation en Delphi, ça ne m'étonne pas plus que ça finalement)
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)