cs_zakaria616
Messages postés7Date d'inscriptionmercredi 27 décembre 2006StatutMembreDernière intervention10 juin 2008
-
10 mai 2008 à 03:04
cs_zakaria616
Messages postés7Date d'inscriptionmercredi 27 décembre 2006StatutMembreDernière intervention10 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" & 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.
mortalino
Messages postés6786Date d'inscriptionvendredi 16 décembre 2005StatutMembreDernière intervention21 décembre 201118 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 )
cs_zakaria616
Messages postés7Date d'inscriptionmercredi 27 décembre 2006StatutMembreDernière intervention10 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