IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB 6 et antérieur Discussion :

problème avec le contrôle timer.


Sujet :

VB 6 et antérieur

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Inscrit en
    Mai 2008
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 8
    Par défaut problème avec le contrôle timer.
    Bonjour,
    je bosse sur un programme en VB6 qui permet d'importer une feuille Excel dans une MSFlexgrid.
    la feuille contient 2 colonnes, numéro de téléphone et message
    quand la feuille est importé, une troisième colonne est ajouté, cette dernière contient des cases à cocher..
    alors normalement le but c'est d'envoyer tout les message cochés(SMS).
    Pour ce faire, j'utilise un Modem GSM..donc le contrôle MScomm.

    La partie qui me cause problème c'est la partie avec le contrôle Timer.
    en fait en cliquant sur le bouton Envoyer, un Timer se déclenche, et à chaque top du Timer, on teste si le modem a répondu la bonne réponse puis on continue...sinon c pas la peine.

    J'ai testé quand je coche un seule message, ça marche très bien.
    Le problème c'est quand plusieurs message sont cochés..
    voilà, le bouton envoyer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Private Sub Envoyer_Click()
    Timer2.Interval = 150 'déclenchement du Timer
    IntEtp_Seq = 0 'Contient l'étape de séquencement pour le dialogue entre PC et MODEM [Utilsé dans un Select Case]
    End Sub
    code du Timer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
     
    Private Sub Timer2_Timer()
    Dim x As Integer                  'Compteur à utiliser avec FOR       
    Dim ligne As Integer              'Ligne cochée
    Dim lignes As Integer             'Nombres de lignes à traiter
    Dim a_envoyer() As Integer    
    Dim CRow                             'Ligne courante
     
    lignes = grille.Rows - 1
    ReDim a_envoyer(lignes) As Integer
     
        With grille
            For CRow = 1 To .Rows - 1
                .Col = 2
                .Row = CRow
                If .Text = Chr(Checked) Then a_envoyer(CRow) = .Row     'Détection des Lignes cochés
            Next CRow
        End With
     
    For x = 1 To lignes
     
        If a_envoyer(x) <> 0 Then
        ligne = a_envoyer(x)
     
    Select Case IntEtp_Seq
    Case 0
            Text2.Text = ""
            ModemGSM.Output = "AT" & Chr$(13)
            IntEtp_Seq = 1
            Timer2.Interval = 150
    Case 1
     
                 If UCase$(Text2.Text) = "AT" & Chr$(13) & Chr$(13) & Chr$(10) & "OK" & Chr$(13) & Chr$(10) Then 'Vérifie que le modem a répondu OK
                    Text2.Text = ""
                    IntEtp_Seq = 2
                 Else: LngMess = MsgBox("Communication avec le terminal Impossible ! Revérifiez les branchements du modem et sa configuration :" & vbCrLf & "- Numéro de port COM saisit dans le fichier CONFIG.ini" & vbCrLf & "- Paramètres de l'objet MsComm dns le Form Load de l'application : vitesse, bits de parité, etc." & vbCrLf & vbCrLf & "Si vous avez des doutes, vérifier en premier lieu l'existance d'un dialogue entre votre modem GSM et votre PC depuis l'Hyperterminal de WINDOWS.", vbCritical, "Erreur: Dialogue IMPOSSIBLE...")
                      If (LngMess = vbOK) Then
                          IntEtp_Seq = -1
                      End If
                 End If
     
     
    Case 2
     
            Text2.Text = ""
            ModemGSM.Output = "AT+CMGF=1" & Chr$(13)
            IntEtp_Seq = 3
     
    Case 3
     
            Text2.Text = ""
            ModemGSM.Output = "at+cmgs=" & Chr$(34) & "+212" & Right(grille.TextMatrix(ligne, 0), 8) & Chr$(34) & Chr$(13)
            IntEtp_Seq = 4
     
    Case 4
     
            If UCase$(Text2.Text) = "AT+CMGS=" & Chr$(34) & "+212" & Right(grille.TextMatrix(ligne, 0), 8) & Chr$(34) & Chr$(13) & Chr$(13) & Chr$(10) & "> " Then
            Text2.Text = ""
            IntEtp_Seq = 5
            End If
     
    Case 5
     
            Text2.Text = ""
            ModemGSM.Output = grille.TextMatrix(ligne, 1) & Chr$(26)
            IntEtp_Seq = 6
    Case 6
            IntEtp_Seq = -1 'Termine l'envoi du SMS en bloquant le séquencement (Select Case)
            MsgBox ("message envoyé avec succés")
     
    End Select
    End If
    Next x
    End If
    End Sub
    Je fais un tableau a_envoyer(), qui contient les numéros de lignes des messages à envoyer...donc une ligne coché c'est a_envoyer(x)=ligne, sinon c'est a_envoyer(x)=0
    On doit envoyer alors touts les messages qui ont a_envoyer(x)<>0
    pour cela je fait une boucle FOR-NEXT
    Mais apparemment ça marche pas! parce que(à mon avis) tout le code contenu dans le Timer s'exécute à chaque Top Timer, y compris la boucle! qui se ré-exécute avant que le 1er message n'est envoyé, et c ça qui cause le problème !

    N.B: Quand je coche une seule ligne, la procédure passe quand même..!! et c'est ce que j'arrive pas à comprendre!

    J'espère que vous avez compris mon problème..
    Je serai très reconnaissant si vous m'aidez.
    Merci.

  2. #2
    Expert confirmé
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 132
    Par défaut
    Toutes declarations de variables dans une procedure sont réinitialisées à Null lors de l'entrée dans la dite procedure.
    Comme Timer2.Interval = 150, ta variable a_envoyer(x)=, X etant declaré dans la procedure Timer2_Timer() X est remis a zero toutes les 150 mS.

    Fais la delaration des variables en debut du Form (apres Option Explicit, avant toute autre code de procedure ou fonction)
    :whistle:pourquoi pas, pour remercier, un :plusser: pour celui/ceux qui vous ont dépannés.
    saut de ligne
    OOOOOOOOO👉 → → Ma page perso sur DVP ← ← 👈

  3. #3
    Membre du Club
    Inscrit en
    Mai 2008
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 8
    Par défaut
    Merci ProgElecT pour votre réponse..
    Mais ça résout pas mon problème.
    c'est toujours pareil.. quand je sélectionne plusieurs lignes..le programme s'arrête dans le case 1 sur LngMess = MsgBox("Communication avec le terminal Impossibl...")
    je pense je dois pas mettre tout ce code dans le timer! qu'en pensez vous?

  4. #4
    Expert éminent


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Par défaut
    Il te faut revoir l'architecture de ton code... ta boucle est mal placé ...tu ne dois pas pouvoir envoyer simultanément plusieurs SMS... attends que l'envoi de sms en cours soit terminé avant d'en envoyer un autre ..

  5. #5
    Expert confirmé
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 132
    Par défaut
    Sans analyse avec toute la precision, il me semble que tu devrais essayer comme sa
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    Private Sub Form_Load()
    Timer2.Enabled = False 'Arret du timer si non fait en desing
    Timer2.Interval = 150 'Initialise la frequence de bouclage de l'evenement Timer2_Timer()
    End Sub
     
    Private Sub Envoyer_Click()
    lignes = grille.Rows - 1
    ReDim a_envoyer(lignes) As Integer
         With grille
            For CRow = 1 To .Rows - 1
                .Col = 2
                .Row = CRow
                If .Text = Chr(Checked) Then a_envoyer(CRow) = .Row     'Détection des Lignes cochés
            Next CRow
        End With
    IntEtp_Seq = 0 'Contient l'étape de séquencement pour le dialogue entre PC et MODEM [Utilsé dans un Select Case]
    Timer2.Enabled = True ' lance la procedure Timer2_Timer()
    End Sub
    Dans Timer2_Timer() a la ligne Case 6
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Case 6
            Timer2.Enabled = False ' arret du bouclage <---------- Ajouter
    	IntEtp_Seq = -1 'Termine l'envoi du SMS en bloquant le séquencement (Select Case)
            MsgBox ("message envoyé avec succés")
    Bien sur dans cette procedure enlever ce qui à ete transferer dans la procedure Envoyer_Click()

    Une autre chose qui me trouble un peu, la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If UCase$(Text2.Text) = "AT" & Chr$(13) & Chr$(13) & Chr$(10) & "OK" & Chr$(13) & Chr$(10) Then 'Vérifie que le modem a répondu OK
    Transformée, mais equivalante (vbCrLf = Chr$(13)+Chr$(10))
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If UCase$(Text2.Text) = "AT" & Chr$(13) & vbCrLf & "OK" & vbCrLf Then 'Vérifie que le modem a répondu OK
    n'y a t il pas un Chr$(13) de trop ?, mais tu connais mieux le dialogue des trames a envoyer et recevoir.
    :whistle:pourquoi pas, pour remercier, un :plusser: pour celui/ceux qui vous ont dépannés.
    saut de ligne
    OOOOOOOOO👉 → → Ma page perso sur DVP ← ← 👈

  6. #6
    Expert confirmé
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 132
    Par défaut
    Houla ......
    Je viens de créer un projet avec tes éléments, comme le signal bbil(salut), il y a du boulot, toute la chronologie est à revoir, certaines conditions sont bloquantes (boucle infini) d'autres risquent de ne jamais être positives(temps de reponse du modem 150mS), et de fait passe a la commande suivant le Else.

    Je ne sais pas comment te venir en aide sans tout réécrire, essai de te faire un algo, réécris un bout de code et reviens nous le proposé (l'algo et le code).
    Bon courrage
    A+
    :whistle:pourquoi pas, pour remercier, un :plusser: pour celui/ceux qui vous ont dépannés.
    saut de ligne
    OOOOOOOOO👉 → → Ma page perso sur DVP ← ← 👈

  7. #7
    Membre du Club
    Inscrit en
    Mai 2008
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 8
    Par défaut
    Merci à vous...c vrais mon code n'est pas très structuré! Mais j'ai eu une autre idée(que ça marche pas aussi) pour éviter de passer par le Timer qui me fait problème. j'ai pensé à utiliser l'API Sleep.. pour laisser au modem un pe de temp pour répendre.
    Qu'en pensez vous de ce code? :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Option Explicit
    Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    Private Sub Envoyer_Click()
     
    lignes = grille.Rows - 1
    ReDim a_envoyer(lignes) As Integer
     
        With grille
            For CRow = 1 To .Rows - 1
                .Col = 2
                .Row = CRow
                If .Text = Chr(Checked) Then a_envoyer(CRow) = .Row
            Next CRow
        End With
     
    For x = 1 To lignes
     
    If a_envoyer(x) <> 0 Then
    ligne = a_envoyer(x)
     
    '1ère étape : Teste du modem.
    Text2.Text = ""
     
    ModemGSM.Output = "AT" & Chr$(13)
    Sleep 150 'je veux just attendre le temps pour que le modem répend!
     
    If UCase$(Text2.Text) = "AT" & Chr$(13) & vbCrLf & "OK" & vbCrLf Then 'Vérifie que le modem a répondu OK
        Sleep 150
     
    Else
        LngMess = MsgBox("Communication avec le terminal Impossible ! Revérifiez les branchements du modem et sa configuration :" & vbCrLf & "- Numéro de port COM saisit dans le fichier CONFIG.ini" & vbCrLf & "- Paramètres de l'objet MsComm dns le Form Load de l'application : vitesse, bits de parité, etc." & vbCrLf & vbCrLf & "Si vous avez des doutes, vérifier en premier lieu l'existance d'un dialogue entre votre modem GSM et votre PC depuis l'Hyperterminal de WINDOWS.", vbCritical, "Erreur: Dialogue IMPOSSIBLE...")
            If (LngMess = vbOK) Then
            Text2.Text = ""
            ModemGSM.InBufferCount = 0
            Exit Sub
            End If
    End If
     
    '2ème étape : appliquer le format TEXT au message(AT+CMGF=1)
     
    Text2.Text = ""
    ModemGSM.Output = "AT+CMGF=1" & Chr$(13)
    Sleep 150
     
    '3ème étape : entrer le numéro destinataire
     
    Text2.Text = ""
    ModemGSM.Output = "at+cmgs=" & Chr$(34) & "+212" & Right(grille.TextMatrix(ligne, 0), 8) & Chr$(34) & Chr$(13)
    Sleep 150
     
    '4ème étape : test de la réponse du modem, on doit recevoir le caractère ">"
     
    If UCase$(Text2.Text) = "AT+CMGS=" & Chr$(34) & "+212" & Right(grille.TextMatrix(ligne, 0), 8) & Chr$(34) & Chr$(13) & vbCrLf & "> " Then
        Sleep 150
        Else
        MsgBox "Le modeme n'a pas renvoyé le caractère > je peux pas continuer"
        Exit Sub
    End If
     
    '5ème étape : on transmet le message à envoyer au modem et on valide par un CTRL+Z qui est équivalent à Chr$(26)
     
    Text2.Text = ""
    ModemGSM.Output = grille.TextMatrix(ligne, 1) & Chr$(26)
    Sleep 150
     
    '6ème étape : OK, message envoyé ;)
     
    MsgBox ("message envoyé avec succés")
    End If
    Next x
     
    End Sub
    N.B: cela ne marche ni quand je sélectionne un seul message, ni quand je sélectionne plusieurs!!! je voulais juste avoir votre avis sur Sleep.. et vous demander si ya moyen pour faire attendre un peu sans le Timer?!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème avec de multiple timer
    Par FreudDu31 dans le forum VB.NET
    Réponses: 6
    Dernier message: 11/10/2009, 12h35
  2. Problème avec listener contrôl
    Par olikhvar dans le forum JDBC
    Réponses: 1
    Dernier message: 22/12/2008, 15h03
  3. problème avec le contrôle menu
    Par lesultan2007 dans le forum ASP.NET
    Réponses: 0
    Dernier message: 06/11/2008, 12h25
  4. Etat - problème avec des contrôles vides
    Par ver_for dans le forum IHM
    Réponses: 2
    Dernier message: 17/09/2008, 15h55
  5. Problème avec le contrôle Datetime de wss
    Par mimosa803 dans le forum SharePoint
    Réponses: 0
    Dernier message: 16/04/2008, 11h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo