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

Langage Delphi Discussion :

Gestion d'événements OnClick concernant les menus


Sujet :

Langage Delphi

  1. #1
    Membre averti Avatar de AL1986
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    434
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 434
    Points : 441
    Points
    441
    Par défaut Gestion d'événements OnClick concernant les menus
    Salut,
    J'ai une question concernant la gestion des événements liés aux menus (les cliques précisément). J'aurai aimé savoir s'il est impératif de créer une méthode qui gère le clique (OnClick) pour chaque élément d'un menu. Quelques fois, il y des lignes de codes qui vont servir pour la gestion de deux éléments par exemple. Si je fais un événement pour chacun, il y aura du code redondant. Une solution serait peut être de mettre les bouts de code en commun dans une autre méthode qui sera appelée au moment opportun. Mais, ne pourrait-on pas traiter le pb d'une meilleure manière (en manipulant l'index par exemple) et comment ? Merci
    Etre ou ne pas être, telle est la question sinusoïdale de l'anachorète hypocondriaque et vice et versa .
    Bonsai monsieur, bonsai madame, vous avez gagnez un milliard de degrés au soleil .
    There is no cure for stupidity (ou pas ).

  2. #2
    Membre averti
    Profil pro
    xxxxxxxxxxx
    Inscrit en
    Juin 2004
    Messages
    308
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : xxxxxxxxxxx

    Informations forums :
    Inscription : Juin 2004
    Messages : 308
    Points : 407
    Points
    407
    Par défaut ActionLists
    Une bonne pratique est de passer par le composant TActionList.
    Il permet de définir des TAction, qui pourront être reliées indifféremment à un TMenuItem, TPopupMenuItem, TButton, etc

  3. #3
    Membre averti Avatar de AL1986
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    434
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 434
    Points : 441
    Points
    441
    Par défaut
    Donc, il faut associer à chaque événement une TAction que j'aurai définie au préalable. Sinon, le fait d'utiliser une méthode qui gère les onclick pour chaque élément du menu est-il inévitable ? Ne peut-on pas créer une méthode globale (onclick du menu principal) et puis faire des tests sur les indexes pour choisir l'élément à traiter ?
    Etre ou ne pas être, telle est la question sinusoïdale de l'anachorète hypocondriaque et vice et versa .
    Bonsai monsieur, bonsai madame, vous avez gagnez un milliard de degrés au soleil .
    There is no cure for stupidity (ou pas ).

  4. #4
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut

    Citation Envoyé par AL1986
    Ne peut-on pas créer une méthode globale (onclick du menu principal) et puis faire des tests sur les indexes pour choisir l'élément à traiter ?
    A ma connaissance ce n'est pas possible, puisque le TMainMenu (ou TPopupMenu) ne possède pas d'évènement OnClick.

    La meilleure solution reste l'utilisation du TActionList.
    Si tu tiens à centraliser tous les clicks de tes éléments de menu, il te suffit d'associer à tous les éléments de menu la même action, et traiter en conséquence dans le OnExecute.

    PS: Voir ActionComponent du TAction.

    @+ Claudius

  5. #5
    Membre averti
    Profil pro
    xxxxxxxxxxx
    Inscrit en
    Juin 2004
    Messages
    308
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : xxxxxxxxxxx

    Informations forums :
    Inscription : Juin 2004
    Messages : 308
    Points : 407
    Points
    407
    Par défaut Mutualiser le code des actions
    Pas de solution miracle pour cela.
    Eventuellement, il est possible d'utiliser la propriété TAG de chaque action pour les différencier et les brancher à un unique gestionnaire d'événement qui ferait un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    procedure TForm1.ToutesLesActionsExecute(Sender:TObject);
    begin
      if sender is TAction then 
        case TAction(sender).Tag of
          1 : //action1
          2 : //action2
        //...
        end;
    end;

    ... en espérant que le sender est bien le TAction (pas très sûr de ça )
    Ben si, je viens de vérifier.

  6. #6
    Membre averti Avatar de AL1986
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    434
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 434
    Points : 441
    Points
    441
    Par défaut
    Ok, Merci pour vos réponses.
    Etre ou ne pas être, telle est la question sinusoïdale de l'anachorète hypocondriaque et vice et versa .
    Bonsai monsieur, bonsai madame, vous avez gagnez un milliard de degrés au soleil .
    There is no cure for stupidity (ou pas ).

  7. #7
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Euh, vous vous égarez Tu peux bien sûr relier plusieurs menus au même gestionnaire d'événement.

    Il te suffit pour cela de choisir la petite flèche dans l'inspecteur d'objet pour l'événement OnClick, plutôt que de double-cliquer dans la case blanche.

    Après, une fois dans le gestionnaire, tu peux faire des tests sur Sender.ce-que-tu-veux, comme Tag, Caption ou même la valeur de Sender elle-même.

    Tu n'as pas nécessairement besoin de passer par des actions pour ça.
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  8. #8
    Membre éprouvé
    Avatar de CapJack
    Homme Profil pro
    Prof, développeur amateur vaguement éclairé...
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Prof, développeur amateur vaguement éclairé...
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Points : 988
    Points
    988
    Par défaut
    Je plussoie avec sjrd.

    Mais les actions c'est quand même trrrrrrèès bien !

  9. #9
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Citation Envoyé par CapJack
    Mais les actions c'est quand même trrrrrrèès bien !
    Je plussoie avec CapJack.

    Les actions sont un excellent système pour centraliser les... Actions que peut faire l'utilisateur sur le système.
    Après, tu peux définir en trois clics un menu, un bouton ou tout ce que tu veux qui permet de réaliser l'action.

    Avec le TActionManager, il y a même moyen de piloter le design de l'application par les actions.
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  10. #10
    Membre averti Avatar de AL1986
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    434
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 434
    Points : 441
    Points
    441
    Par défaut
    Citation Envoyé par sjrd
    Après, une fois dans le gestionnaire, tu peux faire des tests sur Sender.ce-que-tu-veux, comme Tag, Caption ou même la valeur de Sender elle-même.
    J'ai essayé en faisant un sender.tag
    Code Delphi : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    procedure TForm1.Menu_Click(Sender: TObject );
    begin
       case sender.tag  of
          0  :
          begin
             showmessage('premier element');
          end;
          1  :
          begin
             showmessage('deuxieme element');
          end;
       end;
    end;
    Mais ça ne passe pas à la compilation, on me dit que TObject ne contient pas de propriété tag
    Etre ou ne pas être, telle est la question sinusoïdale de l'anachorète hypocondriaque et vice et versa .
    Bonsai monsieur, bonsai madame, vous avez gagnez un milliard de degrés au soleil .
    There is no cure for stupidity (ou pas ).

  11. #11
    Membre averti
    Profil pro
    xxxxxxxxxxx
    Inscrit en
    Juin 2004
    Messages
    308
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : xxxxxxxxxxx

    Informations forums :
    Inscription : Juin 2004
    Messages : 308
    Points : 407
    Points
    407
    Par défaut
    Tu as mal lu, il faut transtyper l'objet

  12. #12
    Membre averti Avatar de AL1986
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    434
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 434
    Points : 441
    Points
    441
    Par défaut
    En fait je me suis un peu précipité. Quand je fais
    Code Delphi : Sélectionner tout - Visualiser dans une fenêtre à part
    TMenuItem(Sender).Tag
    au lien de ça passe et ça effectue l'affichage approprié.
    Etre ou ne pas être, telle est la question sinusoïdale de l'anachorète hypocondriaque et vice et versa .
    Bonsai monsieur, bonsai madame, vous avez gagnez un milliard de degrés au soleil .
    There is no cure for stupidity (ou pas ).

  13. #13
    Membre averti Avatar de AL1986
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    434
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 434
    Points : 441
    Points
    441
    Par défaut
    Citation Envoyé par cmen76
    Tu as mal lu, il faut transtyper l'objet
    Le fait de transtyper en TMenuItem change-t-il quelque chose ?
    Etre ou ne pas être, telle est la question sinusoïdale de l'anachorète hypocondriaque et vice et versa .
    Bonsai monsieur, bonsai madame, vous avez gagnez un milliard de degrés au soleil .
    There is no cure for stupidity (ou pas ).

  14. #14
    Membre averti
    Profil pro
    xxxxxxxxxxx
    Inscrit en
    Juin 2004
    Messages
    308
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : xxxxxxxxxxx

    Informations forums :
    Inscription : Juin 2004
    Messages : 308
    Points : 407
    Points
    407
    Par défaut
    En réalité, tout dépend du Sender que reçoit le gestionnaire d'événement.
    Supposons que le gestionnaire serve pour un clic de bouton, et pour un clic de menu, et pour un raccourci clavier, alors il faudrait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    if Sender is TButton then 
    begin
      case TButton(sender).Tag of ...
    end
    else if Sender is TMenuItem then 
    begin
      case TMenuItem(sender).Tag of ...
    end
    else if Sender is TAction then 
    begin
      case TAction(Sender).Tag of ...
    end;
    ou alors, puisque toutes ces classes héritent de TComponent qui publie la propriété Tag :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    case TComponent(Sender).Tag of ...
    pour ne se baser que sur la valeur du tag, indifféremment du type d'objet Sender.

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

Discussions similaires

  1. information concernant les menus déroulants
    Par jbggg dans le forum Macros et VBA Excel
    Réponses: 33
    Dernier message: 24/05/2008, 17h29
  2. [wxRuby] Menus et gestion des événements
    Par aidefz dans le forum Ruby
    Réponses: 3
    Dernier message: 10/12/2007, 16h08
  3. Gestion d'évènement onClick
    Par grunk dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 18/10/2007, 19h43
  4. Gestion des fenêtres avec les menus
    Par Death83 dans le forum C++Builder
    Réponses: 23
    Dernier message: 15/12/2006, 10h22
  5. Gestion globale de l'évènement onClick ?
    Par tuxout dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 11/08/2006, 11h04

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