Activer desactiver le menu Fichier nouveau [Résolu]

Messages postés
37
Date d'inscription
mardi 14 février 2006
Statut
Membre
Dernière intervention
4 mai 2010
- - Dernière réponse : Liverion
Messages postés
296
Date d'inscription
mardi 22 avril 2008
Statut
Membre
Dernière intervention
18 août 2008
- 8 mai 2008 à 09:35
Bonjour:
j'ai une application MDI que ça fait 2 semaines que je cherche comment desactiver le sous-menu Nouveau de main menu Fichier sans trouver la bonne solution :-(
j'ai opter cette solution qui ne fais rien si on clique sur le menu nouveausi la fenetre est déjà ouverte

private
void ShowNewForm(
object sender,
EventArgs e){

Articles childForm =
new
Articles();

foreach (
Form frm
in MdiChildren)

if ( frm
is
Articles ) {childForm = (

Articles) frm;

break; }

else
if( childForm ==
null )
{childForm =

new
Articles(); childForm.MdiParent =

this;
}childForm.MdiParent =

this; childForm.Show();

childForm.Focus();

}

La solution sera  ça : si j'arrive à  acceder au  newToolStripMenuItem apartir de la fenetre  Articles qui est la fentetre enfante de MDIParent1

private
void Articles_Load(
object sender,
EventArgs e){

newToolStripMenuItem.Enabled = false; }

si qlqn de vous à une idée je serai tres reconnaissant
merci.
Afficher la suite 

9 réponses

Meilleure réponse
Messages postés
296
Date d'inscription
mardi 22 avril 2008
Statut
Membre
Dernière intervention
18 août 2008
3
Merci
Bon, j'ai regardé rapidement, je n'ai pas pu tester, travaillant sous Visual Studio 2005.
Mais pour moi , il te manque une variable dans ta classe Form1, qui servirait de réference vers ta fenetre principale :

Dans la Form1 :

public partial class Form1 : Form

{

      

        MDIParent1 MdiParent= null;

      

        public Form1( MDIParent1 appelant )

        {

            InitializeComponent();
            MdiParent = appelant;

        }


        private void Form1_Load(object sender, EventArgs e)

        {

            MdiParent.activer();

        }

}

Et dans la classe MDIParent1 :

 public partial class MDIParent1 : Form
 {
      private int childFormNumber = 0;
 
      public MDIParent1()
      {
            InitializeComponent();
       }
        public void activer()
        {
            newToolStripMenuItem.Enabled = true;
        }

        private void ShowNewForm(object sender, EventArgs e)
        {
            Form1 childForm = new Form1( this );
            childForm.Text = "Fenêtre " + childFormNumber++;
            childForm.Show();
        }
          ...

Le logiciel te demandait que ta fonction activer() soit static car ton appel MDIParent1.activer() est un appel à une methode agissant sur la classe et pas un appel depuis ton instance actuelle de ta classe, il faut que tu fasse tes appels a partir de ton instance : MdiParent.activer()

De plus dans ta fonction activer, pas besoin de mettre MDIParent1.newToolStripMenuItem.Enabled, en effet c'est seulement l'item du menu de ton instance en cours que tu veux desactiver, donc newToolStripMenuItem.Enabled suffit ( ca equivaut implicitement à this.newToolStripMenuItem.Enabled )

Voila voila, si tu peux essayer et me dire si ca fonctionne correctement ( et surtout comme tu le voulais ^^ )

(Sinon je pense pas avoir été très clair sur l'explication du static, donc si quelqu'un voit une meilleure manière de le dire, je suis preneur )

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 110 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Liverion
Messages postés
296
Date d'inscription
mardi 22 avril 2008
Statut
Membre
Dernière intervention
18 août 2008
0
Merci
Bon , voila ce que je voulais dire dans ton sujet précédent :

Dans le code de ton MDI Parent tu ecris ces fonctions :

public void enableNewMenu ( )
{
    newToolStripMenuItem.Enable = true;
}

public void disableNewMenu ( )
{
    newToolStripMenuItem.Enable = false;
}

Et dans le code de ta fenetre enfant :

private
void Articles_Load(
object sender,
EventArgs e)
{
    MdiParent.disableNewMenu();
}

private void Articles_Close(object sender, EventArgs e)
{
    MdiParent.enableNewMenu();
}

Normalement ca devrait fonctionner 
Commenter la réponse de Liverion
Messages postés
37
Date d'inscription
mardi 14 février 2006
Statut
Membre
Dernière intervention
4 mai 2010
0
Merci
oui normalement ça devarit fonctionner mais si je fais ça ce message d'erreur apparait:

Erreur 1 Une référence d'objet est requise pour la propriété, la méthode ou le champ non statique 'BouTiQue.MDIParent1.desactiver()' 

???
je comprend pas pourquoi cette erreur est générer mais je pense  que j'essaye de modifier un objet private par l'intermedière de desactiver() qui est public void
Commenter la réponse de cs_naylouvar
Messages postés
37
Date d'inscription
mardi 14 février 2006
Statut
Membre
Dernière intervention
4 mai 2010
0
Merci
bon j'ai trouver une solution qui marche pas tres bien donc j'appelerai pas une solution
c'est de changer la declaration des elements du menu en static private puis en mettant:

.new
System.Windows.Forms.
ToolStripMenuItem();
au lieu de
 this.newToolStripMenuItem = new
System.Windows.Forms.
ToolStripMenuItem();

static
private System.Windows.Forms.
ToolStripMenuItem newToolStripMenuItem;
mais le concepeteur graphique m'efface automatiquement tous les éléments du menu qui sont déclarés avec static

je suis un débutant donc si vous avez une idée de koi je parle merci d'avance de votre aide parlant des delegates je comprend pas trop ...

je compte beaucoup sur votre aide
Commenter la réponse de cs_naylouvar
Messages postés
296
Date d'inscription
mardi 22 avril 2008
Statut
Membre
Dernière intervention
18 août 2008
0
Merci
Tu peux mettre le code complet de tes 2 classes s'il te plait ? J'arrive pas a voir où ca peut bloquer avec juste ta fonction
Commenter la réponse de Liverion
Messages postés
37
Date d'inscription
mardi 14 février 2006
Statut
Membre
Dernière intervention
4 mai 2010
0
Merci
Merci Liverion pour l'interet que vous avez donner à mon sujet:
voici le lien pour telecharger la solution complete (Format 2008)
la compilation donne l'erreur  suivante:
Erreur 1 Une référence d'objet est requise pour la propriété, la méthode ou le champ non statique 'TestMenu.MDIParent1.newToolStripMenuItem'
le lien est le suivant:

http://www.ourbati.com/menu.zip

Merci une autre fois
Commenter la réponse de cs_naylouvar
Messages postés
37
Date d'inscription
mardi 14 février 2006
Statut
Membre
Dernière intervention
4 mai 2010
0
Merci
oui oui oui ça marche merci Liverion mille merci
Commenter la réponse de cs_naylouvar
Messages postés
37
Date d'inscription
mardi 14 février 2006
Statut
Membre
Dernière intervention
4 mai 2010
0
Merci
Bon voilà apres 20jours de recherche sur internet j'ai réussis finalement et c'est grace à toi Liverion :-) bon je vais le mettre sur le site comme code de référence pour tout le monde @+
Merci encore
Commenter la réponse de cs_naylouvar
Messages postés
296
Date d'inscription
mardi 22 avril 2008
Statut
Membre
Dernière intervention
18 août 2008
0
Merci
De rien, heureux d'avoir pu t'aider ^^

On peut écrire francais sur un clavier allemand , c'est juste plus long !!!
Commenter la réponse de Liverion