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

C++Builder Discussion :

Problème avec mon menu


Sujet :

C++Builder

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2002
    Messages : 28
    Points : 32
    Points
    32
    Par défaut Problème avec mon menu
    Bonjour à tous ,

    Voilà , je vous explique mon problème :

    j'essaye actuellement de développer une application MDI avec C++ Builder 6 seulement j'ai un gros problème avec mon menu.
    En effet , lors du clic sur une des options du menu , tout se passe correctement. Lors de l'ouverture de la fenêtre je fais un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FenetrePrin->menu1>enabled = false
    et cela fonctionne parfaitement.
    Lors de la fermeture de la fenetre , je fais un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FenetrePrin->menu1>enabled = true
    et le menu se reactive.

    Jusque la tout va bien me direz vous ...

    Seulement lorsque je clique une seconde fois sur ce menu , la fenêtre s'affiche à nouveau ,je la ferme et la ca commence à deconner.
    LE menu ne veut plus se remettre à "true" et si je lance d'autres menus , meme chose il se désactive lors de l'ouverture de la fenêtre mais ne se réactive plus lors de la fermeture de celle ci ..

    Est ce que quelqu'un aurait une idée ??

    Merci d'avance

    Bertrand

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 374
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 374
    Points : 1 759
    Points
    1 759
    Par défaut
    Salut !

    Si une rubrique du menu doit être activée par une fenêtre et donc non activée par d'autres, je pense qu'il serait plus judicieux de le faire depuis l'événement OnActivate.
    En fait, il faut développer une méthode membre de la MDIForm qui sera appelée lors du OnActivate de chaque MDIChild.
    Dans cette méthode, il suffit de tester la classe de la ActiveMDIChild et selon, agir sur la rubrique du menu.
    Ca dépend aussi du nombre de classes de fenêtres et de leur implication dans l'action.
    Pour deux fenêtres (l'une qui rend enabled et l'autre non) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void __fastcall TForm1::WhenActivate() // à déclarer dans la class de la MDIForm
    {
    bool enabled = false;
    if(ActiveMDIChild != NULL) // au cas où...
        {
        enabled = ActiveMDIChild->ClassNameIs("...");
        }
     
    ...->Enabled =  enabled;
    }
    Ce qui permet d'activer le menu uniquement s'il existe une fenetre active correspondante.

    Dans la OnActivate des MDIChild on aura donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Form1->WhenActivate(); // et rien d'autre
    En espérant que cela apporte un élément de réponse à ton problème !

    A plus !

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2002
    Messages : 28
    Points : 32
    Points
    32
    Par défaut
    Merci pour la réponse rapide.

    Cela m'aide mais seulement en partie ..

    En fait , c'est l'inverse que je fais .

    Lorsque je clique sur le menu de la fenetre mdi "Mère" , cela ouvre une mdichild.
    Je désactive alors le menu qui vient d'être cliqué afin de ne plus pouvoir ouvrir de fenêtre fille correspondant au menu cliqué..

    J'espère que je me suis fait comprendre et que qq1 pourra m'aider

  4. #4
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 374
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 374
    Points : 1 759
    Points
    1 759
    Par défaut
    Salut !

    J'ai rajouté un flag dans la class de la MDIForm :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    public :
    bool ChildCanClose;
    J'ai deux menus permettant de créer 2 fenêtres :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    void __fastcall TForm1::Nouveau1Click(TObject *Sender)
    {
    new TForm2(Owner);
    Nouveau1->Enabled = false;
    Fermer1->Enabled = true;
    }
    //--
    void __fastcall TForm1::Nouveau2Click(TObject *Sender)
    {
    new TForm3(Owner);
    Nouveau2->Enabled = false;
    Fermer1->Enabled = true;
    }
    //--
    J'ai un menu permettant de fermer la fenêtre active (n'importe la quelle) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    void __fastcall TForm1::Fermer1Click(TObject *Sender)
    {
    if(ActiveMDIChild != NULL) //au cas où... bien que...
        {
        ChildCanClose = true;
        if(ActiveMDIChild->ClassNameIs("TForm2")) Nouveau1->Enabled = true;
        if(ActiveMDIChild->ClassNameIs("TForm3")) Nouveau2->Enabled = true;
        ActiveMDIChild->Close();
        ChildCanClose = false;
        //Pour que ActiveMDIChild soit actualisé (en tout cas pour mon BCB3 Pro)
        Application->ProcessMessages();
        }
    //Donc à partir d'ici je peux tester
    if(ActiveMDIChild == NULL) Fermer1->Enabled = false;
    }
    Dans la OnClose pour chaque MDIChild :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void __fastcall TForm2::FormClose(TObject *Sender, TCloseAction &Action)
    {
    if(Form1->ChildCanClose)
        {
        Action = caFree;
        }
    }

    Au départ je n'ai aucune fenetre enfant d'affichée donc :
    - les deux menus Nouveau..->Enabled sont true
    - Fermer1->Enabled est false.

    Ca semble fonctionner !

    A plus !

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2002
    Messages : 28
    Points : 32
    Points
    32
    Par défaut
    Un grand merci henderson ...

    Ce que tu m'as donné comme réponse m'a aidé pour un autre problème que j'avais...

    Pour ce qui est du problème que j'avais , j'ai trouvé d'ou ca venait...

    Lors du lancement du programme , je lancais 2 fois la fenetre mere ... ce qui creait pas mal d'erreurs ( dont celle du menu )

    TRES GROSSE ERREUR D'ATTENTION DE MA PART ( a vouloir aller trop vite ... )

    Merci quand même

    @+

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

Discussions similaires

  1. [AC-2007] Problème avec mon Menu en VBA
    Par nefertari dans le forum VBA Access
    Réponses: 2
    Dernier message: 19/03/2010, 12h25
  2. Problème avec mon menu
    Par tang le breton dans le forum Mise en page CSS
    Réponses: 1
    Dernier message: 17/12/2009, 15h56
  3. [CSS 2] Problème avec mon menu sous IE
    Par Tchupa dans le forum Mise en page CSS
    Réponses: 8
    Dernier message: 06/03/2009, 10h43
  4. problème avec mon menu fixe
    Par kirjava dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 26/05/2008, 10h41
  5. Un tout petit problème avec mon menu contextuel
    Par jbrasselet dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 05/10/2007, 15h40

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