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

VBA Access Discussion :

Visual Basic 6.3, balance Mettler Toledo 8217 sur port COMM


Sujet :

VBA Access

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 188
    Points : 98
    Points
    98
    Par défaut Visual Basic 6.3, balance Mettler Toledo 8217 sur port COMM
    Bonjour.

    Je souhaite écrire vers et, en réponse, lire depuis le port COMM et ce en VBA sous Access 2003.

    Voilà ce dont je dispose :
    Windows XP SP3,
    Access 2003,
    Visual Basic 6.3 (que j'ouvre depuis Access en cliquant sur l'icône "Code"),
    Balance Mettler Toledo 8217.
    Rien d'autre.

    Je n'ai donc pas Visual Studio 6, ou quoi que ce soit d'autre qui comprendrait des fonctions trucs, ou des API machins…


    La balance :
    Si vous êtes tentés de faire des recherches sur cette balance, vous risquez, comme moi, de trouver des tonnes de réponses.

    Mais attention, 8217 est aussi devenu un protocole de communication pour les balances Mettler Toledo qui ont suivi (Viva, Diva, XRV…).

    Et sur ces balances plus récentes, il est possible de paramétrer tout un tas de… paramètres pour qu'elles se comportent comme une 8217.

    Ma balance est une 8217 "originelle", avec très peu de paramétrages.

    Mais du coup, je pense que la solution valable pour ma balance sera aussi utilisable sur bon nombre de balances Mettler Toledo.


    Connexion :
    J'ai enfin réussi à configurer un câble NullModem conforme au mode d'emploi de la balance.

    Dans mon cas, RxD, TxD, SGnd, c'est tout !


    Dialogue :
    The host computer must send requests to the scale as specified single uppercase ASCII characters to have it perform various functions.
    The scale will send a response back to the host computer as a string of ASCII numeric digits or as an ASCII ? followed by a status byte.
    There must be at least a 200-ms delay between commands to allow for processing data response time at the scale.

    sTx indicates the ASCII Start-Of-Text character (decimal 2).
    cr indicates the ASCII carriage return character (decimal 13).
    Commande envoyée
    Réponse de la balance
    Description

    W
    sTx WW.WWcr Gross Weight Pounds.
    sTx WW.WWWcr Gross Weight KG.
    sTx WW.WWNcr Net Weight Pounds. ASCII N added after weight.
    sTx WW.WWWNcr Net Weight KG. ASCII N added after weight.
    sTx?status byte cr Status byte is sent if scale is in motion, or is net/gross weight is negative or over
    Instructs scale to send weight data. (W=Weight Digit 0-9). The scale will respond as follows according to setup and status:

    Z
    sTx?status byte cr
    Zero scale command. On the next A/D reading, zero will be captured if the weight is stable, within capture range, and no tare is taken (gross weight mode.)

    T cr
    sTx?status byte cr
    Tare item on platter command. The scale must be at gross zero before placing the item on the platter. Tare will be taken if weight is stable and non-zero. After 150 millisecond delay, the scale will respond with a status byte.

    TWWWWWcr
    sTx?status byte cr
    Digital Tare Command. Known tare value can be sent to scale and must be transmitted as five digits. The scale assumes a decimal point of WWW.WW LB, or WW.WWW KG.

    C
    sTx?status byte cr
    Clear Tare Command (ignored if weight is not stable.) Scale status byte is sent after 150 ms delay.

    A
    sTx cr
    Initiate Confidence Test Command. sTx crR are sent indicating command was received.

    B
    sTx?status byte cr
    Send Confidence Test Results Command. A must be sent prior to the Send Result command B. Results of the test are contained in a status byte. Use Table 12-c to determine test results. If all tests passed, the ASCII @ character will be returned.

    E
    sTxEcr
    Start Echo Mode Serial Port Test Command. Scale will respond with an E indicating command received. Characters except F will be echoed back to the host.

    F
    sTxF
    End Echo Mode Command. The scale will respond with an ASCII F indicating the command was received.


    Traduction :
    On envoi une lettre en majuscule et la balance répond avec un poids, un poids suivi d'une lettre, une lettre ou un ?


    Test :
    J'ai pu tester mon câble et le dialogue avec la balance en suivant ce tuto extrêmement clair :
    Comment facilement tester la communication du port série COMM grâce à l'Hyperterminal :
    http://intermec.custhelp.com/app/ans...rt-of-my-pc%3F

    Où se trouve l'HyperTerminal :


    Recherches précédentes :
    Avec l'aide d'Argironet, que je remercie encore, j'ai commencé mes recherches pour trouver une solution de code en VBA.

    Vous pouvez retrouver l'intégralité de nos échanges ici :
    http://www.developpez.net/forums/d14...m/#post8063676

    J'ai pu écarter MSCOMM que je n'ai pas et, de plus, je n'ai pas besoin d'attendre un événement du port COMM, la balance n'envoi pas de données d'elle-même.
    Elle ne fait que répondre à une demande.

    J'ai aussi écarté le groupe http://support.microsoft.com/kb/463025/fr
    ReadComm
    WriteComm
    BuildCommDCB
    OpenComm
    SetCommState
    CloseComm
    Qui après m'avoir impressionné par sa complexité apparente, et m'avoir fait galerer pour le traduire, s'est avéré tout aussi non disponible chez moi.

    Enfin, j'ai renoncé à télécharger des API, et/ou des DLL qui ne soient pas de sources Microsoft, et qui ne posent pas de problème de licence.


    Je souhaite écrire vers et, en réponse, lire depuis le port COMM et ce en VBA sous Access 2003.
    C'est pas que je m'énerve, c'est que je rappelle le sujet de cette discussion, avec la même mise en forme que les chapitres précédents...


    D'avance merci.

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 188
    Points : 98
    Points
    98
    Par défaut
    Bonjour

    Voici le prochain truc que je vais essayer :
    http://www.control.com/thread/1240210560


    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
    Public Shared STX = Chr(2)' ascii start of text
    Public Shared CR = Chr(13) 'ascii Carriage Return
     
    Private Function get_lbs() As String
    Dim buffer As New StringBuilder()
    Dim comPort As New SerialPort("COM1", 9600, Parity.None, 8, StopBits.One)
     
    comPort.Open()
    comPort.Write(STX)
    mytimer(1)
    comPort.Write("P")
    mytimer(1)
    comPort.Write(CR)
    mytimer(1)
    Dim line As String = comPort.ReadExisting
    comPort.Close()
    Return isnum(Trim(line))
     
    End Function
    J'ai bien repéré où il faut indiquer la demande vers la balance.
    Mais je n'ai pas compris pourquoi cette demande se fait sur 3 lignes séparées par 2 timers…

    Pourquoi ne pas tout envoyer en même temps, du genre :

    Par ailleurs,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     comPort.Write(STX & "P" & CR)
    D'autre part, je ne vois pas comment lire la réponse de la balance.

    Du coup, je ne peux même pas tester l'envoi.

    Encore merci.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 188
    Points : 98
    Points
    98
    Par défaut
    Bonjour.

    Alors, ça ne marche pas non plus...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim comPort As New SerialPort("COM1", 9600, Parity.None, 8, StopBits.One)
    Return isnum(Trim(line))
    Sont en rouge.

    A priori, c'est parce que "SerialPort" n'est pas reconnu...

    J'ai lu des dizaines de pages et cherché presque dans tous les sens.

    J'ai trouvé énormément de choses sur VB.net. Mais visiblement, ce n'est pas transposable tel quel.

    J'ai aussi trouvé beaucoup sur Excel, mais là aussi, c'est toujours très formaté pour un usage sous Excel.

    Enfin, il existe beaucoup d'infos sur des solutions via Visual Basic, mais pas sur via VBA.

    J'ai trois options :
    - Télécharger de bibliothèques, des codes ou des utilitaires, sans pour autant être sur qu'ils fonctionneront
    - Me contenter de réponses du genre "je n'utilise pas VBA, mais ça, ce doit être à peu près la même chose"…
    - Finir par trouver un API que j'ai forcément, puisque l'HyperTerminal est capable de dialoguer avec la balance. Mais lesquelles et comment les intégrer au code…

    Encore merci.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 188
    Points : 98
    Points
    98
    Par défaut
    Bonjour et bonne Fêtes à toutes et à tous !

    Alors pour me donner suite, puisque personne ne m'aide (aime) et comme apparemment personne ne doit relier des appareils en port Comm à une base Access, je trouve les solutions ailleurs (c'est un conte de Noël, alors il faut que cela commence en étant larmoyant…).

    Mais comme c'est un conte de Noël, je vous en fait part aujourd'hui, alors que j'ai pu vérifier que ça marchait le 21 decembre au soir...

    J'ai donc trouvé ceci :
    http://dev.emcelettronica.com/serial...tion-excel-vba

    C'est un code développé pour être utilisé sous Excel, mais qui fonctionne sans rien changer sous Access.

    Il se compose d'une énorme tartine que je n'ai pas lue et que je pense il vaut mieux recopier tel quel dans un module (pas le module d'un formulaire ou d'un état, mais un module tout court, à la fin de Tables, requêtes, formulaires, macros, etc…).

    Attention, dans le code proposé, il y a deux erreurs (Je n'ai pas tout lu, c'est juste que les lignes apparaissent en rouge et qu'Access bute dessus lors de l'exécution) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If lngStatus  ERROR_IO_INCOMPLETE Then
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If lngStatus  ERROR_IO_INCOMPLETE Then
    Mon exceptionnelle maîtrise du code VBA m'a permit de déduire qu'il fallait en fait écrire, pour les deux lignes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If lngStatus = ERROR_IO_INCOMPLETE Then
    Ensuite, comme indiqué dans le lien, on crée un formulaire avec 4 boutons.

    Dans le code du formulaire, on recopie le code des 4 boutons.

    Dans la conception du lien, il y a un bouton et un code pour chaque action nécessaire à l'utilisation du port Comm.

    1 bouton/code pour initialiser et ouvrir le port Comm (c'est là que l'on rentre les paramètres du port)
    1 bouton/code pour écrire vers le port Comm
    1 bouton/code pour lire depuis le port Comm
    1 bouton/code pour fermer le port Comm

    Cela permet de voir clairement qui fait quoi, mais cela nécessite de déclarer les mêmes variables et de rentrer le N° de port Comm dans chaque code.

    Pour écrire vers Comm, le code est explicite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    strData = "*IDN?;"
    'Writa data
    lngStatus = CommWrite(intPortID, strData)
    Ici, on indique dans strData ce que l'on veut envoyer vers le port Comm
    L'exemple indique un texte bizarroïde, car la machine connectée à besoin de ce texte en particulier…

    Pour lire depuis Comm, le code est moins clair.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lngStatus = CommRead(intPortID, strData, 10)
    La variable qui revient du port Comm est aussi "strData" et rien ne semble prévu d'origine pour s'en servir.
    Vous pouvez l'afficher avec uneMessage Box :
    [CODE]MsgBox (strData)[CODE]
    Vous pouvez aussi la travailler pour la mettre en forme et supprimer les caractères inutiles… et copier sa valeur dans un champ, un contrôle ou une autre variable…

    Enfin, un volume considérable du code est consacré à la gestion d'erreur.
    lngStatus qui apparaît systématiquement est en fait une variable, dont la valeur est générée en fonction du comportement du port Comm.

    Si tout se passe bien, c'est classé sans suite, sinon, je suppose qu'il y a un message d'erreur…

    J'ai abandonné l'idée de simplifier le code en supprimant toute cette gestion d'erreur.

    Le système fonctionne tel quel, pas besoin d'ajouter ou de télécharger quoi que ce soit.

    Vous pouvez ne garder que ce que vous avez besoin des 4 boutons, par exemple que les commandes Initialiser, Ecrire et Fermer si vous n'avez pas besoin de Lire depuis le port Comm.

    Enfin, comme c'est le cas pour ma balance, il peut nécessiter un temps de traitement de la demande par le périphérique, temps pendant lequel il faut attendre avant de demander la réponse…

    Voioioilaaaaaaa !

    Encore merci.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 188
    Points : 98
    Points
    98
    Par défaut
    Re

    Je me suis permis un petit exemple, me concernant, pour ma balance.

    Pour rappel, on envoi une demande sous la forme d'une lettre.

    La balance réfléchit 200ms et répond avec un poids, suivi ou non d'une lettre.

    Si la balance est en mouvement (non stable) elle envoi une lettre.

    Si la balance a été tarée (on a posé un contenant et on demande à la balance de soustraire le poids du contenant) la balance répond aussi par une lettre.

    Mon système se comporte comme un afficheur externe et se compose d'un formulaire.

    - 1 Controle nommé Afficheur
    - 1 étiquette nommée AfficheMessage, dont le texte est une suite d'underscores (le tiret du 8 !)

    L'évènement "Sur minuterie" du formulaire sert de déclencheur
    La ligne en dessous, "Intervalle minuterie" est réglée à 333 ms, soit 3 fois par seconde.

    La balance répond, et le formulaire interprète la réponse et agit en conséquence :

    Ainsi, 3 fois par seconde, le formulaire demande le poids à la balance.

    Si la balance est en mouvement, l'afficheur se colore en rouge et le message "Balance non stabilisée" est affiché.

    Si la balance est stabilisée et que le poids est brut, l'afficheur se colore en bleu et le message "Poids Brut" est affiché.

    Si la balance est stabilisée et que le poids est négatif (tare disparue), l'afficheur se colore en rouge et le message "Balance stabilisée avec tare disparue" est affiché.

    D'autres cas intermédiaires sont prévus…

    La gestion des messages et des couleurs est confiée à une fonction à part.

    J'ai fusionné le code des 4 boutons, en supprimant les doublons.

    Le code du formulaire est le suivant :

    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
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
     'Procédure pour Balance Mettler Toledo 8217
    Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
     
     
     
    Private Sub Form_Timer()
    Call ScaleAll
    End Sub
     
     
     
    Private Sub ScaleAll()
        Dim intPortID As Integer 'Ex. 1, 2, 3, 4 for COM1 - COM4
        Dim lngStatus As Long 'Statut du port Comm pour gestion d'erreurs
        Dim strData As String 'Texte à envoyer et à lire
        Dim ScaleMessage As String 'Etat de la réponse dela balance
     
        'Initialisation et ouverture Port Comm
        intPortID = 2
        lngStatus = CommOpen(intPortID, "COM" & CStr(intPortID), _
        "baud=9600 parity=E data=7 stop=1")
     
        'Ecriture données vers Port Comm
        strData = "W"
        lngStatus = CommWrite(intPortID, strData)
     
        'Temps de réponse de la balance
        Call Sleep(225)
     
        'Lecture données reçues depuis Port Comm
        lngStatus = CommRead(intPortID, strData, 10)
     
        'Si réponse avec I, balance non stable
        If Mid(strData, 3, 1) = "I" Then
        'Affichage message non stable,
        'ScaleMessage = "I"
        StudyMessage ("I")
        'Afficheur à zéro
        Me!Afficheur.Value = "00,000"
     
        'Si réponse avec i, balance non stable avec tare
        ElseIf Mid(strData, 3, 1) = "i" Then
        'Affichage message balance non stable avec tare
        'ScaleMessage = "i"
        StudyMessage ("i")
        'Afficheur à zéro
        Me!Afficheur.Value = "00,000"
     
        'Si réponse avec T, balance stable, tare disparue
        ElseIf Mid(strData, 3, 1) = "t" Then
        'Affichage message non stable, balance stable, tare disparue
        'ScaleMessage = "t"
        StudyMessage ("t")
        'Afficheur à zéro
        Me!Afficheur.Value = "00,000"
     
        'Si poids suivi de N, poids = poids Net
        ElseIf Mid(strData, 8, 1) = "N" Then
        'Afficheur avec virgule
        Me!Afficheur.Value = (Mid(strData, 2, 2) & "," & Mid(strData, 5, 3))
        'Affichage message net
        'ScaleMessage = "N"
        StudyMessage ("N")
     
        'Pour les autres cas
        Else
        'Afficheur avec virgule
        Me!Afficheur.Value = (Mid(strData, 2, 2) & "," & Mid(strData, 5, 3))
        'Affichage message brut
        'ScaleMessage = "X"
        StudyMessage ("X")
        End If
     
        'Fermeture Port Comm
        Call CommClose(intPortID)
     
    End Sub
     
     
     
    Private Sub StudyMessage(ScaleMessage)
    'Mise en forme du formulaire en fonction de la réponse de la balance
     
    'Si pas stable = I
    If ScaleMessage = "I" Then
    'Fond Orange
    Me!Afficheur.BackColor = 52479 'Orange
    'message Non Stable On
    Me!AfficheMessage.BackColor = 52479 'Orange
    Me!AfficheMessage.Caption = "Balance non stabilisée"
     
    'Si pas stable avec tare = i
    ElseIf ScaleMessage = "i" Then
    'Fond Orange
    Me!Afficheur.BackColor = 52479 'Orange
    'message Non Stable On
    Me!AfficheMessage.BackColor = 52479 'Orange
    Me!AfficheMessage.Caption = "Balance non stabilisée avec tare"
     
    'Si pas stable avec tare disparue = t
    ElseIf ScaleMessage = "t" Then
    'Fond Rouge
    Me!Afficheur.BackColor = 255 'Rouge
    'message Tare disparue
    Me!AfficheMessage.BackColor = 255
    Me!AfficheMessage.Caption = "Balance stabilisée avec tare disparue"
     
    'Si stable net = N
    ElseIf ScaleMessage = "N" Then
    'Fond Vert
    Me!Afficheur.BackColor = 65280 'Vert
    'message Poids net
    Me!AfficheMessage.BackColor = 65280 'Vert
    Me!AfficheMessage.Caption = "Poids Net"
     
    'Les autres cas sont considérés comme des poids bruts
    ElseIf ScaleMessage = "X" Then
    'Fond Bleu
    Me!Afficheur.BackColor = 16776960 'Bleu
    'message Poids Brut
    Me!AfficheMessage.BackColor = 16776960 'Bleu
    Me!AfficheMessage.Caption = "Poids Brut"
     
    End If
    End Sub
    Bon, c'était juste un test…

    Ça m'a permis de découvrir certaines réponses de la balance qui ne figurent pas dans la notice.

    Par ailleurs, il est impératif de respecter le temps de traitement de la balance, car sinon, vous n'aurez votre réponse qu'une fois sur trois…

    Enfin, lorsque je quitte le formulaire, le code continu un boucle et du coup ne trouve pus les éléments à mettre en forme et bug…

    Il faudrait que je rajoute un ligne de vérification de formulaire chargé…

    Encore merci.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 188
    Points : 98
    Points
    98
    Par défaut
    Bonjour.

    Des nouvelles du front :

    Voilà les messages que j'ai pu recueillir de ma balance, grâce à une version très simplifiée du premier code.

    Je n'ai pas réussi à trouver un document listant de manière exhaustive les messages que la balance peut envoyer, alors je ne liste que ceux que j'ai réussi à générer et comment je les ai générés.

    La majorité ne figure pas dans la notice (j'ai indiqué en début de topic ceux qui étaient dispos…)

    __Réponse __ Balance
    tarée
    Tare
    présente
    Balance
    chargée
    Stable Affichage Commentaire
    ?M Non / Oui/Non Non Négatif Défaut de Zéro, en mouvement, chargée ou non, le poids ne permet pas de rattraper le zéro.
    ?D Non / Oui/Non Oui Négatif Défaut de zéro, stable, chargée ou non, le poids ne permet pas de rattraper le zéro.
    ?I Non / Oui Non Positif Balance non tarée en mouvement
    00.000 Non / Non Oui Positif La tare est présente, la balance stable, pas chargée.
    ?m Oui Non Oui/Non Non Négatif Balance tarée en mouvement, tare disparue.
    ?t Oui Non Non Oui Négatif La balance est tarée, stable, mais il n'y a plus de tare.
    ?d Oui Non Oui Oui Négatif Le poids présent, stable, ne permet pas de rattraper la tare absente.
    ?i Oui Oui Oui Non Positif Balance tarée en mouvement, tare présente.
    00.000N Oui Oui Non Oui Positif La tare est présente, la balance stable, pas chargée.
    00.005N Oui Oui Oui Oui Positif La tare est présente, la balance stable, charge présente.

    Du coup, j'ai modifié le code de test :

    En regroupant les réponses de mouvement, celles de défaut de zéro, les poids bruts et nets.

    J'ai ajouté quelques lignes pour que le code ne cherche plus des contrôles disparus suites à la fermeture du formulaire et pour fermer le port Comm en même temps que le formulaire.

    Enfin, j'ai ajouté un contrôle "Journal", dans lequel le code écrit le message de la balance quand il ne correspond à rien de recensé jusqu'à présent et me permet ainsi de le lire.

    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
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
     Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
     
    Private Sub Form_Open(Cancel As Integer)
    'A l'ouverture, on ouvre en grand
    DoCmd.Maximize
    'On positionne le curseur sur le contrôle Journal(pour éviter qu'il ne soit sur l'afficheur qui sera en noir du coup...)
    Me!Journal.SetFocus
    End Sub
     
    Private Sub Form_Close()
    'A la fermeture, on ferme aussi le port Comm
        Dim intPortID As Integer ' Ex. 1, 2, 3, 4 for COM1 - COM4
        intPortID = 2
        Call CommClose(intPortID)
    End Sub
     
    Private Sub Form_Timer()
    Call ScaleAll
    End Sub
     
    Private Sub ScaleAll()
        Dim intPortID As Integer 'Ex. 1, 2, 3, 4 for COM1 - COM4
        Dim lngStatus As Long 'Statut du port Comm pour gestion d'erreurs
        Dim strData As String 'Texte à envoyer et à lire
     
        'Initialisation et ouverture Port Comm
        intPortID = 2
        lngStatus = CommOpen(intPortID, "COM" & CStr(intPortID), _
        "baud=9600 parity=E data=7 stop=1")
     
        '######### Ecriture données vers Port Comm, ici on demande le poids
        strData = "W"
        lngStatus = CommWrite(intPortID, strData)
     
        '######### Temps de réponse de la balance
        Call Sleep(225)
     
        '######### Lecture données reçues depuis Port Comm
        lngStatus = CommRead(intPortID, strData, 10)
     
        'Vérifie si le formulaire est encore ouvert, sinon, on laisse tomber
        If CurrentProject.AllForms("New affichage").IsLoaded = False Then
        'On ferme quand même le port Comm
        Call CommClose(intPortID)
        Exit Sub
     
        'Si réponse avec d,D, balance considéré comme défaut de zéro
        ElseIf Mid(strData, 3, 1) = "d" _
        Or Mid(strData, 3, 1) = "D" Then
        'Afficheur sans chiffres
        Me!Afficheur.Value = "-0,-0-"
        'Affichage message non stable,
        StudyMessage ("DZ")
     
        'Si réponse avec M,I,m,i balance non stable
        ElseIf Mid(strData, 3, 1) = "I" _
        Or Mid(strData, 3, 1) = "i" _
        Or Mid(strData, 3, 1) = "M" _
        Or Mid(strData, 3, 1) = "m" Then
        'Afficheur sans chiffres
        Me!Afficheur.Value = "__,___"
        'Affichage message non stable,
        StudyMessage ("NS")
     
        'Si réponse avec t, balance stable, tare disparue
        ElseIf Mid(strData, 3, 1) = "t" Then
        'Afficheur exclamation
        Me!Afficheur.Value = "!!,!!!"
        'Affichage message non stable, balance stable, tare disparue
        StudyMessage ("TD")
     
        'Si poids présent mais pas suivi de N, poids = poids Brut
        ElseIf Mid(strData, 4, 1) = "." And Mid(strData, 8, 1) <> "N" Then
        'Afficheur poids avec virgule
        Me!Afficheur.Value = (Mid(strData, 2, 2) & "," & Mid(strData, 5, 3))
        'Affichage message net
        StudyMessage ("PB")
     
        'Si poids présent suivi de N, poids = poids Net
        ElseIf Mid(strData, 8, 1) = "N" Then
        'Afficheur avec virgule
        Me!Afficheur.Value = (Mid(strData, 2, 2) & "," & Mid(strData, 5, 3))
        'Affichage message net
        StudyMessage ("PN")
     
        'Dans tous les autres cas :
        Else
        'Afficheur avec points d'interrogation
        Me!Afficheur.Value = "??,???"
        'On écrit la réponse de la balancec dans le controle Journal
        Me!Journal.Value = strData
        'Affichage message autre cas
        StudyMessage ("X")
        End If
     
        '######### Fermeture Port Comm
        Call CommClose(intPortID)
     
    End Sub
     
    Private Sub StudyMessage(ScaleMessage)
    'Mise en forme du formulaire en fonction de la réponse de la balance
     
    'On vérifie si le formulaire est chargé, sinon on laisse tomber
    If CurrentProject.AllForms("New affichage").IsLoaded = False Then
    Exit Sub
     
    'Si considérée comme défaut de zéro = DZ
    ElseIf ScaleMessage = "DZ" Then
    'Fond Rouge
    Me!Afficheur.BackColor = 255 'Rouge
    'message Tare disparue
    Me!AfficheMessage.BackColor = 255
    Me!AfficheMessage.Caption = "Défaut de zéro"
     
    'Si pas stable = NS
    ElseIf ScaleMessage = "NS" Then
    'Fond Orange
    Me!Afficheur.BackColor = 52479 'Orange
    'message Non Stable On
    Me!AfficheMessage.BackColor = 52479 'Orange
    Me!AfficheMessage.Caption = "Balance non stabilisée"
     
    'Si pas stable avec tare disparue = TD
    ElseIf ScaleMessage = "TD" Then
    'Fond Rouge
    Me!Afficheur.BackColor = 255 'Rouge
    'message Tare disparue
    Me!AfficheMessage.BackColor = 255 'Rouge
    Me!AfficheMessage.Caption = "Balance stabilisée avec tare disparue"
     
    'Si stable brut = PB
    ElseIf ScaleMessage = "PB" Then
    'Fond Bleu
    Me!Afficheur.BackColor = 16776960 'Bleu
    'message Poids Brut
    Me!AfficheMessage.BackColor = 16776960 'Bleu
    Me!AfficheMessage.Caption = "Poids Brut"
     
    'Si stable net = PN
    ElseIf ScaleMessage = "PN" Then
    'Fond Vert
    Me!Afficheur.BackColor = 65280 'Vert
    'message Poids net
    Me!AfficheMessage.BackColor = 65280 'Vert
    Me!AfficheMessage.Caption = "Poids Net"
     
    'Dans tous les autres cas
    ElseIf ScaleMessage = "X" Then
    'Fond violet
    Me!Afficheur.BackColor = 16711935 'Violet
    'message Poids net
    Me!AfficheMessage.BackColor = 16711935 'Violet
    Me!AfficheMessage.Caption = "Non prévu"
    End If
    End Sub
    Il arrive encore que lors de la fermeture du formulaire, il traîne encore un morceau de code qui tourne et pointe vers un contrôle disparu puisque le formulaire est fermé.

    Quand ça arrive, vous êtes bon pour le débogage…

    Je ne sais pas pourquoi, en plus de boguer, le système est comme "cassé".

    Quand on ré-ouvre le formulaire, il ne bogue pas, mais n'affiche plus rien, ou des ???, sans message de la balance…

    Fermer le port Comm ne suffit pas, fermer la base non plus d'ailleurs…

    Il faut quitter Access pour rétablir la situation…

    Par ailleurs, j'aimerais que l'évènement qui tourne en boucle se fasse sur le contrôle afficheur, ou sur un contrôle temporaire plutôt que sur tout le formulaire.

    J'aimerais aussi sortir proprement de la boucle ouverture-question-réponse-affichage-fermeture.

    Par exemple, quand je fermerais le formulaire, il saurait qu'il doit faire une dernière boucle complète, mais pas en commencer une autre.

    Voilà.

    Encore merci.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 188
    Points : 98
    Points
    98
    Par défaut
    Bonjour.

    Bon, je continue tout seul.

    J'ai déplacé l'évènement, qui ne se produit plus sur tout le formulaire sur minuterie, mais sur ouverture du formulaire avec Loop.

    J'ai mis deux Boolean (Vrai/Faux) pour surveiller deux choses.

    La première, LoopOnBol, c'est que l'on accepte qu'à la fin d'une boucle de dialogue avec la balance (Initialisation, question, réponse, affichage, fermeture) le code lance une nouvelle boucle.

    La seconde, LoopAskBol, indique qu'une boucle de dialogue est en cours.

    L'objectif étant de combiner les deux pour que lors de la fermeture du formulaire, qui pour l'instant se fait grâce à un bouton dédié,
    - Le code attende que la boucle de dialogue soit menée à terme (donnée affichée et mise en forme)
    - Le code ne commence pas de nouvelle boucle de dialogue
    - Le code ferme le formulaire.

    Mener les boucles de dialogues jusqu'à leur terme permet de fermer le port Comm et d'éviter que le code ne demande où se trouve le contrôle dont il doit modifier la valeur ou la mise en forme, contrôle disparu puisque le formulaire est fermé.

    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
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
     
    Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
    Dim LoopOnBol As Boolean 'Prendra la valeur vrai ou faux, pour indiquer si la boucle
    'd'interrogation de balance doit être reconduite.
    Dim LoopAskBol As Boolean 'Prendra la valeur vrai ou faux, pour indiquer si une boucle
    'd'interrogation de balance est en cours.
     
    Private Sub Form_Open(Cancel As Integer)
    'A l'ouverture, on ouvre en grand
    DoCmd.Maximize
     
    'Bascule l"indicateur de boucle à vrai pour lancer la boucle de dialogue
    LoopOnBol = True
     
    'On positionne le curseur sur le controle Journal(pour éviter qu'il ne soit sur l'afficheur qui sera en noir du coup...)
    Me!Journal.SetFocus
     
    'Lance une boucle de dialogue tant que LoopOnBol est sur True, c'est à dire
    'tant qu'on veut que le dialogue soit en boucle.
    Do Until LoopOnBol = False
    Call ScaleAll
    Loop
     
    End Sub
     
    Private Sub BTN_CLS_FRM_Click()
    'Bascule l'indicateur de boucle à faux pour empecher de commencer une boucle supplémentaire
    LoopOnBol = False
     
    'On demande une pause d'1 miliseconde tant que LoopAskBol est sur True, c'est à dire qu'il y a une
    'boucle de dialogue en cours.
    Do Until LoopAskBol = False
    Sleep (10)
    Loop
     
    'Maintenant on peut fermer sans encombres
    DoCmd.Close
    End Sub
     
        Private Sub ScaleAll()
     
        Dim intPortID As Integer 'Ex. 1, 2, 3, 4 for COM1 - COM4
        Dim lngStatus As Long 'Statut du port Comm pour gestion d'erreurs
        Dim strData As String 'Texte à envoyer et à lire
     
        'On indique que l'on a démarré une boucle d'interrogation
        LoopAskBol = True
     
        'Initialisation et ouverture Port Comm
        intPortID = 2
        lngStatus = CommOpen(intPortID, "COM" & CStr(intPortID), _
        "baud=9600 parity=E data=7 stop=1")
     
        '######### Ecriture données vers Port Comm, ici on demande le poids
        strData = "W"
        lngStatus = CommWrite(intPortID, strData)
     
        '######### Temps de réponse de la balance
        Call Sleep(225)
     
        '######### Lecture données reçues depuis Port Comm
        lngStatus = CommRead(intPortID, strData, 10)
     
        'Si réponse avec d,D, balance considéré comme défaut de zéro
        If Mid(strData, 3, 1) = "d" _
        Or Mid(strData, 3, 1) = "D" Then
        'Afficheur sans chiffres
        Me!Afficheur.Value = "-0,-0-"
        'Affichage message non stable,
        StudyMessage ("DZ")
     
        'Si réponse avec M,I,m,i balance non stable
        ElseIf Mid(strData, 3, 1) = "I" _
        Or Mid(strData, 3, 1) = "i" _
        Or Mid(strData, 3, 1) = "M" _
        Or Mid(strData, 3, 1) = "m" Then
        'Afficheur sans chiffres
        Me!Afficheur.Value = "__,___"
        'Affichage message non stable,
        StudyMessage ("NS")
     
        'Si réponse avec t, balance stable, tare disparue
        ElseIf Mid(strData, 3, 1) = "t" Then
        'Afficheur exclamation
        Me!Afficheur.Value = "!!,!!!"
        'Affichage message non stable, balance stable, tare disparue
        StudyMessage ("TD")
     
        'Si poids présent mais pas suivi de N, poids = poids Brut
        ElseIf Mid(strData, 4, 1) = "." And Mid(strData, 8, 1) <> "N" Then
        'Afficheur poids avec virgule
        Me!Afficheur.Value = (Mid(strData, 2, 2) & "," & Mid(strData, 5, 3))
        'Affichage message net
        StudyMessage ("PB")
     
        'Si poids présent suivi de N, poids = poids Net
        ElseIf Mid(strData, 8, 1) = "N" Then
        'Afficheur avec virgule
        Me!Afficheur.Value = (Mid(strData, 2, 2) & "," & Mid(strData, 5, 3))
        'Affichage message net
        StudyMessage ("PN")
     
        'Dans tous les autres cas :
        Else
        'Afficheur avec points d'interrogation
        Me!Afficheur.Value = "??,???"
        'On écrit la réponse de la balancec dans le controle Journal
        Me!Journal.Value = strData
        'Affichage message autre cas
        StudyMessage ("X")
        End If
     
        '######### Fermeture Port Comm
        Call CommClose(intPortID)
     
        'On indique que l'on a terminé une boucle d'interrogation
        LoopAskBol = False
     
    End Sub
     
    Private Sub StudyMessage(ScaleMessage)
    'Mise en forme du formulaire en fonction de la réponse de la balance
     
    'Si considérée comme défaut de zéro = DZ
    If ScaleMessage = "DZ" Then
    'Fond Rouge
    Me!Afficheur.BackColor = 255 'Rouge
    'message Tare disparue
    Me!AfficheMessage.BackColor = 255
    Me!AfficheMessage.Caption = "Défaut de zéro"
     
    'Si pas stable = NS
    ElseIf ScaleMessage = "NS" Then
    'Fond Orange
    Me!Afficheur.BackColor = 52479 'Orange
    'message Non Stable On
    Me!AfficheMessage.BackColor = 52479 'Orange
    Me!AfficheMessage.Caption = "Balance non stabilisée"
     
    'Si pas stable avec tare disparue = TD
    ElseIf ScaleMessage = "TD" Then
    'Fond Rouge
    Me!Afficheur.BackColor = 255 'Rouge
    'message Tare disparue
    Me!AfficheMessage.BackColor = 255 'Rouge
    Me!AfficheMessage.Caption = "Balance stabilisée avec tare disparue"
     
    'Si stable brut = PB
    ElseIf ScaleMessage = "PB" Then
    'Fond Bleu
    Me!Afficheur.BackColor = 16776960 'Bleu
    'message Poids Brut
    Me!AfficheMessage.BackColor = 16776960 'Bleu
    Me!AfficheMessage.Caption = "Poids Brut"
     
    'Si stable net = PN
    ElseIf ScaleMessage = "PN" Then
    'Fond Vert
    Me!Afficheur.BackColor = 65280 'Vert
    'message Poids net
    Me!AfficheMessage.BackColor = 65280 'Vert
    Me!AfficheMessage.Caption = "Poids Net"
     
    'Dans tous les autres cas
    ElseIf ScaleMessage = "X" Then
    'Fond violet
    Me!Afficheur.BackColor = 16711935 'Violet
    'message Poids net
    Me!AfficheMessage.BackColor = 16711935 'Violet
    Me!AfficheMessage.Caption = "Non prévu"
    End If
     
    End Sub
    Malheureusement, ça ne marche pas.

    J'ai pu tester séparément les composants :

    ScaleAll () qui gère le dialogue et StudyMessage () sont opérationnels.

    Form_Open aussi et quand LoopOnBol est basculé à False, il arrête de lancer ScaleAll.

    Mais je crois avoir détecté que LoopAskBol ne bascule jamais à False, car quand je clique sur mon bouton fermer, les boucles s'arrêtent, mais le formulaire ne se ferme pas.

    Je pense qu'il attend le basculement LoopAskBol.

    Et je suis obligé de fermer à l'arrache…

    L'idéal serait quand même que le système puisse se fermer soit avec un bouton dédié, soit sur l'évènement fermeture du formulaire…

    Un petit coup de main peut-être ?

    D'avance merci.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 188
    Points : 98
    Points
    98
    Par défaut
    Bonsoir.

    Donc, comme moi qui ai fait mes premiers pas en dialogue avec le port Comm grâce à l'Hyperterminal, d'autres personnes pourraient être intéressées...

    Alors, je le mets de façon pérenne ici (mais en rendant à Cesar, patati patata…)

    Où se trouve l'HyperTerminal :

    Salut,

    Cela fait environ 3-4 mois que la question à été posé, mais je viens le même problème et j'ai une solution, il faut récupéré les 4 fichier suivant HYPERTRM.DL_, HYPERTRM.EX_, HYPERTRM.HL_ et HYPERTRM.CH_ du CD de Windows XP dans un répertoire sur votre disque dur et les décompressé avec expand sous dos (ligne de command) comme suivant

    expand HYPERTRM.DL_ HYPERTRM.DLL
    expand HYPERTRM.EX_ HYPERTRM.EXE
    expand HYPERTRM.HL_ HYPERTRM.HLP
    expand HYPERTRM.CH_ HYPERTRM.CHM

    et puis on lance HYPERTRM.EXE et voila HyperTerminal.
    Moi j'ai fait comme cela et effectivement, ça marche.

    En suivant ce tuto que je re-site : http://intermec.custhelp.com/app/ans...rt-of-my-pc%3F ça m'a permis de tester mon câble et ma communication avec la balance, y compris quand le code sous VBA fesait des siennes…

    Encore merci.

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 188
    Points : 98
    Points
    98
    Par défaut
    Bonjour.

    Meilleurs vœux à toutes et à tous.

    Alors, là, je suis complètement coincé.

    J'ai essayé d'optimiser le rendu, mais plus rien ne marche…

    Voilà quel est le cahier des charges :

    - Un fonction interroge la balance. Cette fonction doit attendre 225ms entre le moment où la question est envoyée au port Comm et le moment où la réponse est lue sur ce même port (sinon, la réponse est vide…)

    - Si on se contente de d'afficher la réponse dès qu'elle est disponible sur le port Comm, on peut compter l'afficher tous les 230 ms, soit un peu plus de 4 fois par seconde. La conséquence, c'est que l'affichage clignote !
    Du coup, il faut augmenter la cadence d'affichage.

    - C'est pourquoi chaque fois que la réponse est lue sur le port Comm (4 fois par seconde), elle est recopiée dans une variable.

    - Une autre fonction en boucle, non limitée en temps, recopie, analyse et met en forme cette réponse pour l'afficher. Le rafraîchissement s e fait aussi vite que le code s'exécute, sans clignotement.

    - Mais pour opérer correctement, il faut que les contrôles utilisés pour l'affichage soient dispo, et donc le formulaire ouvert.
    Hors, au moment de fermer, si aucune précaution n'est prise, le formulaire est fermé et le code qui se termine ne trouve pas les contrôles : c'est le plantage.

    - C'est pourquoi la commande "fermer" devrait permettre d'envoyer un signal pour empêcher la boucle d'interrogation des la balance et la boucle d'affichage du résultat de redémarrer une fois qu'elles sont à leurs termes.
    Cette même commande devrait attendre que les deux boucles soient terminées avant de fermer le formulaire.

    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
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
     
    Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
     
    '################################################################"
     
    Dim LoopOnBol As Boolean 'Prendra la valeur vrai ou faux, pour indiquer si la boucle
    'd'interrogation de balance doit être reconduite.
    Dim ScaleDialogueBol As Boolean 'Prendra la valeur vrai ou faux, pour indiquer si une boucle
    'd'interrogation de balance est en cours.
    Dim DisplayResultBol As Boolean 'Prendra la vealeur vrai ou faux, pour indiquer si une boucle
    'd'affichage est en cours
    Dim ScaleAnswer As String 'Permetra de recopier la réponse dela balance
     
    '################################################################"
     
    Private Sub Form_Open(Cancel As Integer)
    'A l'ouverture, on ouvre en grand
    DoCmd.Maximize
    'Bascule l'indicateur de boucle à vrai pour autoriser la boucle de dialogue
    LoopOnBol = True
    'On positionne le curseur sur le controle Journal(pour éviter qu'il ne soit sur l'afficheur qui sera en noir du coup...)
    Me!Journal.SetFocus
    'Lance les fonctions boucle de dialogue e boucle d'affichage
    Call ScaleDialogue
    Call DisplayResult
     
    End Sub
     
    '################################################################"
     
    Private Sub BTN_CLS_FRM_Click()
    'Bascule l'indicateur de boucle à faux pour empecher de commencer une boucle supplémentaire
    'et ainsi ne pas planter lors de la fermeture
    LoopOnBol = False
     
    'On guete que ScaleDialogueBol (dialogue avec la balance) et DisplayResultBol (affichage du résultat) soient arretés
    Do
    If ScaleDialogueBol = False And DisplayResultBol = False Then
    'Si oui, on ferme
    DoCmd.Close
    Loop
     
    End Sub
     
    '################################################################"
     
    Private Sub ScaleDialogue()
    'Cette fonction assure le dialogue avec la balance, en boucle
     
        Dim intPortID As Integer 'Ex. 1, 2, 3, 4 for COM1 - COM4
        Dim lngStatus As Long 'Statut du port Comm pour gestion d'erreurs
        Dim strData As String 'Texte à envoyer et à lire
     
        Do 'début de boucle
     
        'On indique que l'on a démarré une boucle d'interrogation
        ScaleDialogueBol = True
     
        'Initialisation et ouverture Port Comm
        intPortID = 2
        lngStatus = CommOpen(intPortID, "COM" & CStr(intPortID), _
        "baud=9600 parity=E data=7 stop=1")
     
        '######### Ecriture données vers Port Comm, ici on demande le poids
        strData = "W"
        lngStatus = CommWrite(intPortID, strData)
     
        '######### Temps de réponse de la balance
        Call Sleep(225)
     
        '######### Lecture données reçues depuis Port Comm
        lngStatus = CommRead(intPortID, strData, 10)
        'On donne la valeur recuillie à ScaleAnswer
        ScaleAnswer = strData
     
        '######### Fermeture Port Comm
        Call CommClose(intPortID)
     
        'On indique que l'on a terminé une boucle d'interrogation
        ScaleDialogueBol = False
     
        'On fait un pause pour permetre de commuter les Boolean
        Sleep (25)
     
        'On continue tant que LooOnBol est sur vrai, c'est à dire tant qu'on demande le maintient de l'interrogation
        Loop While LoopOnBol = True
     
     
    End Sub
     
    '################################################################"
     
    Private Sub DisplayResult()
        'Cette fonction assure l'affichage de la réponse de la balance
     
        Do 'début de boucle
        'On indique quel'on a commencé une boucle d'affichage
        DisplayResultBol = True
     
        'Si réponse avec d,D, balance considéré comme défaut de zéro
        If Mid(ScaleAnswer, 3, 1) = "d" _
        Or Mid(ScaleAnswer, 3, 1) = "D" Then
        'Afficheur sans chiffres
        Me!Afficheur.Value = "-0,-0-"
        'Affichage message non stable,
        StudyMessage ("DZ")
     
        'Si réponse avec M,I,m,i balance non stable
        ElseIf Mid(ScaleAnswer, 3, 1) = "I" _
        Or Mid(ScaleAnswer, 3, 1) = "i" _
        Or Mid(ScaleAnswer, 3, 1) = "M" _
        Or Mid(ScaleAnswer, 3, 1) = "m" Then
        'Afficheur sans chiffres
        Me!Afficheur.Value = "__,___"
        'Affichage message non stable,
        StudyMessage ("NS")
     
        'Si réponse avec t, balance stable, tare disparue
        ElseIf Mid(ScaleAnswer, 3, 1) = "t" Then
        'Afficheur exclamation
        Me!Afficheur.Value = "!!,!!!"
        'Affichage message non stable, balance stable, tare disparue
        StudyMessage ("TD")
     
        'Si poids présent mais pas suivi de N, poids = poids Brut
        ElseIf Mid(ScaleAnswer, 4, 1) = "." And Mid(ScaleAnswer, 8, 1) <> "N" Then
        'Afficheur poids avec virgule
        Me!Afficheur.Value = (Mid(ScaleAnswer, 2, 2) & "," & Mid(ScaleAnswer, 5, 3))
        'Affichage message net
        StudyMessage ("PB")
     
        'Si poids présent suivi de N, poids = poids Net
        ElseIf Mid(ScaleAnswer, 8, 1) = "N" Then
        'Afficheur avec virgule
        Me!Afficheur.Value = (Mid(ScaleAnswer, 2, 2) & "," & Mid(ScaleAnswer, 5, 3))
        'Affichage message net
        StudyMessage ("PN")
     
        'Dans tous les autres cas :
        Else
        'Afficheur avec points d'interrogation
        Me!Afficheur.Value = "??,???"
        'On écrit la réponse de la balancec dans le controle Journal
        Me!Journal.Value = ScaleAnswer
        'Affichage message autre cas
        StudyMessage ("X")
        End If
     
        'On indique quel'on a terminé une boucle d'affichage
        DisplayResultBol = False
     
        'On fait un pause pour permetre de commuter les Boolean
        Sleep (25)
     
        'On recommance tant que l'on y est autorisé par LoopOnBol
        Loop While LoopOnBol = True
     
    End Sub
     
    '################################################################"
     
    Private Sub StudyMessage(ScaleMessage)
    'Mise en forme du formulaire en fonction de la réponse de la balance
     
    'Si considérée comme défaut de zéro = DZ
    If ScaleMessage = "DZ" Then
    'Fond Rouge
    Me!Afficheur.BackColor = 255 'Rouge
    'message Tare disparue
    Me!AfficheMessage.BackColor = 255
    Me!AfficheMessage.Caption = "Défaut de zéro"
     
    'Si pas stable = NS
    ElseIf ScaleMessage = "NS" Then
    'Fond Orange
    Me!Afficheur.BackColor = 52479 'Orange
    'message Non Stable On
    Me!AfficheMessage.BackColor = 52479 'Orange
    Me!AfficheMessage.Caption = "Balance non stabilisée"
     
    'Si pas stable avec tare disparue = TD
    ElseIf ScaleMessage = "TD" Then
    'Fond Rouge
    Me!Afficheur.BackColor = 255 'Rouge
    'message Tare disparue
    Me!AfficheMessage.BackColor = 255 'Rouge
    Me!AfficheMessage.Caption = "Balance stabilisée avec tare disparue"
     
    'Si stable brut = PB
    ElseIf ScaleMessage = "PB" Then
    'Fond Bleu
    Me!Afficheur.BackColor = 16776960 'Bleu
    'message Poids Brut
    Me!AfficheMessage.BackColor = 16776960 'Bleu
    Me!AfficheMessage.Caption = "Poids Brut"
     
    'Si stable net = PN
    ElseIf ScaleMessage = "PN" Then
    'Fond Vert
    Me!Afficheur.BackColor = 65280 'Vert
    'message Poids net
    Me!AfficheMessage.BackColor = 65280 'Vert
    Me!AfficheMessage.Caption = "Poids Net"
     
    'Dans tous les autres cas
    ElseIf ScaleMessage = "X" Then
    'Fond violet
    Me!Afficheur.BackColor = 16711935 'Violet
    'message Poids net
    Me!AfficheMessage.BackColor = 16711935 'Violet
    Me!AfficheMessage.Caption = "Non prévu"
    End If
     
    End Sub
    On a donc deux boucles qui tournent à des vitesses séparées, et un commutateur pour empêcher les boucles de repartir.

    On devrait avoir une fonction fermer qui ne devient active que quand les boucles sont terminées.

    Un de mes essais me laisse à penser qu'actuellement, même si elles sont écrites pour être lancées à l'ouverture du formulaire, les boucles ne s'exécutent pas en même temps.

    Je suis presque sur que le code attends d'aller jusqu'au bout de la première fonction (End Sub) avant même de lancer la suivante…

    Je sens bien que ça transpire le multiThread, mais quand cette solution est évoquée, elle l'est avec un lue de réserves et le conseil d'optimiser le code…

    Mais en terme d'optimisation, je suis un peu coincé…

    http://access.developpez.com/sources/?page=acc
    De toute manière, je n'ai pas compris où il fallait écrire les actions à mener dans les threads et comment les lancer ensuite…

    Alors si quelqu'un pouvait explicitement orienter mes recherches, il ou elle serrait la bienvenue…

    Encore merci.

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 188
    Points : 98
    Points
    98
    Par défaut
    Bonjour.

    Je continue donc mes petites recherches dans mon coin.

    Je renouvelle mon étonnement sur le manque d'intervenants…

    Un tel dialogue série servirait (et a certainement déjà servi) à tous ceux qui ont à relever une valeur disponible sur une station météo, un multimètre, de manière générale, tout type d'appareil de mesure…

    J'ai supprimé la fonction et le contrôle journal.

    Je pense depuis avoir listé les différentes combinaisons de réponses données par la balance en fonction de la question.

    J'ai re-modifié le code pour le rendre plus simple (je l'espère) et potentiellement interrogeable depuis l'extérieur (toutes les données et les mises en formes peuvent être consultées depuis un autre module pour peu que l'on déplace la déclaration des variables sur un module public).

    Il devrait d'ailleurs être possible de modifier la commande envoyée à la balance…
    Mais je n'en suis pas encore là et je ne suis pas encore sur d'avoir besoin d'envoyer autre chose que W…

    J'ai aussi créé un bouton simple et un contrôle pourvoir s'il était possible de copier le contenu de l'afficheur dans un contrôle.

    J'ai créé un système bien plus sommaire pour mettre fin aux boucles.

    Pour l'instant, un bouton met fin aux boucles.

    Mais il faut ensuite que je ferme manuellement le formulaire.

    Je pourrait ajouter le code de fermeture juste après la fin de boucle, mais je trouve que ce serrait trop spartiate.

    Il faudrait que je maîtrise mieux les fonctions Wait et/ou Sleep…

    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
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
     
    'Déclaration des variables de dialogue et de mise en forme
    Dim ScaleDialogBol As Boolean
    'Contiendra vrai/faux, l'autorisation de poursuivre les boucles de dialogue.
    Dim ScaleAskStr As String
    'Contiendra le contenu de la question.
    Dim ScaleAnswerStr As String
    'Contiendra la réponse brute de la balance
    Dim ScaleDisplayStr As String
    'Contiendra la réponse mise en forme de la balance
    Dim ScaleMessageStr As String
    'Communiquera le message interpreté de la balance
    Dim ScaleDisplayFormattingStr As String
    'Communiquera le formatage du message interpreté de la balance
     
    'Fonction Sleep
    Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
     
    '###########################################################################
     
    Private Sub Commande41_Click()
    Me!Capture.Value = ScaleDisplayStr
    End Sub
     
    '###########################################################################
     
    Private Sub Form_Open(Cancel As Integer)
    'On ouvre en grand, ou à moitié et on a interet, sinon ça marche pas !!!!!!!
    DoCmd.Restore
    'Bascule l'indicateur de boucle à vrai pour valider la boucle de dialogue
    ScaleDialogBol = True
     
    'Temporaire"""""""""""""""""""""""""""""""""""""
    'Normalement, c'est un autre formulaire qui remplira cette variable
    ScaleAskStr = "W"
    'Temporaire"""""""""""""""""""""""""""""""""""""
     
    'Lance la fonction boucle de dialogue
    Call ScaleDialogueSub
     
    End Sub
     
    '###########################################################################
     
    Private Sub BTN_CLS_FRM_Click()
    'Bascule l'indicateur de boucle à faux pour empecher de commencer une boucle supplémentaire
    'et ainsi valider la fermeture
    ScaleDialogBol = False
     
    End Sub
     
    '###########################################################################
     
    Private Sub ScaleDialogueSub()
     
    Dim intPortID As Integer 'Ex. 1, 2, 3, 4 for COM1 - COM4
    Dim lngStatus As Long 'Statut du port Comm pour gestion d'erreurs
    Dim strData As String 'Texte à envoyer et à lire
     
    'On commence une boucle de dialogue avec la balance
    Do
     
    'Initialisation et ouverture Port Comm
    intPortID = 2
    lngStatus = CommOpen(intPortID, "COM" & CStr(intPortID), _
    "baud=9600 parity=E data=7 stop=1")
     
    '######### Ecriture données vers Port Comm, on utilise le contenu de
    'la variable publique ScaleAskStr
    strData = ScaleAskStr
    lngStatus = CommWrite(intPortID, strData)
     
    '######### Temps de réponse de la balance
    Call Sleep(225)
     
    '######### Lecture données reçues depuis Port Comm
    lngStatus = CommRead(intPortID, strData, 10)
    'On attribu la réponse de la balance à la variable publique ScaleAnswerStr
    ScaleAnswerStr = strData
    'On affiche cette même réponse dans l'afficheur root ScaleAnswerCtrl
    Me!ScaleAnswerCtrl.Value = ScaleAnswerStr
    'On demande la fonction de conversion de la réponse de la balance
    Call ScaleAnswerSub
     
    '######### Fermeture Port Comm
    Call CommClose(intPortID)
     
    'On fait un pause pour permetre de commuter LoopAskBol et LoopOnBol
    Sleep (25)
     
    'Vérifie si ScaleDialogBol (demande de boucle de dialogue) est sur faux
    If ScaleDialogBol = False Then
    'On remplace le contenu de la réponse brut de la balance par AskOff
    ScaleAnswerStr = "AskOff"
    'On affiche un message dans l'afficheur root pour indiquer que la boucle est terminée
    Me!ScaleAnswerCtrl.Value = ScaleAnswerStr
    'On demande la focntion de conversion de la réponse de la balance
    Call ScaleAnswerSub
    'Si oui, on ne recommence pas une nouvelle boucle
    Exit Sub
    End If
     
    'Si non, on recommence une boucle
    Loop
     
    End Sub
     
    '###########################################################################
     
    Public Sub ScaleAnswerSub()
    'Fonction de traitement de la réponse
     
    '-----------------------------------------------------------
    'Si réponse avec d,D, balance considéré comme défaut de zéro
    If Mid(ScaleAnswerStr, 3, 1) = "d" _
    Or Mid(ScaleAnswerStr, 3, 1) = "D" Then
     
    'Contenu Afficheur sans chiffres
    ScaleDisplayStr = "-0,-0-"
    'Fonds rouge
    ScaleDisplayFormattingStr = 255 'Rouge
    'Affichage message défaut de zéro,
    ScaleMessageStr = "Défaut de zéro"
     
     
    '-----------------------------------------------------------
    'Si réponse avec M,I,m,i balance non stable
    ElseIf Mid(ScaleAnswerStr, 3, 1) = "I" _
    Or Mid(ScaleAnswerStr, 3, 1) = "i" _
    Or Mid(ScaleAnswerStr, 3, 1) = "M" _
    Or Mid(ScaleAnswerStr, 3, 1) = "m" Then
     
    'Contenu Afficheur sans chiffres
    ScaleDisplayStr = "__,___"
    'Fonds orange
    ScaleDisplayFormattingStr = 52479 'Orange
    'Affichage message Bbalance non stabilisée,
    ScaleMessageStr = "Balance non stabilisée"
     
     
    '-----------------------------------------------------------
    'Si réponse avec t, balance stable, tare disparue
    ElseIf Mid(ScaleAnswerStr, 3, 1) = "t" Then
     
    'Contenu Afficheur exclamation
    ScaleDisplayStr = "!!,!!!"
    'Fonds rouge
    ScaleDisplayFormattingStr = 255 'Rouge
    'Affichage message balance stabilisée avec tare disparue,
    ScaleMessageStr = "Balance stabilisée avec tare disparue"
     
     
    '-----------------------------------------------------------
    'Si poids présent mais pas suivi de N, poids = poids Brut
    ElseIf Mid(ScaleAnswerStr, 4, 1) = "." And Mid(ScaleAnswerStr, 8, 1) <> "N" Then
     
    'Contenu Afficheur poids avec virgule
    ScaleDisplayStr = (Mid(ScaleAnswerStr, 2, 2) & "," & Mid(ScaleAnswerStr, 5, 3))
    'Fonds bleu
    ScaleDisplayFormattingStr = 16776960 'Bleu
    'Affichage message poids brut,
    ScaleMessageStr = "Poids Brut"
     
     
    '-----------------------------------------------------------
    'Si poids présent suivi de N, poids = poids Net
    ElseIf Mid(ScaleAnswerStr, 8, 1) = "N" Then
     
    'Contenu Afficheur avec virgule
    ScaleDisplayStr = (Mid(ScaleAnswerStr, 2, 2) & "," & Mid(ScaleAnswerStr, 5, 3))
    'Fonds vert
    ScaleDisplayFormattingStr = 65280 'Vert
    'Affichage message poids net,
    ScaleMessageStr = "Poids Net"
     
     
    '-----------------------------------------------------------
    'Si la commande de fin de boucle a été envoyée
    ElseIf ScaleAnswerStr = "AskOff" Then
     
    'Contenu Afficheur = AskOff
    ScaleDisplayStr = "AskOff"
    'Fond violet
    ScaleDisplayFormattingStr = 16711935 'Violet
    'Message Fin de dialogue
    ScaleMessageStr = "Fin de dialogue"
     
     
    '-----------------------------------------------------------
    'Dans tous les autres cas
    Else
     
    'Afficheur ScaleDisplayCtrl avec points d'interrogation
    ScaleDisplayStr = "??,???"
    '########## On écrit la réponse de la balance dans le controle Journal
    '########## Me!Journal.Value = ScaleAnswerStr
    'Fonds violet
    ScaleDisplayFormattingStr = 16711935 'Violet
    'Affichage message poids net,
    ScaleMessageStr = "Non prévu"
     
    '-----------------------------------------------------------
    End If
     
     
    '-----------------------------------------------------------
     
    Me!ScaleDisplayCtrl.Value = ScaleDisplayStr
    'Colore le fond de l'afficheur dans la couleur de ScaleDisplayFormattingStr
    Me!ScaleDisplayCtrl.BackColor = ScaleDisplayFormattingStr
    'Met à jour le message intrépreté de la balance
    Me!ScaleMessageCtrl.Caption = ScaleMessageStr
    'Colore le fond du message dans la couleur de ScaleDisplayFormattingStr
    Me!ScaleMessageCtrl.BackColor = ScaleDisplayFormattingStr
     
    End Sub
    Voilà.

    Encore merci.

  11. #11
    Membre confirmé
    Inscrit en
    Février 2011
    Messages
    466
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 466
    Points : 550
    Points
    550
    Par défaut
    Bonjour,
    Outre Wait / Sleep, on peut aussi envisager l'événement 'On Timer' d'un formulaire.

    Le Timer Interval s'exprime en millisecondes. Donc si vous specifiez Timer interval = 3000, dès l'ouverture du formulaire, Access compte 3 secondes puis exécute ce que vous avez spécifié dans l'événement 'On Timer' (exécuter une macro, faire tourner du VBA, ...). Attention, On Timer tourne sans fin. Donc, nous pourrions avoir :
    1. Ouverture du formulaire
    2. Access compte 3 secondes
    3. Access lance le code VBA (ou autre chose)
    4. Access compte de nouveau 3 secondes,
    5. Access lance de nouveau....



    Il est sage de penser à fermer le formulaire à l'étape 3...


    L'événement 'On Timer' se met sur le Formulaire, pas sur un bouton ou quoi que ce soit d'autre.

  12. #12
    Membre confirmé
    Inscrit en
    Février 2011
    Messages
    466
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 466
    Points : 550
    Points
    550
    Par défaut
    Merci pour la documentation.
    Même si il n'y a pas beaucoup de réponse, il y a quand même au moins 1 fada qui vous lit.

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 188
    Points : 98
    Points
    98
    Par défaut
    Bonjour.

    Ça fait plaisir de lire quelqu'un d'autre que moi...

    J'ai déjà essayé le timer.

    Mais comme vous l'indiquez, il tourne sans fin.

    Et je soupçonne qu'il ne soit pas possible de lancer un autre code tant que la boucle du timer n'est pas finie.

    Par ailleurs, il faut que je puisse stopper la boucle du timer.

    Hors, j'ai besoin de lancer un code qui empêche la boucle de timer de reprendre.

    Et comme l'évènement timer est sur le formulaire, une fois lancé à l'ouverture, il tournera indéfiniment jusqu'à fermeture du formulaire.

    Chaque fois que le temps indiqué sera écoulé, il recommencera et le problème que je cherche à éviter se manifestera de nouveau : le code essayera de modifier des contrôles qui sont sur un formulaire fermé.

    Il ne sembla pas possible de lancer l'évènement timer, puis de le stopper.

    C'est pour cela que je n'utilise pas ce système et que j'ai préféré retenir le code cavant.

    A l'ouverture, le code est lancé.

    Il tourne en boucle.

    A la fin de chaque boucle, il vérifie l'état d'une variable pour savoir s'il doit lancer une nouvelle boucle.

    Jusqu'à ce que j'utilise un bouton qui bascule la variable à faux.

    Pour l'instant, je suis obligé de cliquer sur ce bouton avant de fermer mon formulaire.

    Encore merci.

  14. #14
    Membre confirmé
    Inscrit en
    Février 2011
    Messages
    466
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 466
    Points : 550
    Points
    550
    Par défaut
    Bonjour,
    Pour arrêter le timer, il faut mettre son interval à zero : Voyez cet exemple où j'ai un formulaire avec 2 boutons :
    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
    Option Compare Database
    Option Explicit
     
    Private Sub btnArretTimer_Click()
    Me.TimerInterval = 0
    MsgBox "j'arrête le timer."
    End Sub
     
    Private Sub btnHello_Click()
    MsgBox "hello"
    End Sub
     
    Private Sub Form_Timer()
    'Un timer se met sur le FORM, pas sur un bouton ou un label.
    Debug.Print "on timer", Now()
    Me.lblHeure.Caption = "Le timer s'exprime en millisecondes. " & Now()
     
    End Sub
    Lors de l'ouverture du formulaire, le timer commence par attendre 4 secondes et toutes les 4 secondes, il affiche l'heure.
    Si je clique sur le bouton HELLO, le code associé m'affiche "hello" et le timer continue son bout de chemin et affiche l'heure toutes les 4 secondes. Je peux cliquer sur Hello plusieurs fois, rien n'y fait. Access est impassible et continue à afficher sagement l'heure toutes les 4 secondes.
    Quand j'en ai marre, je clique sur le bouton arret. Ce bouton arrêt met l'intervale de rafraichissement du timer à 0. L'heure n'est alors plus mise à jour sur mon formulaire.

  15. #15
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 188
    Points : 98
    Points
    98
    Par défaut
    Bonsoir.

    Merci pour ce détail sur l'utilisation du Timer et de la propriété "TimerInterval"

    L'idée semble très séduisante.

    Mettre le Timer à zéro l'arrête.

    Du coup, le code lié à l'événement timer ne se produit plus.

    Ça, c'est noté.

    Mais ce que j'aurais voulu, c'est associer à un même bouton la fermeture du formulaire et le blocage du code sur timer.

    Hors, toutes mes expériences jusqu'à présent se soldent par le même résultat :

    Certes, le code à bien pigé que je voulais arrêter la boucle, mais je ne suis pas arrivé à le faire attendre que la dernière boucle soit terminée avant de lancer la fermeture du formulaire et du coup, il essaye de mettre en forme un contrôle d'un formulaire qui vient d'être fermé : c'est le bug.

    Par contre je suis désolé, mais je ne vais pas pouvoir la tester immédiatement pour mon cas de figure, je fais des travaux pour améliorer l'infrastructure matérielle.

    Mais dès que possible, je vais essayer.

    Encore merci.

Discussions similaires

  1. Réponses: 31
    Dernier message: 22/04/2014, 14h55
  2. Différences entre Delphi et Visual Basic ?
    Par Anonymous dans le forum Débats sur le développement - Le Best Of
    Réponses: 75
    Dernier message: 30/03/2009, 20h09
  3. VB.NET vs C# vs Java ou existe-t-il une vie après Visual Basic 6 ?
    Par B-Pascal dans le forum Débats sur le développement - Le Best Of
    Réponses: 32
    Dernier message: 05/07/2007, 12h46
  4. Visual basic version Open Source !!
    Par Ruddy16 dans le forum Langages de programmation
    Réponses: 15
    Dernier message: 31/03/2004, 19h15
  5. []débogage sur une requête dasn visual basic
    Par mcay dans le forum VB 6 et antérieur
    Réponses: 19
    Dernier message: 24/09/2003, 09h59

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