Problème avec le contrôle Timer.

cs_zakaria616 Messages postés 7 Date d'inscription mercredi 27 décembre 2006 Statut Membre Dernière intervention 10 juin 2008 - 10 mai 2008 à 03:04
cs_zakaria616 Messages postés 7 Date d'inscription mercredi 27 décembre 2006 Statut Membre Dernière intervention 10 juin 2008 - 10 mai 2008 à 19:44
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 :
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 :
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" &amp; Chr$(13)
        IntEtp_Seq = 1
        Timer2.Interval = 150
Case 1

             If UCase$(Text2.Text) = "AT" &amp; Chr$(13) &amp; Chr$(13) &amp; Chr$(10) &amp; "OK" &amp; Chr$(13) &amp; 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 :" &amp; vbCrLf &amp; "- Numéro de port COM saisit dans le fichier CONFIG.ini" &amp; vbCrLf &amp; "- Paramètres de l'objet MsComm dns le Form Load de l'application : vitesse, bits de parité, etc." &amp; vbCrLf &amp; vbCrLf &amp; "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" &amp; Chr$(13)
        IntEtp_Seq = 3
      
Case 3
    
        Text2.Text = ""
        ModemGSM.Output = "at+cmgs=" &amp; Chr$(34) &amp; "+212" &amp; Right(grille.TextMatrix(ligne, 0), 8) &amp; Chr$(34) &amp; Chr$(13)
        IntEtp_Seq = 4

Case 4

        If UCase$(Text2.Text) = "AT+CMGS=" &amp; Chr$(34) &amp; "+212" &amp; Right(grille.TextMatrix(ligne, 0), 8) &amp; Chr$(34) &amp; Chr$(13) &amp; Chr$(13) &amp; Chr$(10) &amp; "> " Then
        Text2.Text = ""
        IntEtp_Seq = 5
        End If

Case 5
       
        Text2.Text = ""
        ModemGSM.Output = grille.TextMatrix(ligne, 1) &amp; 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 réponses

mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
10 mai 2008 à 03:17
Salut,

je ne sais pas si cela peut être en adéquation avec ton application, mais je pense que cela pourrait être pas mal :

Tu crées une classe 'clsSendMessage', avec ta procédure d'envoi. Il suffit de lui passer les propriétés voulues.
Ton timer (en passant par l'API Timer), pourrait se déclencher lors de l'envoi, et se termine à l'évènement Terminate de cette classe. Du coup, depuis ta Form, après l'envoi (fonction de ta classe), tu détruits l'objet typé en tant que 'clsSendMessage' (azvec Nothing) et ton timer s'arrêtera. En plus en objet (donc avec des Modules de Classes), c'est bien plus pratique.
Pis il te suffit de déclarer un nouvel objet pour chaque envoi

Sinon, pour ton code actuel, le but avec ton timer, serait de traiter la premiere partie (avant ton For To Next), ensuite appeler une procédure, celle ci arreterai le Timer, puis tu traites tes conditions avec Select Case.
A toi de passer les bonnes variables accessibles au projet (de sûr, a_envoyer() As Integer)

@++
___________________________________
( Forum exclusivement Office & VBA )
0
cs_zakaria616 Messages postés 7 Date d'inscription mercredi 27 décembre 2006 Statut Membre Dernière intervention 10 juin 2008
10 mai 2008 à 19:44
Merci bcp pour votre réponse mortalino
ça semble trés interressant ce que vous dites, et professionnel en plus.. mais je suis plus ou moin débutant avec VB...
Pouvez vous  m'éclaircir plus en me donnant un exemple de classe.
Merci
0
Rejoignez-nous