none
Identifier le LineShape clické (vb2008) RRS feed

  • Question

  • J'utilise des lignes de différentes couleurs pour figurer un planning / agenda. Elles sont groupées en une collection p(1) à p(406) pour laquelle j'ai créé un delegate:

    "For Each p As Control In Me.gbxplg.Controls : AddHandler p.Click, AddressOf OnPlg : Next"

    lorsque je clicke sur l'une d'elles, l'énenement déclenché est traité dans:

    "Public Sub OnPlg(ByVal sender As Object, ByVal e As System.EventArgs)"

    Là commence le problème car "sender" me renvoie le nom du "shape container" alors que j'ai besion de celui du "shape" ou mieux de son tag ou de son numéro d'item ou de n'importe quelle donnée me permetant d'identifier le shape qui a déclenché l'évenement.

    J'ai essayé beaucoup de formulations mais aucune ne donne le résultat espéré.

    Merci d'avance pour vos suggestions et conseils

    Cordialement.

    jeudi 10 novembre 2011 09:42

Réponses

  • Bonjour,

    Pour l'instant je dirais que si le click retourne le container c'est parce que c'est sur ce(s) container(s) que le AddHandler a été appliqué. Faire un débogage ou une trace et vérifier que la variable p enumère bien les "LineShapes" et non pas les containers. Si c'est bien le cas, il faut sans descendre encore d'un cran (gbxplg contiendrait les containers et ce sont ces containers qui contiennent les LineShapes ?)


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    • Marqué comme réponse FredDorine samedi 12 novembre 2011 07:36
    vendredi 11 novembre 2011 12:56
    Modérateur

Toutes les réponses

  • Bonjour,

    Pour l'instant je dirais que si le click retourne le container c'est parce que c'est sur ce(s) container(s) que le AddHandler a été appliqué. Faire un débogage ou une trace et vérifier que la variable p enumère bien les "LineShapes" et non pas les containers. Si c'est bien le cas, il faut sans descendre encore d'un cran (gbxplg contiendrait les containers et ce sont ces containers qui contiennent les LineShapes ?)


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    • Marqué comme réponse FredDorine samedi 12 novembre 2011 07:36
    vendredi 11 novembre 2011 12:56
    Modérateur
  • Bonjour et merci,

    C'est bien gbxplg (groupbox) qui contient "ShapeContainer2" qui contient les "Shapes" qu'énumère "p" il faudrait donc que le AddHandler décline les deux conteneurs..?

    Je vais essayer.

    Cordialement

     

    samedi 12 novembre 2011 07:45
  • Donc plutôt "... In ShapeContainer2.Controls" pour énumérer ses enfants immédiats plutôt que "... In dbxplg.Controls". On peut aussi ajouter un test sur le type :
    If TypeOf p Is LineShape Then ... pour s'assurer que l'on n'accroche le "handler" qu'à des contrôles LineShape (même si c'est bien le cas actuellement, si on ajoute un jour d'autres contrôles et que ce "handler" leur est également affecté de façon inattendu cela pourrait générer un bogue).


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    samedi 12 novembre 2011 13:13
    Modérateur
  • Bonjour..!

    Merci, c'était bien vu... mais cela ne provoque (hélas) aucune interception. J'ai aussi essayé "In gbxplg.ShapeContainer2.Controls" sans résultat. Je me demande s'il serait possible d'identifier le "sender" autrement après l'interception au niveau de "gbxplg.Controls" mais je n'ai rien trouvé dans la doc à ce propos.

    Enervant hein..?

    Cordialement,

    dimanche 13 novembre 2011 08:18
  • "Sans résultat" c'est-à-dire ? Cela ne devrait même pas compiler. ShapeContainer2 est si j'ai bien compris une variable qui correspond au panneau qui comprends les "LineShapes". gbxplh est encore un cran au dessus mais n'a pas de propriété appelée ShapeContainer2.

    J'ai l'impression qu'il y a une confusion entre l'arborescence des contrôles et la structure des objets qui représentent ces contrôles.

    For exemple que donne for each p As control in ShapeContainer2.controls:MessageBox.Show(p.GetType.ToString):Next pour voir quel est le type des contrôles énumérés à partir de ShapeContainer2....

     

     

     


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    dimanche 13 novembre 2011 13:37
    Modérateur
  • Re...

    Comme Gaston (Lagaffe) Fred s'en sort toujours..!

    Il suffisait d'assigner "OnPlg" à l'évenement click dans les propriétés des controles p(n) et le machin a fait le reste, je n'en reviens toujours pas. En fait, on affiche les propriétés des contrôles et on ne pense pas à la liste des évenements qui leur sont associés. C'est beaucoup plus simple que l'écriture d'un "delegate" (j'ai trituré le mien sans succès).

    Merci en tout cas pour ton aide et pendant que j'y suis (last but not least) pourais tu m'indiquer où chercher la methode pour lire mes mails à partir de mon application (il s'agit d'un organiser).

    Cordialement,

    dimanche 13 novembre 2011 16:08
  • Ok, c'est effectivement une autre possibilité (je pensais plutôt que les LineShapes étaient générées dynamiquement). Donc c'est le même principe (donc pour mémoire qq chose comme For Each p As Control In Me.gbxplg.Controls : For Each q As Control in p.Controls:AddHandler q.Click, AddressOf OnPlg : Next:Next devrait énumérer les bons contrôles avec peut-être en plus le test conseillé plus haut sur le type).

    Pour la récupération des messages cela dépend de ce que l'on veut exactement (on ne veut pas dépendre d'un Outlook local ?)mais il faut sans doute une bibliothèque POP3 ou IMAP (selon que l'on veut ou non laisser les messages sur le serveur). Il reste fortement préférable d'ouvrir un nouveau fil de discussion :
    - ce fil est marqué résolu donc sera sans doute peu lu par les personnes voulant aider
    - ce nouveau sujet apparaitra mieux si qq fait une recherche pour essayer de résoudre le même problème
    - il est plus facile de lire un fil qui reste consacré à un sujet particulier au lieu de passer d'un sujet à l'autre en cours de discussion...


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    lundi 14 novembre 2011 12:21
    Modérateur