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

Composants VCL Delphi Discussion :

Imbriquer des Menus


Sujet :

Composants VCL Delphi

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    203
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2007
    Messages : 203
    Points : 146
    Points
    146
    Par défaut Imbriquer des Menus
    Bonsoir delphiste,

    Je cherche à imbriquer un TMenu au sein d'un autre TMenu.

    Je m'explique : Prenons par exemple un TMenu nommé Menu1 avec un seul item appelé Item1 (TMenuItem) et un autre TMenu appelé Menu2.

    Ce que je cherche à faire est d'imbriquer le Menu2 en tant que sous menu de l'item Item1 du Menu1.

    Donc en code : (Exemple farfelue)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Menu1.Item1.SubMenu := Menu2
    J'ai testé de différentes façons pour enfin obtenir un message d'erreur indiquant la réutilisation d'un menu.

    Bref, existe t-il une façon de parvenir à mes fins?

    Merci à tous.

  2. #2
    rsc
    rsc est déconnecté
    Membre éprouvé
    Avatar de rsc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 711
    Points : 918
    Points
    918
    Par défaut
    J'essaierais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Item1.Items.Assign(Menu2.Items);

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    203
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2007
    Messages : 203
    Points : 146
    Points
    146
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Item1.Items.Assign(Menu2.Items);
    Ceci ne compile pas : [Error] '[' expected but '.' found

    De plus,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Menu1.Items[0].Assign(Menu2.Items)
    raised exception class EConvertError with message 'Cannot assign a TMenuItem to a TMenuItem'. Process stopped. Use Step or Run to continue.

    Bien essayé

  4. #4
    rsc
    rsc est déconnecté
    Membre éprouvé
    Avatar de rsc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 711
    Points : 918
    Points
    918
    Par défaut
    Oui, au temps pour moi, il n'y a pas de propriété Items, mais seulement Items[..].
    Ceci devrait marcher à défaut de mieux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for i := 0 to Item1.Count - 1 do
    Item1.Add(Menu2.Items[i]);

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    203
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2007
    Messages : 203
    Points : 146
    Points
    146
    Par défaut
    J'avais déjà essayé ... Désolé

    raised exception class EMenuError with message 'Menu inserted twice'.
    Merci quand même

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Février 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 141
    Points : 142
    Points
    142
    Par défaut
    Salut,

    Je te suggère la solution suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
      var
        LMenuItem : TMenuItem;
     
    begin
      while Menu2.Count > 0 do
      begin
        LMenuItem := Menu2.Items[0];
        Menu2.Remove(LMenuItem);
        Menu1.Item1.Add(LMenuItem);
      end;
     
    end;
    Cette solution vide le premier menu.
    Tu peux aussi essayer de dupliquer les éléments :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    function CloneMenuItem( const ASrc : TMenuItem ) : TMenuItem;
    begin
      Result := TMenuItem.Create( ASrc.Owner );
      Result.Name := ASrc.Name + 'bis'; //il n'est pas nécessaire d'avoir un nom unique, mais si tu y tiens tu peux assigner le nom ici
      Result.Caption := ASrc.Caption;
      Result.OnClick := ASrc.OnClick;
      //il faut que tu penses à dupliquer toutes les propriétés que tu as pu modifier...
      //je ne connais pas de fonction générique pour cloner un objet en Delphi
    end;
     
    //puis plus loin :
      for LMenuItem in Menu2 do
        Menu1.Item1.Add( CloneMenuItem(LMenuItem) );

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    203
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2007
    Messages : 203
    Points : 146
    Points
    146
    Par défaut
    Merci pour vos réponses,

    Je ne peut accepter la première réponse car les deux menus sont nécessaires.

    J'ai pour seul but d'éviter de coder 2 fois le même menu.

    Votre deuxième solution me paraît exacte mais toutefois, cela ne m'apporte pas de réel changement car j'assigne l'évènement du menu1.item1click au menu2.item1click en conception.

    Donc le principe reste le même à la différence qu'avec votre solution, l'évènement est affecter au Run Time.

    En conclusion, il est impossible d'assigner un menu en tant que sous menu ...

    Bref, merci beaucoup, mais je crois que je vais devoir garder la même méthode

  8. #8
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 441
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 441
    Points : 5 861
    Points
    5 861
    Par défaut
    salut


    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
    16
    17
     
     
     Function CloneMenuitem( sourceitem: TMenuItem ): TMenuItem;
    Var
      i: Integer;
    Begin
      With sourceitem Do 
      Begin
         Result := NewItem( Caption, Shortcut, Checked, Enabled, OnClick, 
    HelpContext, Name+'Copy' );
        For i:= 0 To count-1 Do
          Result.Add( CloneMenuItem( Items[i] ));
      End;
    End;
     
    //Dans le oncreate de ta form  
       MainMenu.items[0].add(CloneMenuitem(Popupmenutem))

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Février 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 141
    Points : 142
    Points
    142
    Par défaut
    Citation Envoyé par pepi22 Voir le message
    J'ai pour seul but d'éviter de coder 2 fois le même menu.

    Votre deuxième solution me paraît exacte mais toutefois, cela ne m'apporte pas de réel changement car j'assigne l'évènement du menu1.item1click au menu2.item1click en conception.

    Donc le principe reste le même à la différence qu'avec votre solution, l'évènement est affecter au Run Time.
    Je ne suis pas sûr d'avoir compris ta remarque?

    En utilisant le code d'anapurna, tu peux créer un unique menu en conception et le coller, au runtime, dans tous les menus que tu veux.

    Tu demandais un moyen de faire ça depuis le concepteur? Regarde les commandes que tu as en faisant un clic droit sur un item du menu depuis l'éditeur de menu. Les commandes "Enregistrer comme modèle.../Insérer depuis un modèle..." ne copient malheureusement pas le OnClick.
    Une autre solution est de regarder le code du dfm (clic droit npt où sur ta fiche, "Voir comme texte") de répérer la partie correspondant au menu que tu veux dupliquer, de la copier/coller à l'endroit où tu veux dupliquer le menu, puis de revenir en mode fiche (clic droit sur le fichier "Voir comme fiche").

    Personnellement, je pense que dupliquer des trucs dans le dfm n'est pas une bonne solution - après, il faut penser à répercuter les changements entre les deux copies... Si tu veux vraiment une copie conforme de ton menu à l'exécution, utilise la fonction d'anapurna.

  10. #10
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 441
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 441
    Points : 5 861
    Points
    5 861
    Par défaut
    salut


    si ce nest que les actions que tu ne veut pas coder deux fois utilise les actionlist c'est fait pour cela
    tu defini tes actions est ensuite tu les assign a tes item de menu

    @+ Phil

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 24/08/2005, 11h21
  2. Menu dans la barre des menus OS X
    Par SHiSo dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 02/06/2005, 20h16
  3. Wait cursor et accessibilité des menus
    Par Depteam1 dans le forum MFC
    Réponses: 3
    Dernier message: 23/09/2004, 19h01
  4. Imbriquer des logic:iterate
    Par lalou33 dans le forum Struts 1
    Réponses: 4
    Dernier message: 16/06/2004, 10h31
  5. Réponses: 12
    Dernier message: 18/03/2004, 15h09

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