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

Langage Delphi Discussion :

Comment ouvrir un sous menu


Sujet :

Langage Delphi

  1. #1
    Membre averti Avatar de franckcl
    Homme Profil pro
    Developpeur Delphi
    Inscrit en
    Septembre 2004
    Messages
    516
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Developpeur Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2004
    Messages : 516
    Points : 443
    Points
    443
    Par défaut Comment ouvrir un sous menu
    Bonjour,

    J'ai un élément de menu "Windows" dans le menu principal, depuis lequel je voudrais créer un sous menu par fenêtre ouverte (à la facon du menu window d'une application MDI)

    Sur l'évènement OnClick du menu Window je créé les sous menu comme suit (pour l'exemple uniquement):
    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
     
    procedure TFormApp.MenuWindowClick(Sender: TObject);
    Var
      i : integer;
      Menu:TMenuItem;
    begin
      while MenuWindow.Count>0 do TMenuItem(MenuWindow.Items[0]).free;
     
      For i:=0 to 10 do
      Begin
        Menu := TMenuItem.Create(MenuWindow);
        Menu.Caption := 'Menu #'+IntToStr(i+1);
        MenuWindow.Add(Menu);
      End;
    end;
    Mais le problème est que le menu window ne s'ouvre pas et ne laisse donc pas apparaitre les sous menu?
    Quelle solution à ce problème ?
    Existe-t-il une fonction du genre MenuWindow.expand ?? Je n'ai pas trouvé.

    merci
    Franck

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 577
    Points : 25 225
    Points
    25 225
    Par défaut
    C'est surtout trop tard !
    Pour que MenuWindow affiche la fleche de sous-menu, il faut les générer avant que cela affiche le Menu
    Il faudrait le faire dans le OnClick du Parent de MenuWindow

    Si c'est directement un Menu en racine à un TMainMenu,
    Idem, c'est trop tard !
    et cela se complique car on n'a plus de parent pour anticiper l'ouverture


    Je ne vois qu'un moyen propre, c'est de remplir le Menu lorsque l'on instance et libère une fenêtre
    Un code POO bien fait permettrait de gérer cela de façon élégante par un jeu de notification mais c'est un peu long à écrire du code propre

    Donc il existe la technique dégueux
    Simuler ALT + F
    tu auras un petit défaut de réaction du Menu selon le focus
    le bouton Btn4 permet de créer des fenêtres et ainsi voir le menu s'enrichir !


    F étant le F de '&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
    15
    16
    17
     
    const
      UM_DELAYED_POPUP = WM_USER + 1;
     
    type
      TZooShaiVCLMainForm = class(TForm)
        MainMenu1: TMainMenu;
        mnuttt: TMenuItem;
        btn4: TBitBtn;
        procedure mnutttClick(Sender: TObject);
        procedure btn4Click(Sender: TObject);
      private
        { Déclarations privées }
        procedure DelayedPopup(var AMessage: TMessage); message UM_DELAYED_POPUP;
      public
        { Déclarations publiques }
      end;
    Code dfm : 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
    18
     
    object MainMenu1: TMainMenu
      Left = 114
      Top = 35
      object mnuttt: TMenuItem
        Caption = 'ttt &F ttt'
        OnClick = mnutttClick
      end
    end
    object btn4: TBitBtn
      Left = 150
      Top = 150
      Width = 75
      Height = 25
      Caption = 'btn4'
      TabOrder = 3
      OnClick = btn4Click
    end
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    procedure TZooShaiVCLMainForm.DelayedPopup(var AMessage: TMessage);
    Var
      i : integer;
      Menu:TMenuItem;
    begin
      if mnuttt.Count <> Screen.FormCount then
      begin
        mnuttt.Clear();
     
        For i := 0 to Screen.FormCount - 1 do
        Begin
          Menu := TMenuItem.Create(mnuttt);
          Menu.Caption := Screen.Forms[I].Caption;
          mnuttt.Add(Menu);
        end;
     
        keybd_event(VK_MENU, 0, 0, 0);
        keybd_event(Ord('F'), 0, 0, 0);
        keybd_event(VK_MENU, 0, KEYEVENTF_KEYUP, 0);
        keybd_event(Ord('F'), 0, KEYEVENTF_KEYUP, 0);
      end;
    end;
     
    procedure TZooShaiVCLMainForm.mnutttClick(Sender: TObject);
    begin
      PostMessage(Self.Handle, UM_DELAYED_POPUP, 0, 0);
    end;
     
    procedure TZooShaiVCLMainForm.btn4Click(Sender: TObject);
    begin
      with TForm.Create(Self) do
      begin
        Caption := DateTimeToStr(Now());
        Show();
      end;
    end;


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while MenuWindow.Count>0 do TMenuItem(MenuWindow.Items[0]).free;
    Pourquoi ne pas faire simple ?
    Clear Retire et libère tous les éléments de menu énumérés dans la propriété Items.

  3. #3
    Membre averti Avatar de franckcl
    Homme Profil pro
    Developpeur Delphi
    Inscrit en
    Septembre 2004
    Messages
    516
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Developpeur Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2004
    Messages : 516
    Points : 443
    Points
    443
    Par défaut
    Merci.
    Comme tu dis qu'il n'y a pas de solution simple alors j'ai trouvé du coup autre chose.

    A la création de ma fiche principale, je créé 50 sous menu qui sont initialement invisibles.
    Dans le OnClick de MenuWindow je rends visible uniquement un nombre de sous menu Equivallent au nombre de fenêtre ouverte et je renseigne les propriété Caption.
    J'ai fait un essai, ça marche.

    merci.

  4. #4
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 504
    Points : 2 773
    Points
    2 773
    Billets dans le blog
    10
    Par défaut
    Citation Envoyé par franckcl Voir le message
    Bonjour,

    J'ai un élément de menu "Windows" dans le menu principal, depuis lequel je voudrais créer un sous menu par fenêtre ouverte (à la facon du menu window d'une application MDI)
    ...
    Je pense que la solution peut ressembler à celà
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Var
      i1 : integer;
      Menu:TMenuItem;
     
    begin
      while MenuWindow.Items.Count>0 do TMenuItem(MenuWindow.Items[0]).free;
      For i1 :=0 to 10 do
      Begin
        Menu := TMenuItem.Create(MenuWindow);
        Menu.Caption := 'Menu #'+IntToStr(i1+1);
        MenuWindow.Items.Add(Menu);
      End;
    end;

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

Discussions similaires

  1. [debutant] ouvrir un sous menu
    Par jerem721 dans le forum Interfaces Graphiques en Java
    Réponses: 2
    Dernier message: 13/01/2008, 18h31
  2. Comment faire un sous menu :>
    Par kynri dans le forum Windows
    Réponses: 2
    Dernier message: 09/12/2007, 18h18
  3. Comment placer un sous menu déroulant
    Par boo64 dans le forum Mise en page CSS
    Réponses: 10
    Dernier message: 10/01/2007, 23h26
  4. Wxpython: Comment ajouter un sous-menu ?
    Par p_ping dans le forum wxPython
    Réponses: 2
    Dernier message: 20/06/2006, 10h04
  5. Réponses: 9
    Dernier message: 14/10/2003, 15h35

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