Boucle + condition

Résolu
al78310 Messages postés 45 Date d'inscription dimanche 4 octobre 2015 Statut Membre Dernière intervention 29 mai 2016 - 19 avril 2016 à 11:59
al78310 Messages postés 45 Date d'inscription dimanche 4 octobre 2015 Statut Membre Dernière intervention 29 mai 2016 - 22 avril 2016 à 11:35
Bonjour tout le monde !!
j'ai vraiment un soucis avec les boucle (je suis nouveau en vb)....

Voici ma configuration
Une checkbox, une textbox, et un webbrowser.

J'aimerai que lorsque ma checkbox est cochée et tant que ma textbox est vide, que vb copie la valeur de la cellule dans la textbox

Voici ma solution de noob, mais elle ne marche pas apparemment....

    Private Sub CheckBox1_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBox1.CheckedChanged
If CheckBox1.Checked = True Then
TextBox6.Text = WebBrowser1.Document.GetElementById("1").InnerText
Do Until (WebBrowser1.Document.GetElementById("1").InnerText) IsNot Nothing
Threading.Thread.Sleep(500) 'j aimerais une pause entre chaque boucle si c'est possible ...
Loop
End If
End Sub



Auriez vous une idée si il vous plait?
Merci de votre attention et bonne journée.

14 réponses

Bonjour

La procédure ci-dessous devrait solutionner ton problème
Il faut que ton code appelle cette procédure à un moment donné
Elle va boucler jusqu'à ce que l'une des deux conditions soit vraie

Private Sub TextBox6GetData ()
TextBox6.Text = "" 'vider TexBox6
Do Until CheckBox1.Checked = True Or TextBox6.Text <> ""
If WebBrowser1.Document.GetElementById("1").InnerText IsNot Nothing Then
TextBox6.Text = WebBrowser1.Document.GetElementById("1").InnerText
End If
System.Windows.Forms.Application.DoEvents()
Loop
End Sub
0
al78310 Messages postés 45 Date d'inscription dimanche 4 octobre 2015 Statut Membre Dernière intervention 29 mai 2016
20 avril 2016 à 16:50
Génial, merci pour ta réponse, je l’essaye tout de suite.
0
al78310 Messages postés 45 Date d'inscription dimanche 4 octobre 2015 Statut Membre Dernière intervention 29 mai 2016
Modifié par al78310 le 20/04/2016 à 17:20
Je viens de tester ta solution et il semblerait y avoir un problème quelque part...
J' ai mal expliquer mon problème initial.

Dans un webbrowser, il y a un tableau dans lequel il y a des cellules vides. Mais ces cellules vides vont être alimentées dynamiquement à un moment donné mais je ne sais pas lequel...
C'est pour cela que je voudrais que soit :
_ des que ma checkbox est coché, que le programme copie le contenu de la cellule(situé dans le webbrowser) dans ma textbox jusqu à temps que la donnée soit apparu dans ma textbox.
ou soit:
_ des que ma checkbox est coché, que le programme attende que le contenu de la cellule(situé dans le webbrowser) arrive, puis copie la donnée dans la textbox

J’espère avoir été plus clair et complet.
Merci de ton aide, fortement appréciée
Bonne journée
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
20 avril 2016 à 18:58
Bonsoir

des que ma checkbox est coché, que le programme copie le contenu de la cellule(situé dans le webbrowser) dans ma textbox jusqu à temps que la donnée soit apparu dans ma textbox.

la fin de la phrase m'interpelle, si tu copies le contenu d'un texte (peu importe son origine) vers une textbox, il apparait quasiment instantanément. Il ne faut pas faire de boucle pour ça.


des que ma checkbox est coché, que le programme attende que le contenu de la cellule(situé dans le webbrowser) arrive, puis copie la donnée dans la textbox
ce qui revient au même, y a 1 texte, je le copie et je sors de ma boucle, j'en à pas je reviens plus tard.

Je te conseille de mettre ce code dans un timer.
Comme ça il sera exécuté de façon régulière (le temps est réglable, propriété Interval)

Pour le code en lui même, je n'ai pas VS sous la main mais en gros

Y'a t il un texte?
  • oui, je le copie et je stoppe le timer
  • non, je ne fais rien et on attends la prochaine itération
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
En effet je n'avais pas bien compris
Alors je pense que cette fois ça devrait aller

Quand tu coches la checkbox la macro Texbox6GetData s'execute
Si la Textbox reçoit une valeur ou si tu décoches la checkbox la macro s'arrête.

J'ai modifié la macro

Private Sub TextBox6GetData ()
TextBox6.Text = "" 'vider TexBox6
Do Until CheckBox1.Checked = False Or TextBox6.Text <> ""
If WebBrowser1.Document.GetElementById("1").InnerText IsNot Nothing Then
TextBox6.Text = WebBrowser1.Document.GetElementById("1").InnerText
End If
System.Windows.Forms.Application.DoEvents()
Loop
End Sub

Private Sub CheckBox1_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBox1.CheckedChanged
If CheckBox1.Checked = True Then
TextBox6GetData
End IF
End Sub
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
20 avril 2016 à 19:13
Bonsoir, mosca, en VB.Net on ne fait de macro
0
Mosca > Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024
20 avril 2016 à 19:42
Bonsoir Whismeril

En effet, le terme macro est impropre en VB.Net, mais c'est l'habitude du VBA Excel qui a resurgit. Quand même on aura compris.

;)
0
al78310 Messages postés 45 Date d'inscription dimanche 4 octobre 2015 Statut Membre Dernière intervention 29 mai 2016
20 avril 2016 à 19:23
Merci à vous tous, j'ai pas trop le temps de tester vos solution maintenant mais je le ferai un peu plus tard.(cette nuit)

Mais en tout cas encore merciiiiiiiiiiiiiiiii !!!!!
:)
0
al78310 Messages postés 45 Date d'inscription dimanche 4 octobre 2015 Statut Membre Dernière intervention 29 mai 2016
Modifié par al78310 le 21/04/2016 à 02:44
Rebonjour à tous !
_Mosca je viens de tester ta solution et je pense qu il y a un problème...
Je crois que la boucle s’arrête au moment ou WebBrowser1.Document.GetElementById("1").InnerText est remplie (donnée reçue) et donc s' arrête juste avant de copier cette même donnée dans la textbox....
En tout cas, ca ne recopie pas la valeur dans la textbox... :(

_Whismeril, en fait au début la cellule dans mon webrowser ne contient rien, et je voudrait qu’aussitôt que la donnée apparaissent, qu elle soit copiée dans ma textbox... C est pour cela que je voulais une boucle qui vérifie que la cellule soit remplie avant de la copier...
"Y'a t il un texte?

oui, je le copie et je stoppe le timer
non, je ne fais rien et on attends la prochaine itération"
Cela me parait bien si on peut mettre une valeur de timer pour que ça soit instantané... Mais comment coder ça? je suis vraiment nul avec tous ces systèmes de boucle....

Merci encore de vos aides :)
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
Modifié par Whismeril le 21/04/2016 à 08:14
Il suffit de mettre un intervalle court sur le timer.
C'est réglable à la ms, tu peux essayer 50, c'est déjà très court

Et timer est une boucle dont le code n'est pas géré par toi, tu y mets juste le code utile
0
Bonjour à tous

@al78310
La procédure que je t'ai donné semble fonctionner puisque la boucle Do ... Loop s’interrompt comme prévu.
Peut-être y a-til juste un problème de rafraichissement de l'affichage.
Peut-être que la valeur transmise à textbox6 n'est pas imprimable comme des blancs (espaces) ou tabulations.
Pour être sur, il faudrait modifier la ligne
TextBox6.Text = WebBrowser1.Document.GetElementById("1").InnerText

comme ceci
TextBox6.Text = "-" & WebBrowser1.Document.GetElementById("1").InnerText & "-"

Ainsi tu pourra te rendre compte si quelque chose a bien été transmis à Textbox6 encadré par les caractères "-" et donc modifier le code en conséquence
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
21 avril 2016 à 10:59
Bonjour,

il me semble avoir lu quelque part que l'utilisation de DoEvents n'est pas conseillé.

Cela vient peut être de là.

On peut le remplacer par Thread.Sleep(), mais si on est dans le thread principal tout va se stopper.

D'ou ma proposition de Timer, qui crée une sorte de thread propre.
0
Mosca > Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024
21 avril 2016 à 11:20
Le problème est que la boucle doit s’exécuter jusqu'à ce qu'un évènement se produise, sans savoir quand cela va se produire. Alors un Timer, pourquoi pas?

Mais je pense qu'il faut déjà vérifier ce qui est réceptionné par le WebBrowser et doit être transcrit dans la TextBox, pour ensuite adopter la meilleure méthode.
0
al78310 Messages postés 45 Date d'inscription dimanche 4 octobre 2015 Statut Membre Dernière intervention 29 mai 2016
21 avril 2016 à 15:04
Bonjour Mosca et Whismeril
_Mosca, j'ai utilisé ta dernière ligne de code et des que je click sur ma checkbox, il s affiche "- -"(sans les guillemets) alors que la donnée n est pas arrivée. Et lorsque la donnée arrive, aucun changement ne s’opère sur ma textbox...

_ Whismeril, d'après tes conseils et le code de Mosca je pense tester ce code :
    Private Sub CheckBox1_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBox1.CheckedChanged
If CheckBox1.Checked = True Then
TextBox6GetData()
End If
End Sub

Private Sub TextBox6GetData()
If WebBrowser1.Document.GetElementById("1").InnerText IsNot Nothing And CheckBox1.Checked = True Then
TextBox6.Text = WebBrowser1.Document.GetElementById("1").InnerText
Else Threading.Thread.Sleep(500)
Call TextBox6GetData()
End If
End Sub


Merci encore a vous 2
0
Ce que tu as écrit est dangereux, car une procédure qui s'appelle elle-même (récurrence), va finir par saturer la pile et va planter le programme (stack overflow).

Ce que je suspectais se confirme, il y a bien un caractère reçu par textbox6.
A savoir quel est ce caractère, et si ce caractère est présent d'origine dans WebBrowser1.Document.GetElementById("1"), auquel cas il faudrait modifier la condition de lecture.

Je pense que ce caractère est un espace qui peut être éliminé avec la fonction Trim

TextBox6.Text = Trim(WebBrowser1.Document.GetElementById("1").InnerText)

ça ne coute rien d'essayer
0
al78310 Messages postés 45 Date d'inscription dimanche 4 octobre 2015 Statut Membre Dernière intervention 29 mai 2016
Modifié par al78310 le 21/04/2016 à 16:26
je viens de tester mon code et ça fait comme les autres, ça ne copie pas quand la donnée arrive mai ça la copie quand on lance le programme et quand la donnée est déjà arrivée...

Je vais tester ton code, effectivement c est gratuit, et ça me fait apprendre plein de choses .
Mais je pense que ça ne va pas résoudre le problème car on ne change pas le reste. Il y a bien un caractère reçu mais indépendamment de que la cellule du webbrowser reçoit :
c'est des que je click sur ma checkbox qu il s affiche "- -" et non pas quand la cellule reçoit la donnée....
je teste ta ligne et je reviens
Merci
0
al78310 Messages postés 45 Date d'inscription dimanche 4 octobre 2015 Statut Membre Dernière intervention 29 mai 2016
21 avril 2016 à 18:02
:( ça ne marche toujours pas...
0
Bizarre!!

J'ai essayé chez moi et ça marche. Malheureusement, je n'ai pas les données de ton WebBrowser.

Pour info, quelle type de données tu es censé récupérer?
Comment tu reçois les données dans le WebBrowser?

Peux-tu poster la procédure telle que tu l'as adaptée?
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
21 avril 2016 à 19:30
Bonsoir,

en VB.Net, Call ne sert à rien, c'est "héritage" de VB6.

Pour le timer, voici ce que je te propose (en supposant que tu travailles en Winform)
Tu glisses un timer depuis la boite à outils vers le formulaire, il n'apparait pas sur le formulaire mais en dessous


En le sélectionnant, dans la fenêtre de propriété tu peux choisir l'intervalle auquel sera exécuté ton code.

En double cliquant dessus on arrive dans la méthode abonnée à l'évènement click
   Private Sub Timer2_Tick(sender As Object, e As EventArgs) Handles Timer2.Tick
        If String.IsNullOrWhiteSpace(WebBrowser1.Document.GetElementById("1").InnerText) Then
            Timer2.Stop()
            TextBox6.Text = WebBrowser1.Document.GetElementById("1").InnerText
        End If
    End Sub


et dans ta checkedbox
    Private Sub CheckBox1_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBox1.CheckedChanged
        If CheckBox1.Checked Then
            Timer2.Start()
        Else
            Timer2.Stop()
        End If
End Sub 

0
al78310 Messages postés 45 Date d'inscription dimanche 4 octobre 2015 Statut Membre Dernière intervention 29 mai 2016
Modifié par al78310 le 21/04/2016 à 23:37
re tout le monde
Whismeril dans ta solution timers2 est souligné en rouge...Je suis trop nul pour réparer ça lol dsl...

Mosca les données que je dois récupérer sont simplement des chiffres...Quel est ton code toi justement,parce que j en ai testé plein du coup... si le tien marche...
le dernier que jai testé est
    Private Sub TextBox6GetData()
TextBox6.Text = "" 'vider TexBox6
Do Until CheckBox1.Checked = False Or TextBox6.Text <> ""
If WebBrowser1.Document.GetElementById("1").InnerText IsNot Nothing Then
TextBox6.Text = Trim(WebBrowser1.Document.GetElementById("1").InnerText)
End If
System.Windows.Forms.Application.DoEvents()
Loop
End Sub

Private Sub CheckBox1_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBox1.CheckedChanged
If CheckBox1.Checked = True Then
TextBox6GetData()
End If
End Sub
0
Moi, j'ai utilisé les procédures que je t'ai donné, sauf que j'ai dû simuler le WebBrowser par un autre TextBox. J'ai aussi modifié la procédure CheckBox1_CheckedChanged car quand je cliquais dessus, ça ne se rafraichissait pas, la boucle TextBox6GetData utilisait trop de ressources CPU.

Si toi tu dois recupérer des chiffres, on peut tester si la valeur de WebBrowser1.Document.GetElementById("1") est différent de zéro.
Voilà comment je ferai:

    Private Sub CheckBox1_CheckedChanged(ByVal sender As Object, ByVal e As EventArgs) Handles CheckBox1.CheckedChanged
If CheckBox1.Checked = True Then
Me.Refresh()
TextBox6GetData()
End If
End Sub

Private Sub TextBox6GetData()
TextBox6.Text = "" 'vider TexBox6
Do Until CheckBox1.Checked = False Or TextBox6.Text <> ""
If Val(WebBrowser1.Document.GetElementById("1").InnerText) <> 0 Then
TextBox6.Text = WebBrowser1.Document.GetElementById("1").InnerText
End If
System.Windows.Forms.Application.DoEvents()
Loop
End Sub


Voilà comment ça fonctionne
Des que tu coches checkbox1, TextBox6GetData scrute le WebBrowser.
Aussitot que la valeur lue est différente de zéro, la boucle s'arrête.
Encore faut-il que des chiffres arrivent dans le WebBrowser.
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
22 avril 2016 à 08:35
Oui j'ai 2 timer sur ce Form, si tu n'en as qu'un c'est Timer1.....
0
al78310 Messages postés 45 Date d'inscription dimanche 4 octobre 2015 Statut Membre Dernière intervention 29 mai 2016
22 avril 2016 à 11:35
Merci a vous deux, ça marche enfin !!!
MERCI !!!!!!!!!
0
Rejoignez-nous