Valeur textbox ne change pas... [Résolu]

Signaler
Messages postés
493
Date d'inscription
jeudi 27 mars 2014
Statut
Membre
Dernière intervention
26 décembre 2020
-
Messages postés
2429
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
1 juin 2021
-
Bonjour,
J'ai un textbox qui récupére les valeurs d'un programme en temps réel quasi toutes les millisecondes de façon continue.
je souhaiterai "checker" si le textbox est en pause : c'est a dire .
Capturer sa valeur à 08:53:23
puis 5 secondes plus tard ( 08:53:28)
Si les valeurs sont identiques : le textbox est en pause . si les valeurs sont différentes le textbox n'est pas en pause .

Merci de votre aide
J espère que j'ai été un peu claire .
Cordialement

16 réponses

Messages postés
2429
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
1 juin 2021
137
Bonjour
Déjà récupérer ces valeurs toutes les millisecondes est-ce bien nécessaire ? A moins que ce programme soit externe au projet et que l'on ne puisse le modifier .
Maintenant pour ton problème : avec un Timer tu récupères ces valeurs toutes les 5 secondes . Si les valeurs à l'instant T sont identiques à celles de l'instant T -1 ta Textbox est "en pause" .
Penses à faire démarrer ton Timer avec des valeurs à comparer nulles . Au premier instant T0 de comparaison il n' a rien à comparer alors qu'à l'instant T1 on compare avec l'instant T0 ; en général à l'instant Tn on compare avec l'instant Tn-1 sauf au début quand n = 0 .
Attention la Textbox ne sert qu'à l'affichage . Il faut comparer les valeurs elles-mêmes et non ce que la Textbox affiche .

Messages postés
493
Date d'inscription
jeudi 27 mars 2014
Statut
Membre
Dernière intervention
26 décembre 2020

Bonjour vb95
ta suggestion est exactement la bonne . je vois que tu as bien compris ma problématique.
reste a tout traduire en ligne de code .
Comment "demander" à un timer de récupérer toutes 5 seconds la valeur ou plutôt comment stocker les valeurs et les comparer?

Private Sub Timer7_Tick(sender As Object, e As EventArgs) Handles Timer7.Tick
            Dim t0 As Integer =me.valeur.text    ''' textbox contenant les valeurs a recupérer
            Dim t1 As Integer =me.valeur.text    ''' textbox contenant les valeurs a recupérer
            t0 = 0
            t1 = 0
            TextBox2.Text = t0
            TextBox2.Text = t1
            If  TextBox1.Text = TextBox2.Text then 
msgbox(" pause")
end if 
        End Sub


merci de ton aide
Messages postés
2429
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
1 juin 2021
137
Bonjour
On en revient encore à des problèmes de base au niveau de la programmation .
Prenons en exemple cette ligne :
Dim t0 As Integer =me.valeur.text    ''' textbox contenant les valeurs a recupérer


Pour mettre un commentaire en fin d'une ligne de code une seule apostrophe suffit.
De plus un Integer et une chaine de caractères ne sont pas des valeurs du même type . Même si cela fonctionne c'est bancal . Tu ouvres ton projet avec Visual Studio Net . Dans le menu tu as Projet . Tu le développes et tu cliques sur le dernier (Propriétés du projet) . Une nouvelle interface s'affiche . Tu cliques dans Compilation en haut à gauche et tu mets Option Strict et Option Explicit sur On .Et ceci est à faire pour tout projet quel qu'il soit .


Maintenant un Timer a des propriétés et des méthodes .
Sa principale propriété est Interval en millisecondes ( la procédure se répète tous les X millisecondes )
Les 3 événements principaux sont : Start, Stop et Tick
Les 2 premiers sont évidents .
Le troisième se déclenche tous les X millisecondes

Maintenant la Textbox .
supposons qu'elle contienne 2 nombres qui varient dans le temps .
On les appelle Nb1 et Nb2
On définit leurs valeurs avant le démarrage du Timer et on sauvegarde ces 2 nombres : S1 et S2
On démarre le Timer et après 5 secondes tu relis NB1 et NB 2 et tu les compares à S1 et S2 . Si S1 = NB1 et S2 = NB2 la Textbox est en pause .
Si il y a une différence tu sauvegarde NB1 et NB2 dans S1 et S2 pour pouvoir faire un nouveau contrôle dans X millisecondes .
Attention la Textbox ne sert qu'à l'affichage . Il faut comparer les valeurs elles-mêmes et non ce que la Textbox affiche .

Un excellent cours que tu devrais potasser pour les bases : https://plasserre.developpez.com/cours/vb-net/
Et tout ce que je t'ai dit sur le Timer se trouve dans ce cours .

Messages postés
493
Date d'inscription
jeudi 27 mars 2014
Statut
Membre
Dernière intervention
26 décembre 2020

Merci pour le cours de Plasserre.
Je ne suis pas plus avancé .dommage
un code m"aiderait bien

merci quand même
Messages postés
2429
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
1 juin 2021
137
Bonjour
Je t'ai fait un petit code exemple avec une Form .
sur cette Form il te faut
- un label nommé Label1 ( il affiche 2 lignes : mettre Autosize sur False )
- une listbox nommé Listbox1 ( elle affichera l'heure des détections des changements )
- 2 Timers
- Timerchange avec un interval de 1000 ( 1 seconde ) : il simule les changements des valeurs aléatoirement tous les 20 à 40 secondes )
- Timercontrole avec un interval de 5000 ( 5 secondes ) : il détectera tous les 5 secondes si un changement a été effectué et l'affichera dans le listbox
Comme tu le vois je travaille directement sur Valeur1 et Valeur2 et non sur le contenu du label

A toi d'adapter cet exemple

Le code de la form
Imports System.Threading.Thread

Public Class Form1

    ' Valeur1 et Valeur2 sont les valeurs à surveiller
    ' SaveValeur1 et SaveValeur2 sont les sauvegardes de ces valeurs pour pouvoir faire les comparaisons
    Private Valeur1, Valeur2, SaveValeur1, SaveValeur2 As Long
    ' Temporisation pour le changement des valeurs ( une valeur aléatoire entre 20 et 40 ) 
    Private Tempo As Integer ' inutile pour toi
    Private ReadOnly Alea As Random = New Random ' inutile pour toi

    ''' <summary>
    ''' chargement de la form
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        ' initialisation des valeurs au démarrage
        Valeur1 = 10
        Valeur2 = 15
        SaveValeur1 = 0
        SaveValeur2 = 0
        AfficheValeurs()
        ' pour simuler les changements
        Tempo = Alea.Next(20, 40) ' inutile pour toi
        TimerChange.Start() ' inutile pour toi
        Sleep(2000) ' attendre 2 secondes ' inutile pour toi
        ' démarrage du contrôle des changements
        TimerControle.Start()

    End Sub

    ''' <summary>
    ''' Affiche les 2 valeurs dans le Label 
    ''' </summary>
    Private Sub AfficheValeurs()

        Label1.Text = "Valeur1 = " & Valeur1.ToString & Environment.NewLine & "Valeur2 = " & Valeur2.ToString

    End Sub

    ''' <summary>
    ''' Timer qui simule les changements de Valeur1 et Valeur2
    ''' Sa propriété Interval est de 1000 soit une seconde
    ''' Le changement se fait aléatoirement après une attente entre 20 et 40 secondes
    ''' C'est ton programme qui le fait déjà
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    Private Sub TimerChange_Tick(sender As Object, e As EventArgs) Handles TimerChange.Tick

        Tempo -= 1
        If Tempo = 0 Then
            ' si l'attente est finie on modifie les valeurs Valeur1 et Valeur2
            Valeur1 = Valeur1 * 2
            Valeur2 = Valeur2 * 3
            AfficheValeurs()
            If Valeur2 > Int32.MaxValue Then
                Valeur1 = 10
                Valeur2 = 15
            End If
            ' on réinitialise l'attente
            Tempo = Alea.Next(20, 40)
        End If

    End Sub

    ''' <summary>
    ''' Ce timer vérifie toutes les 5 secondes si les valeurs ont changés
    ''' c'est ce timer que tu dois programmer
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    Private Sub TimerControle_Tick(sender As Object, e As EventArgs) Handles TimerControle.Tick

        If SaveValeur1 = 0 Then
            ' au premier démarrage on ne compare rien
            SaveValeur1 = Valeur1
            SaveValeur2 = Valeur2
        Else
            If Valeur1 <> SaveValeur1 And Valeur2 <> SaveValeur2 Then
                ' les valeurs ont été modifiées ( attention les 2 valeurs changent toujours toutes les deux en même temps )
                ' mettre un Or à la place du And si une seule des valeurs peut changer ou les 2 valeurs peuvent changer ensemble
                SaveValeur1 = Valeur1
                SaveValeur2 = Valeur2
                ' on inscrit la modification dans la listbox
                ListBox1.Items.Add("Les valeurs ont été modifiées à " & Date.Now)
            End If
        End If

    End Sub


End Class


Messages postés
2429
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
1 juin 2021
137
une image de la Form en action

Messages postés
16025
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 juin 2021
549
Bonjour

je pense qu'il y a bien plus simple.

Pour en être sûr, il faudrait que Julia poste le code qui remplit le textbox.

Cela dit, quand je lis
Je ne suis pas plus avancé .dommage
alors que l'on t'a déjà dit (et depuis longtemps) de prendre le temps d'apprendre les bases et que tu n'en tiens pas compte, je ne suis pas vraiment enclin à t'aider plus....

NB il faut entre 3 et 5 jours en moyenne pour suivre le cours de plassere

Ici https://codes-sources.commentcamarche.net/forum/affich-10098438-treeview-et-namespace#3 (y'a plus d'un an ...)

https://plasserre.developpez.com/cours/vb-net/ (y'a 2 ans...)
Messages postés
2429
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
1 juin 2021
137
Bonjour Whismeril
Certainement qu'il y a plus simple mais pour faire un exemple qui fonctionne j'ai dû simuler les changements avec un second Timer .
Evidemment avec l'exemple que je lui ai fait il y a du boulot pour l'adapter à son projet .
Sans son code difficile de faire mieux et je pense déjà en avoir fait beaucoup ( à elle d'apprendre les bases de la programmation VB Net )
J''ai autant fait cela par défi pour moi-même que pour lui proposer une piste de réflexion .
On verra la suite à donner à ce post selon l'implication de l'éditeur qui a posté de ce message .

Messages postés
16025
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 juin 2021
549
Hello quand je dis qu'il y a plus simple, ça n'est pas de la machinerie nécessaire à provoquer des changement pour ton exemple que je parle, mais bien du suivi des modifications.
Messages postés
2429
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
1 juin 2021
137
Vu tes connaissances bien supérieures aux miennes je ne doute pas un instant qu'il y a plus simple .
Messages postés
16025
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 juin 2021
549
C'est pas une histoire de connaissance, juste prendre le problème dans l'autre sens.
Messages postés
493
Date d'inscription
jeudi 27 mars 2014
Statut
Membre
Dernière intervention
26 décembre 2020

Bonjour les gars
Je vous remercie sincèrement pour votre aide . Vous l'aurez compris je suis une profane dans la programmation mais je ne souhaite qu'apprendre et je m'y attelle .
La solution de VB95 est super mais il me reste pas mal de zones d'ombres.
- Pourquoi le programme démarre avec deux valeurs ?
' initialisation des valeurs au démarrage
        Valeur1 = 10
        Valeur2 = 15



En résumé , j’ai un textbox qui m'affiche les valeurs d'un programme ; ( programme dont je n'ai pas du tout la main ) .Ces valeurs changent en permanence mais peuvent "pauser " de temps à autre .

Je voudrais avoir la possibilité de détecter si le textbox est en pause juste en checkant ce textbox toutes les secondes .
exemple: il est 11:46:23 le textbox m'affiche 45
si à 11:46:24 le textbox m'affiche toujours 45 j'en déduis qu'il est en "pause" .

J'ai commencé un petit exemple avec la méthode
Tempo = Alea.Next(20, 40)


Je vous le joins ci-dessous.

https://mon-partage.fr/f/HpDprewg/


merci beaucoup de votre soutien
Messages postés
2429
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
1 juin 2021
137
bonjour Julia
1) Pourquoi mon programme commence avec 2 valeurs ? Il aurait pu démarrer avec 1 ou 3 ou 10 valeurs . Dans ton cas la ou les valeurs sont inscrites dans une Textbox qui est alimentée par le programme externe . Pour détecter un changement il faut bien une valeur avant et une valeur après .
2) Revenons à ta Textbox . Si je suis logique cette Textbox contient des valeurs qui appartiennent au programme externe dont tu n'as pas la main . Du coup comment y accèdes-tu à ces valeurs avec ton projet Visual Studio ?
Par analogie imagine ton programme externe être ta chambre, le projet Visual Studio être ton salon et la Textbox du programme externe être la télévision dans ta chambre . Tu ne peux être dans ton salon et voir la télé de ta chambre .
3) tu dis : J'ai commencé un petit exemple avec la méthode
Tempo = Alea.Next(20, 40)

As-tu compris le rôle de cette instruction ?

J'ai regardé vite fait ton projet . Tu y as mis 2 Timers alors que toi tu n'en as besoin que d'un seul : celui qui toutes les x secondes vérifie si la Textbox a changé . Moi j'ai du mettre un second Timer qui simule l'activité de ton programme externe .
Tant que tu n'auras pas répondu au point n° 2 avec clarté on ne pourra pas avancer .

Autre chose : dans ce message de l'an dernier :https://codes-sources.commentcamarche.net/forum/affich-10098438-treeview-et-namespace#3 on t' a déjà conseillé d'apprendre les bases de la programmation en VB Net . Les réponses que tu nous donnes me font penser que tu n'as guère travaillé sur le sujet .

Messages postés
16025
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 juin 2021
549
Bonsoir

Julia, tu te définis comme profane, mais il y a plus de 6 ans que tu postes des questions, parfois ardues et depuis plus de 6 ans on te dit de faire l'effort d'apprendre les bases.
En 6 ans, tu aurais pu devenir experte en VB.Net.
Ce n'est peut-être pas ton coeur de métier, ça on l'entend, c'est même peut-être une toute petite part de ton job.
Mais en 6 ans, tu n'as pas pris 5 jours pour suivre le cours de Plassere que l'on t'a conseillé plusieurs fois. (Aujourd'hui je conseille plutôt celui de tahé https://tahe.developpez.com/dotnet/vbnet/ mais bon l'un ou l'autre peu importe)

Ce fil tend à faire penser que tu n'as toujours pas fait cet effort et que la résolution de ton problème repose encore à 100% sur nous => ce n'est pas le rôle d'un forum de faire ton job pendant autant de temps.

Ce serait bien plus sympa pour nous de te voir évoluer, de n'avoir qu'à t'aiguiller.
Ce serait probablement pour toi une fierté de te sentir plus autonome, de résoudre presque seule, voire seule un certain nombre de problèmes.

Mais y'a pas 36 façons d'y arriver, il y a de nombreux concepts que tu n'as pas acquis ou compris.
Dans cette question https://codes-sources.commentcamarche.net/forum/affich-10103388-treeview-nodes-cle je me suis retrouvé littéralement dépité par une de tes réponses après que j'ai passé des heures à te construire des exemples (puis carrément une solution) et te les expliquer pour me rendre compte après 41 messages que tu n'avais toujours rien compris. Je suis loin d'être un bon prof, mais sur 40 messages quand même, il aurait du passer un peu d'informations quand même.

En ce qui me concerne, je ne vais pas m'impliquer à nouveau si tu ne fais pas un minimum d'efforts de ton coté.

Quand j'étais petit, la mer Morte n'était que malade.
George Burns
Messages postés
493
Date d'inscription
jeudi 27 mars 2014
Statut
Membre
Dernière intervention
26 décembre 2020

Bonjour messieurs
j'ai réussi avec une méthode un peu détournée à obtenir ce que je voulais .
Cela ne vaut pas votre expertise mais ça marche .Enfin après plusieurs essais
Public Class Form1
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        valeurcont.Text = 1
        Timer1.Start() ' ne sert qu'a simuler le textbox issu de l'autre programme dont je n'ai pas la main
        Timer2.Start() 
    End Sub

    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
        valeurcont.Text = valeurcont.Text + 1
    End Sub

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        Timer1.Stop()
    End Sub

    Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
        Timer2.Start()
    End Sub

    Private Sub Timer2_Tick(sender As Object, e As EventArgs) Handles Timer2.Tick
        ListBoxpause.Items.Add(valeurcont.Text)

        If ListBoxpause.Items.Count > 0 Then
            TextBox21.Text = ListBoxpause.Items(ListBoxpause.Items.Count - 1).ToString()
            ListBoxpause.SelectedIndex = ListBoxpause.Items.Count - 1
            TextBox3.Text = ListBoxpause.SelectedIndex
            Try
                TextBox20.Text = ListBoxpause.Items(ListBoxpause.SelectedIndex - 1).ToString()
            Catch
            End Try

            Select Case (String.Compare(TextBox21.Text, TextBox20.Text))
                Case < 0
                    TextBox22.Text = "NOT PAUSE"
                Case = 0
                    TextBox22.Text = "PAUSE"

                Case > 0
                    TextBox22.Text = "NOT PAUSE"
            End Select
        End If
    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Timer1.Start()
    End Sub

    Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
        Timer2.Stop()
    End Sub
End Class


Cordialement

Bonnes fêtes à vous
Messages postés
2429
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
1 juin 2021
137
Merci
bonnes fêtes à vous aussi !
Messages postés
16025
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 juin 2021
549
Bonsoir

2 constats
  • tu as bidouillé à partir de ce que t'as proposé VB, mais apparement sans retenir le concept de base
  • alors que ce qu'il t'a proposé est trop compliqué par rapport à ce que tu as demandé, tu as fait encore plus compliqué


Ce qui amène une cascade de questions
  • as tu compris le code de VB?
    • Non? => le manque de base.....
    • Oui?
      • as tu exprimé tout ton besoin?
      • as tu conscience que la principale faiblesse de ce code pourrait t'afficher un faux résultat?

Messages postés
2429
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
1 juin 2021
137
Salut Whis
On en revient à l'éternel constat que les bases sont primordiales dans toute matière quelle qu'elle soit !
Surtout de plus qu'elle n'a nullement répondu au point 2 de mon message n° 13 .