OVH Cloud OVH Cloud

activer un bouton par programme

12 réponses
Avatar
Didier
bonjour,

je désire simuler le click sur un bouton par programme,

mon bouton se nomme bp_precedent ( par exemple).

je fait bp_precedent.PerformClick();

mai cela ne marche pas !
une idée ?

merci

vincent

10 réponses

1 2
Avatar
Patrick Philippot
Didier wrote:
je désire simuler le click sur un bouton par programme,

mon bouton se nomme bp_precedent ( par exemple).

je fait bp_precedent.PerformClick();

mai cela ne marche pas !
une idée ?



Bonjour,

Qu'est-ce qui ne marche pas? L'événement n'est pas déclenché? Si vous
mettez un breakpoint dans l'event handler correspondant, le programme
s'arrête-t-il dessus? A priori cette méthode ne pose pas de problème
connu.

[DESCENTE EN FLAMME DE PERFORMCLICK ON]
J'en profite pour faire une remarque, si vous le permettez. Je suis
personnellement *résolument opposé* à l'utilisation de cette méthode. Si
à un endroit de votre programme, vous devez déclencher le même
traitement que celui qui est déclenché quand un bouton est cliqué, vous
devez:

1. Définir ce traitement dans une méthode séparée (MonTraitement)
2. Appeler MonTraitement dans l'event handler du click sur le bouton.
3. Appeler MonTraitement partout ailleurs dans votre code quand vous en
avez besoin.

Pourquoi? Parce qu'en utilisant PerformClick, vous créez ce qu'on
appelle un couplage fort entre votre interface et vos traitements. La
conséquence directe est que tout changement ultérieur dans votre
interface va immédiatement provoquer des changements inutiles dans vos
traitements. Imaginez que vous supprimiez ce bouton pour une raison
quelconque. Vous devez découpler au maximum la partie présentation
(interaction avec l'utilisateur) de la partie traitements proprement
dite. Il est bien dommage que le framework .Net ne propose pas, comme
dans les MFC par exemple, un moyen structurel et natif de se conformer à
cette règle essentielle. Si je devais faire une critique de .Net, c'est
probablement le point que je mettrais en évidence.
[DESCENTE EN FLAMME DE PERFORMCLICK OFF]

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr
Avatar
Didier
"Patrick Philippot" a écrit dans le message
de news:
Didier wrote:
> je désire simuler le click sur un bouton par programme,
>
> mon bouton se nomme bp_precedent ( par exemple).
>
> je fait bp_precedent.PerformClick();
>
> mai cela ne marche pas !
> une idée ?

Bonjour,

Qu'est-ce qui ne marche pas? L'événement n'est pas déclenché? Si vous
mettez un breakpoint dans l'event handler correspondant, le programme
s'arrête-t-il dessus? A priori cette méthode ne pose pas de problème
connu.

[DESCENTE EN FLAMME DE PERFORMCLICK ON]
J'en profite pour faire une remarque, si vous le permettez. Je suis
personnellement *résolument opposé* à l'utilisation de cette méthode. Si
à un endroit de votre programme, vous devez déclencher le même
traitement que celui qui est déclenché quand un bouton est cliqué, vous
devez:

1. Définir ce traitement dans une méthode séparée (MonTraitement)
2. Appeler MonTraitement dans l'event handler du click sur le bouton.
3. Appeler MonTraitement partout ailleurs dans votre code quand vous en
avez besoin.

Pourquoi? Parce qu'en utilisant PerformClick, vous créez ce qu'on
appelle un couplage fort entre votre interface et vos traitements. La
conséquence directe est que tout changement ultérieur dans votre
interface va immédiatement provoquer des changements inutiles dans vos
traitements. Imaginez que vous supprimiez ce bouton pour une raison
quelconque. Vous devez découpler au maximum la partie présentation
(interaction avec l'utilisateur) de la partie traitements proprement
dite. Il est bien dommage que le framework .Net ne propose pas, comme
dans les MFC par exemple, un moyen structurel et natif de se conformer à
cette règle essentielle. Si je devais faire une critique de .Net, c'est
probablement le point que je mettrais en évidence.
[DESCENTE EN FLAMME DE PERFORMCLICK OFF]

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr






Oui chef !
Vous avez raison, j'ai donc crée des méthodes ....

merci pour les conseils....

Vincent
Avatar
Patrick Philippot
Didier wrote:
Oui chef !



:-) Désolé si j'ai paru un peu autoritaire. Mais en général, sur ces
sujets, je réagis assez vite car j'ai trop vu les dégâts causés par ce
type de problèmes.

Bon courage.

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr
Avatar
Tamahome
"Didier" a écrit dans le message de
news:
bonjour,

je désire simuler le click sur un bouton par programme,

mon bouton se nomme bp_precedent ( par exemple).

je fait bp_precedent.PerformClick();

mai cela ne marche pas !
une idée ?

merci

vincent



et pourquoi ne pas appeller directement l'evenement
"bp_precedent_Click(object sender, System.EventArgs e)" par (par exemple)
bp_precedent_Click (null, null);
(Je parle en Winforms, comme tu n'as pas précisé...)
Avatar
Patrick Philippot
Bonjour,

Tamahome wrote:
et pourquoi ne pas appeller directement l'evenement
"bp_precedent_Click(object sender, System.EventArgs e)" par (par
exemple) bp_precedent_Click (null, null);
(Je parle en Winforms, comme tu n'as pas précisé...)



Pour les mêmes raisons que celles que j'ai précisées au-dessus. Si le
bouton disparaît un jour de l'interface, cet appel sera invalide.

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr
Avatar
Lio
"Patrick Philippot" a écrit dans le message
de news:
Bonjour,

Tamahome wrote:
> et pourquoi ne pas appeller directement l'evenement
> "bp_precedent_Click(object sender, System.EventArgs e)" par (par
> exemple) bp_precedent_Click (null, null);
> (Je parle en Winforms, comme tu n'as pas précisé...)

Pour les mêmes raisons que celles que j'ai précisées au-dessus. Si le
bouton disparaît un jour de l'interface, cet appel sera invalide.



Ouais,... enfin si le bouton disparait il semble logique que le traitement
qui était lié à ce bouton va disparaitre aussi donc si ce traitement était
appelé il a toutes les chances de disparaitre aussi... Personnellement je
préfère encore le couplage qui va me donner une erreur de compilation et
éviter de laisser du code mort plutot que la solution que vous préconisez.
Avatar
Patrick Philippot
Lio wrote:
Ouais,... enfin si le bouton disparaît il semble logique que le
traitement qui était lié à ce bouton va disparaître aussi donc si ce
traitement était appelé il a toutes les chances de disparaître
aussi...



Absolument pas d'accord. Ce n'est pas du tout logique. Si vous
considérez que l'interface utilisateur est directement et
systématiquement couplée aux traitements que l'application met en
oeuvre, vous êtes dans l'erreur, sauf votre respect.

Le fait de supprimer le bouton ne veut pas nécessairement dire que le
traitement correspondant ne sera plus déclenché dans l'application.
Peut-être qu'il sera activé par un autre élément d'interface ou
automatiquement?

Personnellement je préfère encore le couplage qui va me
donner une erreur de compilation et éviter de laisser du code mort
plutôt que la solution que vous préconisez.



C'est une manière de voir les choses. Chacun voit midi à sa porte. En ce
qui me concerne, s'il y avait dans une équipe dont j'aurais la
responsabilité un développeur qui agissait sciemment de la sorte, je
crois qu'il aurait des soucis et qu'il serait candidat à une formation
sur la conception de logiciels. Votre approche conduit nécessairement à
un design problématique et va rendre le travail de maintenance plus
difficile.

Que dîtes vous de la situation où le même traitement est déclenché via
plusieurs éléments d'interface différents, ce qui est le cas dans la
quasi totalité des applications Windows? Si le traitement est déclenché
disons par un bouton, un élément de menu et un bouton d'un toolbar, que
faites vous? Sur la sélection du menu, vous déclenchez un PerformClick
du bouton? Idem pour le bouton de la toolbar? Mais si vous supprimez le
bouton et ne conservez que l'élément de menu et le bouton de la toolbar,
vous basculez sur le PerformClick du menu? En faisant un couper-coller
du code du gestionnaire d'événement du bouton supprimé? Ça ne tient pas
la route.

Regardez les MFC. Regardez Delphi (et la notion d'Action). Regardez
d'autres outils de développement. Tous isolent le plus possible le code
de traitement du design de l'interface. Il est très dommage que le
framework .Net ne propose pas d'entrée de jeu un mécanisme similaire.

Conservez une copie de ce thread. Je suis persuadé qu'un jour, vous le
relirez après avoir rencontré des difficultés majeures liées à la façon
dont vous abordez ce problème. Mon travail de formateur est de faire
prendre conscience aux développeurs qu'un peu de discipline peut éviter
de grosses catastrophes. Sans vouloir jouer les donneurs de leçons,
j'espère au moins avoir semé le doute dans votre esprit :-) .

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr
Avatar
Antoine F.
Lio, dans le cas où vous estimeriez que l'opinion de Patrick
serait un peu trop arrêtée, peut être que l'approbation de ses
propos par d'autres développeurs pourrait vous convaincre...

Pour ma part, j'appuie entièrement les arguments de Patrick
sur les dangers d'un couplage direct du traitement avec
l'interface utilisateur: à éviter absolument!!!

Pour votre argument du 'code mort', en utilisant des outils de
profiling ou d'analyse de code, ce genre de code est très facilement
détecté et ne devrait pas être le souci majeur...

.antoine
Avatar
Lio
"Patrick Philippot" a écrit dans le message
de news:
Lio wrote:
> Ouais,... enfin si le bouton disparaît il semble logique que le
> traitement qui était lié à ce bouton va disparaître aussi donc si ce
> traitement était appelé il a toutes les chances de disparaître
> aussi...

Absolument pas d'accord. Ce n'est pas du tout logique. Si vous
considérez que l'interface utilisateur est directement et
systématiquement couplée aux traitements que l'application met en
oeuvre, vous êtes dans l'erreur, sauf votre respect.



Ce n'est pas ce que j'ai dit: J'ai dit que le traitement du bouton est aussi
bien avec le bouton, je n'ai jamais dit qu'il fallait placer tout le code
résultant de l'appui d'un bouton dans le code de l'événement d'un bouton.


Le fait de supprimer le bouton ne veut pas nécessairement dire que le
traitement correspondant ne sera plus déclenché dans l'application.
Peut-être qu'il sera activé par un autre élément d'interface ou
automatiquement?



Les autres taches seront bien sur placés ailleurs mais le code "du bouton"
est logiquement placé dans la fonction appelée sur l'événement du bouton.

Je crois que l'on ne se comprend pas: Pour moi il est bien sur hors de
question, par exemple, de mettre le code permettant d'enregistrer les
données d'une boite de dialogue directement dans la fonction de gestion de
l'événement du bouton !




> Personnellement je préfère encore le couplage qui va me
> donner une erreur de compilation et éviter de laisser du code mort
> plutôt que la solution que vous préconisez.

C'est une manière de voir les choses. Chacun voit midi à sa porte. En ce
qui me concerne, s'il y avait dans une équipe dont j'aurais la
responsabilité un développeur qui agissait sciemment de la sorte, je
crois qu'il aurait des soucis et qu'il serait candidat à une formation
sur la conception de logiciels. Votre approche conduit nécessairement à
un design problématique et va rendre le travail de maintenance plus
difficile.



L'équipe que je dirige se sort très bien de la gestion des codes et je ne
suis pas prêt de les envoyer en formation sur ce sujet :-)



Que dîtes vous de la situation où le même traitement est déclenché via
plusieurs éléments d'interface différents, ce qui est le cas dans la
quasi totalité des applications Windows? Si le traitement est déclenché
disons par un bouton, un élément de menu et un bouton d'un toolbar, que
faites vous? Sur la sélection du menu, vous déclenchez un PerformClick
du bouton? Idem pour le bouton de la toolbar? Mais si vous supprimez le
bouton et ne conservez que l'élément de menu et le bouton de la toolbar,
vous basculez sur le PerformClick du menu? En faisant un couper-coller
du code du gestionnaire d'événement du bouton supprimé? Ça ne tient pas
la route.

Regardez les MFC. Regardez Delphi (et la notion d'Action). Regardez
d'autres outils de développement. Tous isolent le plus possible le code
de traitement du design de l'interface. Il est très dommage que le
framework .Net ne propose pas d'entrée de jeu un mécanisme similaire.

Conservez une copie de ce thread. Je suis persuadé qu'un jour, vous le
relirez après avoir rencontré des difficultés majeures liées à la façon
dont vous abordez ce problème. Mon travail de formateur est de faire
prendre conscience aux développeurs qu'un peu de discipline peut éviter
de grosses catastrophes. Sans vouloir jouer les donneurs de leçons,
j'espère au moins avoir semé le doute dans votre esprit :-) .



Vous n'avez, il me semble, pas compris mon point de vue et que vous semblez
exagérer largement au dela de ce qu'il devait être.

Inutile de garder une copie de ce fil car il me semble très inutile dans mon
travail et celui de mon équipe.

Cordialement
Avatar
Patrick Philippot
Lio wrote:
Je crois que l'on ne se comprend pas



Probablement. Ou que l'un de nous deux s'exprime mal :-) .

Quand je lis

Ouais,... enfin si le bouton disparaît il semble logique que le
traitement qui était lié à ce bouton va disparaître aussi donc si ce
traitement était appelé il a toutes les chances de disparaître
aussi...







il me semble bien que l'on parle du traitement déclenché quand
l'utilisateur clique sur le bouton. Et il ne va pas nécessairement
disparaître. C'est cette affirmation que je réfute. Sinon, de quel
traitement parle-t-on? A part quelques lignes de code marginales et
l'appel à la fonction de traitement proprement dite, le handler du
bouton doit être pratiquement vide. Si nous sommes d'accord là-dessus,
c'est qu'effectivement il y a un malentendu.

En tous cas, l'idée de départ est que l'utilisation de Perform_Click est
à proscrire sauf contrainte particulière. Sommes-nous au moins d'accord
là-dessus?

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr
1 2