OVH Cloud OVH Cloud

Origine d'un évènement MdiChildActivate

5 réponses
Avatar
Jacques
Bonjour
Comment déterminer si un évènement MdiChildActivate est propvoqué par un
click dans un sous menu (par exemple mnuAccess) qui affiche une nouvelle
feuille fille suivant l'item cliqué, ou par un clic dans un menu MdiListItem
qui permet de passer d'une feuille fille ouverte à une autre. Je souhaite
différencier le traitement dans MdiChildActivate suivant son origine.
En complément, comment agissent les évènements d'un menu MdiListItem, j'ai
testé click, popup et select, et cela me semble assez obscur quant aux
résultats...
Merci

5 réponses

Avatar
Frédéric Queudret [MS]
Bonjour,

Peut-être qu'une solution consisterait à générer un événement particulier en
passant comme paramètre une donnée permettant de distinguer l'origine de
l'événement.
Exemple:
1- Déclaration d'un événement dans la feuille/Gestionnaire
public event System.EventHandler MySpecialEvent;

this.MySpecialEvent += new EventHandler(Form1_MySpecialEvent);

2- Sur le click du menu d'activation (mnuAccess - ici menuItem3 dans
l'exemple), générer l'événement:
private void menuItem3_Click(object sender, System.EventArgs e)

{

MySpecialEvent(menuItem3, null);

}

3- Dans le gestionnaire de l'événement "MySpecialEvent"

private void Form1_MySpecialEvent(object sender, EventArgs e)

{

if (sender == menuItem3)

{

MessageBox.Show("Menu Activate");

}

else

{

MessageBox.Show("Menu MdiListItem");

}

}

S'il y a d'autres menus du même genre, répéter l'envoi d'événement en
passant comme paramètre le menu qui a été cliqué.

Frédéric.

"Jacques" wrote in message
news:
Bonjour
Comment déterminer si un évènement MdiChildActivate est propvoqué par un
click dans un sous menu (par exemple mnuAccess) qui affiche une nouvelle
feuille fille suivant l'item cliqué, ou par un clic dans un menu
MdiListItem
qui permet de passer d'une feuille fille ouverte à une autre. Je souhaite
différencier le traitement dans MdiChildActivate suivant son origine.
En complément, comment agissent les évènements d'un menu MdiListItem, j'ai
testé click, popup et select, et cela me semble assez obscur quant aux
résultats...
Merci


Avatar
Jacques
Merci de ta réponse.
J'ai fait comme indiqué, en adaptant à mon code, tout au moins en essayant,
mais il y a un os.
Dans la section déclaration de la classe frmAccueil (la feuille mère)
public event System.EventHandler MySpecialEvent;
bool NewFille;
Dans le constructeur de la classe:
this.MySpecialEvent += new EventHandler(frmAccueil_MySpecialEvent);
Dans chaque gestionnaire d'évènement de menu d'ouverture d'une nouvelle frm
fille (ici menuAuteur):
private void mnuAuteur_Click(object sender, System.EventArgs e)
{
MySpecialEvent(mnuAcces, null);
frmAuteurs childAuteurs = new frmAuteurs();
childAuteurs.MdiParent = this;
childAuteurs.Show();
}
Le gestionnaire d'évènement MySpécialEvent:
private void frmAccueil_MySpecialEvent(object sender, EventArgs e)
{
if (sender == mnuAcces)
{
NewFille = true;
}
Pour finir, dans le gestionnaire d'évènement MdiChildActivate (sur ouverture
d'une nouvelle frm fille):
private void frmAccueil_MdiChildActivate(object sender, System.EventArgs
e)
{
if (NewFille == true)
{
string TextSender = ((frmAccueil)sender).Text;
string[] NomFilles = new string[3]{"Auteurs", "Editeurs", "Livres"};
string NomMdiActivate = "";
int Contient;
------- code pour activer ou désactiver les menus de façon à
n'afficher qu'une seule instance d'une même feuille fille.
En pas à pas, le code s'effectue sans aucun problème pour l'ouverture d'une
nouvelle feuille fille. Par contre, lors du passage d'une feuille à l'autre
par le biais du menu "Windows" MdiListItem, on ne passe pas sur l'èvènement
MySpecialEvent. NewFille est dinc à false et le code de
frmAccueil_MdiChildActivate ne s'exécute donc pas.
Afin d'être sûr de parler des mêmes éléments, j'ai une barre de menus
(mnuAccueil) dans laquelle j'ai notamment deux menus (mnuAcces et
mnuWindows). Le menu mnuAccueil permet d'ouvrir une instance des feuilles
filles (frmAuteurs et frmEditeurs), et l'évènement MdiChildActivate gère
l'accès aux menus (activés ou non selon qu'il existe déjà une instance de la
feuille corresponante).
J'avais essayé d'utiliser un évènement du menu Windows pour passer un
paramètre, et c'est à cette occasion que j'ai pu constater qu'il semble
impossible de se servir de ces évènements. L'esprit était quelque peu
identique à ce que tu m'as indiqué, mais impossible semble-t-ol à mettre en
oeuvre de ce côté...
Voilà. Qu'est-ce que j'ai loupé?
Merci
Avatar
Frédéric Queudret [MS]
Effectivement, les événements de ton menu Windows (MdiListItem) ne donnent
rien.
Par contre, il est peut-être nécessaire de concevoir l'intéraction avec les
feuilles filles d'une auter manière.
Peux-tu expliquer plus en détails ce que tu cherches à faire.
Ce que je comprends:
- Tu souhaites n'avoir qu'une seule instance ouverte d'une feuille
particulière
- Désactiver les menus de création d'une feuille d'un type particulier si
une feuille de ce type est déjà ouverte.

Est-ce bien cela?
Dans ce cas, une autre solution consisterait à déclencher des événements à
la création d'une feuille d'un type donné pour rendre inaccessible le menu
correspondant (menu de création).
Lorsque la feuille est fermée (gestion de l'événement Closed), dégriser le
menu correspondant pour le rendre à nouveau accessible.
Est-ce que cela pourrait répondre à ton besoin?

Frédéric.

"Jacques" wrote in message
news:
Merci de ta réponse.
J'ai fait comme indiqué, en adaptant à mon code, tout au moins en
essayant,
mais il y a un os.
Dans la section déclaration de la classe frmAccueil (la feuille mère)
public event System.EventHandler MySpecialEvent;
bool NewFille;
Dans le constructeur de la classe:
this.MySpecialEvent += new EventHandler(frmAccueil_MySpecialEvent);
Dans chaque gestionnaire d'évènement de menu d'ouverture d'une nouvelle
frm
fille (ici menuAuteur):
private void mnuAuteur_Click(object sender, System.EventArgs e)
{
MySpecialEvent(mnuAcces, null);
frmAuteurs childAuteurs = new frmAuteurs();
childAuteurs.MdiParent = this;
childAuteurs.Show();
}
Le gestionnaire d'évènement MySpécialEvent:
private void frmAccueil_MySpecialEvent(object sender, EventArgs e)
{
if (sender == mnuAcces)
{
NewFille = true;
}
Pour finir, dans le gestionnaire d'évènement MdiChildActivate (sur
ouverture
d'une nouvelle frm fille):
private void frmAccueil_MdiChildActivate(object sender,
System.EventArgs
e)
{
if (NewFille == true)
{
string TextSender = ((frmAccueil)sender).Text;
string[] NomFilles = new string[3]{"Auteurs", "Editeurs",
"Livres"};
string NomMdiActivate = "";
int Contient;
------- code pour activer ou désactiver les menus de façon à
n'afficher qu'une seule instance d'une même feuille fille.
En pas à pas, le code s'effectue sans aucun problème pour l'ouverture
d'une
nouvelle feuille fille. Par contre, lors du passage d'une feuille à
l'autre
par le biais du menu "Windows" MdiListItem, on ne passe pas sur
l'èvènement
MySpecialEvent. NewFille est dinc à false et le code de
frmAccueil_MdiChildActivate ne s'exécute donc pas.
Afin d'être sûr de parler des mêmes éléments, j'ai une barre de menus
(mnuAccueil) dans laquelle j'ai notamment deux menus (mnuAcces et
mnuWindows). Le menu mnuAccueil permet d'ouvrir une instance des feuilles
filles (frmAuteurs et frmEditeurs), et l'évènement MdiChildActivate gère
l'accès aux menus (activés ou non selon qu'il existe déjà une instance de
la
feuille corresponante).
J'avais essayé d'utiliser un évènement du menu Windows pour passer un
paramètre, et c'est à cette occasion que j'ai pu constater qu'il semble
impossible de se servir de ces évènements. L'esprit était quelque peu
identique à ce que tu m'as indiqué, mais impossible semble-t-ol à mettre
en
oeuvre de ce côté...
Voilà. Qu'est-ce que j'ai loupé?
Merci


Avatar
Jacques
Merci et excuses moi de n'avoir pas répondu plus tôt,
l'adesse
http://support.microsoft.com/newsgroups/default.aspx
renvotant à une page absente, je pensais qu'il en était de
même ici, et je n'ai même pas vérifié. Ceci étant, cela
m'a obliger à chercher encore plus et je pense avoir
trouver la solution pour ce que je veux faire, et que tu
as effectivement bien compris. Avant la solution, je
réponds à quelques points que tu as soulevés.

Effectivement, les événements de ton menu Windows


(MdiListItem) ne donnent rien.<
En fait, l'évènement Popup fonctionne pour le menu,
lorsu'il y a des items à développer. J'avais cru qu'il ne
fonctionnais pas, car sur cette évènement, j'avais testé
avec un message et le popup ne se développait plus. Tu
verras, j'y suis revenu et c'est ce que j'utilise dans ma
solution.
Lorsque la feuille est fermée (gestion de l'événement


Closed), dégriser le menu correspondant pour le rendre à
nouveau accessible. Est-ce que cela pourrait répondre à
ton besoin?<
Cela devrait être opérant, mais j'avais écarté cette
approche car je ne voulait géréer aucun évènement ou
propriétés de la feuille mère et donc aussi du menu depuis
une feuille fille, afin de faciliter la maintenance et la
compréhension (on m'a indiqué il y a quelque temps que
cette démarche était à privilégier en POO, et comme je
débute, je suis les conseils (;- ou j'essaie).
Bon voila. La solution que j'ai trouvée maintenant:
1°/Dans la partie déclaration de la classe, déclaration de
la variable qui transmettra l'état d'une frm (public bool
NewFille);
2°/Dans chaque procédure d'évènement Click d'un item de
menu pour ouvrir une feuille fille, je défini la valeur de
la variable booléenne (NewFille) à true, indiquant donc
que le formulaire est ouvert.
3°/Dans l'évènement Popup du menu Windows (les items des
feuilles filles), je passe la valeur false à la vriable
NewFille.
4°/Dans le code de l'évènement
frmAccueil_MdiChildActivate, je teste la valeur de
NewFille avec:
if (NewFille == false)
{
NewFille = true; //probablement pas vraiment utile
}
else
{
... le code
Voilà, et cela a l'air de fonctionner correctement.
Merci de ton concours.
PS: sais tu ce qui se passe avec
http://support.microsoft.com/newsgroups/default.aspx
Avatar
Frédéric Queudret [MS]
Désolé pour ma réponse tardive aussi ;-)
Tant mieux que nos échanges aient pu t'apporter des solutions.
Concernant les newsgroups sur le site du support, j'ai regardé mais pas vu
de problèmes particuliers.
Bon courage pour le dèv.

Frédéric.

"Jacques" wrote in message
news:17bb01c4db7a$c9f13de0$
Merci et excuses moi de n'avoir pas répondu plus tôt,
l'adesse
http://support.microsoft.com/newsgroups/default.aspx
renvotant à une page absente, je pensais qu'il en était de
même ici, et je n'ai même pas vérifié. Ceci étant, cela
m'a obliger à chercher encore plus et je pense avoir
trouver la solution pour ce que je veux faire, et que tu
as effectivement bien compris. Avant la solution, je
réponds à quelques points que tu as soulevés.

Effectivement, les événements de ton menu Windows


(MdiListItem) ne donnent rien.<
En fait, l'évènement Popup fonctionne pour le menu,
lorsu'il y a des items à développer. J'avais cru qu'il ne
fonctionnais pas, car sur cette évènement, j'avais testé
avec un message et le popup ne se développait plus. Tu
verras, j'y suis revenu et c'est ce que j'utilise dans ma
solution.
Lorsque la feuille est fermée (gestion de l'événement


Closed), dégriser le menu correspondant pour le rendre à
nouveau accessible. Est-ce que cela pourrait répondre à
ton besoin?<
Cela devrait être opérant, mais j'avais écarté cette
approche car je ne voulait géréer aucun évènement ou
propriétés de la feuille mère et donc aussi du menu depuis
une feuille fille, afin de faciliter la maintenance et la
compréhension (on m'a indiqué il y a quelque temps que
cette démarche était à privilégier en POO, et comme je
débute, je suis les conseils (;- ou j'essaie).
Bon voila. La solution que j'ai trouvée maintenant:
1°/Dans la partie déclaration de la classe, déclaration de
la variable qui transmettra l'état d'une frm (public bool
NewFille);
2°/Dans chaque procédure d'évènement Click d'un item de
menu pour ouvrir une feuille fille, je défini la valeur de
la variable booléenne (NewFille) à true, indiquant donc
que le formulaire est ouvert.
3°/Dans l'évènement Popup du menu Windows (les items des
feuilles filles), je passe la valeur false à la vriable
NewFille.
4°/Dans le code de l'évènement
frmAccueil_MdiChildActivate, je teste la valeur de
NewFille avec:
if (NewFille == false)
{
NewFille = true; //probablement pas vraiment utile
}
else
{
... le code
Voilà, et cela a l'air de fonctionner correctement.
Merci de ton concours.
PS: sais tu ce qui se passe avec
http://support.microsoft.com/newsgroups/default.aspx