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

Windows Forms Discussion :

[VB.Net] Bouton enfoncé -> action


Sujet :

Windows Forms

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 94
    Par défaut [VB.Net] Bouton enfoncé -> action
    Bonsoir à toutes et à tous!
    Je souhaite que mon programme envoie une donnée tant qu'un bouton est enfoncé.. J'arrive bien à envoyer une donnée, mais celle-ci est envoyée seulement lorsque je relâche le bouton...
    - L'évènement click ne me convient pas...
    - une boucle while? Mais je ne veux pas une touche du clavier "Keydown" mais bien lorsque le bouton "button1" est enfoncé...

    Merci à vous

    Lio

  2. #2
    Membre expérimenté Avatar de AcidLines
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2010
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : Février 2010
    Messages : 198
    Par défaut
    Bonsoir,

    J'ai regarder, je n'ai pas trouver le moyen de le faire directement par un etat "appuyer" d'un bouton.

    Cependant, tu peux faire cette action à répétition d'une autre manière :
    Un checkBox mais en type button (paramètre " appareance").

    et dire que tant que c'est coché tu effectue ton traitement, sinon tu le stop.
    Sur le CheckChanged.

    Bonne soirée à toi

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 94
    Par défaut
    Merci AcidLines de te pencher sur mon soucis, je vais essayer ton idée qui me permettra peut être de contourner ma difficulté...
    Merci...
    Lio

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 94
    Par défaut
    Humm, le soucis persiste, mais dans l'autre sens, il faut refaire un "clic" sur la checkbox pour la désactiver...
    J'aimerais bien, mais je pense que vous avez saisi mon soucis...
    Enfoncé = action true
    Relâché = action false

    Merci quand même...

    Lio

  5. #5
    Membre expérimenté Avatar de AcidLines
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2010
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : Février 2010
    Messages : 198
    Par défaut
    Je pense alors qu'il faut créer un thread différent pour ton traitement que tu envoi en boucle sur ton button.mousedownn et que tu kill ton thread sur button.mouseup. Car VB ne peux pas assimiler les 2 action simultanémenents.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 94
    Par défaut
    D'accord, je vois à peu près le truc.. je suis débutant...
    Je viens de changer .click en .mousedown
    Maintenant l'action est effectivement effectuée lorsque le bouton s'enfonce, mais cette action s'arrête tout de suite après...

    Donc il faut un thread... hummm c'est une sorte de timer? Bon, j'ai lu que ce n'était pas la même chose...

    Donc un thread qui tourne en boucle sur .mousedown?

    Là j'avoue ne pas savoir faire... Je quitte pour ce soir et vais rechercher comment faire tourner un thread en boucle et le "kill" (le supprimer, je suppose?) lorsque le mousedown n'est plus actif

    Que je ne raconte pas de bêtise sur le mousedown, il est bien placé ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private Sub button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSendTextB.MouseDown
    En tous les cas merci,
    cela avance...
    Lio

  7. #7
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 202
    Par défaut
    en fait tout dépend de ce que tu as à faire pendant le mousedown, si ca peut être bloquant (genre un timeout qui peut etre génant en cas de plantage), le temps que ca prend et tous les combien de temps tu veux le faire

    si c'est pour un truc qui prend 1ms qui ne peut pas être bloquant et que tu veux faire toutes les 200ms, un timer suffira largement, et ca reste beaucoup plus simple qu'un thread (NB : un thread n'est pas un timer, mais on peut recréer le fonctionnement d'un timer avec)
    auquel cas sur mousedown : timer.start, sur mouseup : timer.stop, et ton code sur timer.tick

    s'il faut partir dans le thread, le "kill" n'est pas une solution propre ; en détaillant les points que j'ai précisé on pourra te dire si tu en as besoin ou non
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  8. #8
    Membre expérimenté Avatar de AcidLines
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2010
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : Février 2010
    Messages : 198
    Par défaut
    Oui j'y ai penser au timer, mais comme tu le dis sa dépend de son action à réalisé.

    Sinon pour les threads : http://faqvbnet.developpez.com/?page=thread

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 94
    Par défaut
    Merci messieurs de vous pencher sur mon souci!

    Je suis au boulot et ne peux tester...
    Alors, effectivement je me dois de vous donner une explication...
    L'info du bouton est une lettre envoyée sur le port série... si le microcontrôleur reçoit cette lettre alors il actionne un moteur.... Donc, je souhaite que le moteur tourne tant que la valeur du bouton est envoyée...
    Encore merci, je vais essayer avec un timer... Merci...
    Lio

  10. #10
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 202
    Par défaut
    à priori si tu ne fais pas de lecture sur le port série mais juste de l'écriture il n'y a pas d'attente possible et si tu as ouvert ton port avant ca ne peut pas bloquer non plus, donc un timer suffirait si tu ne descend pas en dessous de 16ms d'intervalle d'envoi
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 94
    Par défaut
    Bonjour,
    Bon, j'ai peu me libérer du temps... Merci à Pol63 et à AcideLines!
    Avec un timer, cela fonctionne, merci!
    Donc, je souhaite aller plus loin :
    un boutonA allume une del le temps que le bouton est enfoncé
    un boutonB allume une autre del le temps que ce deuxième bouton est enfoncé
    Donc 2 timer (s)? Alors j'ai testé et c'est toujours la même del qui s'allume... Du côté du microcontrôleur, le prog fonctionne...

    Je vous joins mon code :
    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
    Imports System
    Imports System.IO.Ports
     
    Public Class Form1
        Dim WithEvents Port As SerialPort = New SerialPort("COM3", 9600, Parity.None, 8, StopBits.One)
     
        Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
     
    Timer1.Interval = 20
    Port.Open()
    Port.Write(Asc("B") & "!%")
    Port.Close()
        End Sub
     
    Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick
     
     Timer2.Interval = 20
     Port.Open()
     Port.Write(Asc("A") & "!%")
     Port.Close()
        End Sub
     
    Private Sub btnSendTextB_mousedown(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSendTextB.MouseDown
            Timer1.Start()
    End Sub
    Private Sub btnSendTextB_mouseup(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSendTextB.MouseUp
            Timer1.Stop()
    End Sub
     
    Private Sub btnSendTextA_mousedown(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSendTextA.MouseDown
            Timer2.Start()
    End Sub
    Private Sub btnSendTextA_mouseup(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSendTextA.MouseUp
            Timer2.Stop()
    End Sub
     
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Port.Open()
            Port.Write("")
            Port.Close()
    End Sub
    End Class
    Serait-ce un problème d'initialisation du port? Serait-ce la méthode "Dispose" qu'il faudrait mettre en oeuvre? Je ne vois pas trop où la placer!

    Merci à vous
    Lio

  12. #12
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 202
    Par défaut
    en général l'interval se règle hors du tick, (genre sub new ou form_load)

    sur du port com, on ferme rarement le port je crois

    dispose sert à libérer la ram prise par un objet non géré par le framework, donc à appeller une fois qu'on en a plus besoin car après en général l'objet ne marche plus

    tu peux mettre des points d'arret dans les évènements pour voir si tu y passes

    si tu passes bien dans les 2 et que ce sont bien les bonnes trames que tu envoies ca voudrait que le programme de l'autre coté qui ne fait pas ce que tu attends
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 94
    Par défaut
    Merci Pol63 pour votre aplomb...
    Effectivement, du côté du micro, ma variable n'était plus formatée correctement.. Je l'avais modifiée entre temps.... Quelle buse....
    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
     Imports System
    Imports System.IO.Ports
     
    Public Class Form1
    Dim WithEvents Port As SerialPort = New SerialPort("COM3", 9600, Parity.None, 8, StopBits.One)
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            'Timer1.Interval = 20
            'Timer2.Interval = 20
    Port.Open()
    End Sub
     
     
    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    Port.Write(Asc("B") & "!%")
    End Sub
     
    Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick
    Port.Write(Asc("A") & "!%")        
    End Sub
     
        Private Sub btnSendTextB_mousedown(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSendTextB.MouseDown
            Timer1.Start()
    End Sub
     
    Private Sub btnSendTextB_mouseup(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSendTextB.MouseUp
    Timer1.Stop()
    End Sub
     
    Private Sub btnSendTextA_mousedown(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSendTextA.MouseDown
    Timer2.Start()
    End Sub
     
    Private Sub btnSendTextA_mouseup(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSendTextA.MouseUp
    Timer2.Stop()
    End Sub
     
    End Class
    Ce code vous paraît-il davantage correct?
    J'ai bien ouvert le port, mais ne le referme pas, faut-il alors le refermer lorsque l'on quitte l'application?
    Dans cet exemple, le timer fonctionne, mais si le paramètre "Interval" est mis en commentaire, cela fonctionne également...Cela voudrait dire que s'il n'y a pas d'"Interval" spécifié, par défaut le timer tourne tout le temps jusqu'à ce qu'un autre évènement vienne le stopper?
    J'avoue être bien content et vous remercie...
    Si j'ai bien compris, dans cet exemple, le timer fait bien l'affaire... Imaginons que je veuille lire sur le port, il faudrait alors un "thread"?
    Merci
    Lio

  14. #14
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 202
    Par défaut
    le code est pas mal oui

    fermer le port à la fermeture j'aurais pu vous le proposer, à vous de voir si vous avez besoin avec l'explication suivante

    les classes non managées (qui utilisent des ressources hors de .net) comme le port série, une connexion à une base de données, la lecture d'un fichier (etc...) ont une méthode dispose qui libère la ram prise
    en général sur ces classes, la méthode dispose appelle la méthode close (dispose suffit donc) ; je rapelle que close ferme le port et vous permet de le réouvrir pas la suite, dispose détruit l'objet, et il faudra alors on instancier un nouveau pour utiliser le port
    si on oublie d'appeler la méthode dispose, elle le sera quand même automatiquement, la clr (le truc qui s'occupe d'exécuter votre code .net) dispose d'un garbage collector (ou GC, littéralement ramasseur d'ordures) qui une fois que vous n'utilisez plus une variable va la supprimer de la ram (et dans le cas d'un objet ayant la méthode dispose il va l'appeler)
    le truc c'est qu'on ne sait pas quand le GC va passer, donc il est recommandé d'appeler dispose manuellement (voir using/end using qui est pratique pour ca)

    si vous avez un formulaire unique, à la fermeture de celui ci, l'application va se fermer, et tous les dispose seront appelés, donc pas de soucis pour le port série
    dans le cas où vous auriez un formulaire qui fait ca et qu'on puisse le fermer pour rester sur un autre formulaire, alors oui il faut fermer le port
    pour ca vous avez plusieurs évènements au choix sur le form : form_closing, form_closed, disposed
    et donc mettre .dispose à l'un de ces endroits


    pour l'interval du timer, il a une valeur par défaut, de plus si vous l'avez posé sur le form, vous pouvez modifier la propriété interval dans le propertygrid du mode design, et la valeur est enregistrée
    si la valeur par défaut/enregistrée n'est pas 20 ca veut dire que votre programme de l'autre coté du port accepte plus de 20ms avant de relacher la commande (pour info le timer.tick tombe sur un multiple de 16ms je crois)
    l'interval est juste le temps entre chaque appel, si vous ne faites pas start, il ne démarre pas, et tant que vous ne faites pas stop, toutes les x ms il va déclencher l'évènement tick


    l'écriture sur un port est quelque chose de rapide
    la lecture elle dépend de celui qui est de l'autre côté
    en général on lui envoie une commande, et lui il renvoie une réponse, et entre les 2 il faut attendre la réponse
    si le truc en face est lent, il va pas vous répondre tout de suite ; si la trame est perdue ou illisible (parasites) ou que la connexion est coupée (par un rongeur ou une pince coupante) il ne vous répondra jamais
    dans ce cas si on fait la lecture sur le thread principal qui s'occupe du rafraichissement de l'interface (et au passage de papoter avec windows) ca risque de bloquer
    au bout d'un certain temps, windows n'ayant plus de réponse de votre appli, il va gentiment rajouter dans votre barre de titre "ne répond pas"
    pour ne pas perturber tout ca, on va attendre la réponse sur un autre thread (et utiliser un timeout au passage)
    pour simplifier, si vous avez déjà mis des points d'arret et fait du pas à pas (F10/F11), un thread est l'équivalent d'une autre ligne jaune qui avance dans votre code
    par contre seul le thread principal a le droit de modifier l'interface, dans ce cas il y a plusieurs techniques, qui feront le cas échéant l'objet d'un autre post ^^
    certaines classes ont des versions asynchrones de leurs méthodes, par exemle en plus de .Read il y a .BeginRead
    dans ce cas ces méthodes s'occupent de démarrer le thread, et demandent un callback (pointeur vers une sub/délégué appelé par le thread une fois que les octets sont arrivés)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 94
    Par défaut
    Merci Pol63 pour toutes ces explications!
    Si j'ai bien compris, il n'est pas utile de fermer le port pour cette application? Car cette dernière sera très basique, le port se fermera bien lorsque je quitte l'application... au pire, je peux l'ajouter dans form_closing
    Je pense que je vais laisser tomber le thread pour le moment, mais pense en avoir besoin plus tard... Effectivement se sera sans doute l'objet d'un autre post!
    En attendant, pour ce post, je peux dire qu'il est résolu et vous remercie, sisi vraiment....
    Cordialement
    Lio

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 15/04/2009, 13h29
  2. Action durant bouton enfoncé
    Par beral dans le forum C++Builder
    Réponses: 4
    Dernier message: 20/07/2006, 22h32
  3. Détecter les états des boutons (enfoncé, relaché)
    Par Tray dans le forum C++Builder
    Réponses: 3
    Dernier message: 17/03/2005, 20h12
  4. [VB6] Bouton enfoncé
    Par jlvalentin dans le forum VB 6 et antérieur
    Réponses: 12
    Dernier message: 02/02/2005, 10h49
  5. Réponses: 5
    Dernier message: 29/10/2004, 16h20

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