none
Comment détecter quelle PictureBox (sur 65) a été cliquée ? RRS feed

  • Question

  • Bonjour à tous

    Il y a 64 PictureBoxes identiques dans mon application, repérées par leur nom ("Prise0#") et formant une collection basique : "Prises". (Ces PictureBoxes représentent des prises électriques dans un appartement). Lorsqu'on clique sur une des prises, le disjoncteur auquel cette prise est reliée s'allume, tandis que la PictureBox s'efface et est remplacée par le nom de la prise.

    Pour le moment, l'application marche avec 65 routines du type suivant (pour la Prise02) :

        Private Sub Prise02_MouseDown(sender As Object, e As MouseEventArgs) Handles Prise02.MouseDown
            Call NuméroDeSource(Prise02)
            B10.BackColor = Color.Red
        End Sub
        Private Sub Prise02_MouseUp(sender As Object, e As MouseEventArgs) Handles Prise02.MouseUp
            Call EffacerNuméroSource(Prise02)
         B10.BackColor = Color.Yellow
        End Sub
     B10 représente un disjoncteur auquel la Prise02 est reliée. 
     
     La procédure "NuméroSource()" remplace la PictureBox de la prise par le nom de la prise, tandis que le Disjoncteur B10 change de couleur.
     
     La procédure "EffacerNuméroSource()" efface le nom de la prise, rétablit la PictureBox représentant la prise et redonne au disjoncteur B10 sa couleur primitive.
     
     
     L'application marche pour un appartement donné, mais avec plus de 500 routines concernant les prises, les lampes et les appareils électroménagers divers. 
     Les liens Disjoncteur-Prise sont stockés dans une base de données, et il est prévu, pour le développement de l'application, d'interroger la base de données en début de programme afin de mettre à jour l'application pour n'importe quel plan de maison ou d'appartement. Il n'est évidemment pas question de réécrire les plus de 500 routines pour chaque logement.

     Ma question est la suivante : je voudrais remplacer les 130 routines MouseDown-MouseUp par une seule routine parcourue au moyen de "For each...Next". Pour cela, il me faut trouver un moyen de détecter quelle prise de la collection "Prises" a été cliquée.

    Quelqu'un a-t-il une idée  sur le moyen d'y parvenir ?

    Merci d'avance


    Pierre Allemand

    lundi 30 novembre 2020 20:50

Réponses

  • Bonjour,

    On peut créer un tableau global pour garder l'état de chaque bouton/routine. Par exemple, état actif -> 1, désactivé -> 0 . La mise à jour doit être effectuée avec l'événement Click du chaque bouton. L'état actuel doit être vérifié et transmis au tableau. Ensuite, dans une boucle "For Each... Next" de ce tableau global on vérifie quels boutons sont cliqués.

    Cordialement,
    Nina


    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

    mardi 1 décembre 2020 11:25
    Modérateur

Toutes les réponses

  • Bonjour,

    On peut créer un tableau global pour garder l'état de chaque bouton/routine. Par exemple, état actif -> 1, désactivé -> 0 . La mise à jour doit être effectuée avec l'événement Click du chaque bouton. L'état actuel doit être vérifié et transmis au tableau. Ensuite, dans une boucle "For Each... Next" de ce tableau global on vérifie quels boutons sont cliqués.

    Cordialement,
    Nina


    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

    mardi 1 décembre 2020 11:25
    Modérateur
  • Merci pour ce judicieux conseil. Je le mets en oeuvre immédiatement.

    Cordialement


    Pierre Allemand

    mardi 1 décembre 2020 12:37
  • Bonsoir,

    J'ai finalement changé de tactique et j'ai utilisé l'objet "sender" qui m'indique quel est le contrôle qui émet la notification de l'évènement mouse_down ou mouse_up. Ainsi, je conserve mes centaines de procédures, mais elles ne sont écrites qu'une seule fois, et elles s'adaptent automatiquement si on ajoute, retranche ou modifie une ligne dans la base de données. 

    Cordialement


    Pierre Allemand


    mardi 1 décembre 2020 18:42
  • Bonsoir,

    J'ai encore changé de tactique.

    J'utilise maintenant la puissance fantastique de l'objet sender, e, et des éléments addhandler et addressof pour réaliser avec une seule procédure par source ou par point de consommation. 

    De plus, lorsqu'on passe à un nouveau plan d'habitation, ou lorsqu'on ajoute ou retranche un élément dans une habitation existante, il suffit d'ajouter ou d'effacer une seule ligne de 5 champs dans la base de données. Le système se met à jour automatiquement et entièrement ! 

    Je ne saurais trop vous recommander de vous intéresser aux objets cités plus haut, que je regardais avec curiosité, mais dont je n'avais jamais réalisé l'intérêt puisqu'ils s'installent automatiquement : (sender As System.Object et e As System.EventArgs).

    Cordialement


    Pierre Allemand

    mercredi 2 décembre 2020 17:52