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

 Delphi Discussion :

Popup menu : ameliorations de mon code


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mars 2007
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 50
    Par défaut Popup menu : ameliorations de mon code
    Bonjour a tous,

    J'utilise un popup menu avec le code suivant (qui fonctionne) :

    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
    38
    39
    40
    41
    42
    43
     
    Var
        Item_1 : TMenuItem;
        SubItem_1, SubItem_2, SubItem_3, SubItem_4 : TMenuItem;
        I : Integer;   
    const
          NomSubMenu_EMail : Array [1..4] of String=('Informations','Research','Commercial','Formations');
    begin
     
          // Effacer tous les éléments de menu
              PopupMenu1.Items.Clear;
     
          // Créer les éléments de menu
              Item_1 := TMenuItem.Create(PopupMenu1);
          // Ajouter au PopupMenu
              PopupMenu1.Items.Add(Item_1);
          // Affecter à Caption le titre
              Item_1.Caption := 'EMail';
     
              // Créer les éléments de submenu
                  SubItem_1 := TMenuItem.Create(Item_1);
              // Ajouter au PopupMenu
                  Item_1.Add(SubItem_1);
              // Affecter à Caption le titre
                  SubItem_1.Caption := NomSubMenu_EMail[1];
              // Créer les éléments de submenu
                  SubItem_2 := TMenuItem.Create(Item_1);
              // Ajouter au PopupMenu
                  Item_1.Add(SubItem_2);
              // Affecter à Caption le titre
                  SubItem_2.Caption := NomSubMenu_EMail[2];
              // Créer les éléments de submenu
                  SubItem_3 := TMenuItem.Create(Item_1);
              // Ajouter au PopupMenu
                  Item_1.Add(SubItem_3);
              // Affecter à Caption le titre
                  SubItem_3.Caption := NomSubMenu_EMail[3];
              // Créer les éléments de submenu
                  SubItem_4 := TMenuItem.Create(Item_1);
              // Ajouter au PopupMenu
                  Item_1.Add(SubItem_4);
              // Affecter à Caption le titre
                  SubItem_4.Caption := NomSubMenu_EMail[4];
    Mais est-ce qu'il n'y aurait pas moyen de l’améliorer en minimisant le nombre de ligne avec un code comme le suivant (qui ne fonctionne pas : "Access violation at adress.....") :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
                For I:=1 to 4 do
                  begin
                        TMenuItem('SubItem_'+IntToStr(I)).Create(Item_1);
                        TMenuItem('SubItem_'+IntToStr(I)).Add(Item_1);
                        TMenuItem('SubItem_'+IntToStr(I)).Caption:=NomSubMenu_EMail[I];
                  end;
    Par avance, merci d’éclairer ma lanterne.


    j'utilise Win7 et delphi2007

  2. #2
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 786
    Par défaut
    Bonjour,
    Citation Envoyé par drxel Voir le message
    ...un code comme le suivant (qui ne fonctionne pas : "Access violation at adress.....") :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
                For I:=1 to 4 do
                  begin
                        TMenuItem('SubItem_'+IntToStr(I)).Create(Item_1);
                        TMenuItem('SubItem_'+IntToStr(I)).Add(Item_1);
                        TMenuItem('SubItem_'+IntToStr(I)).Caption:=NomSubMenu_EMail[I];
                  end;
    C'est normal, vous dites à Delphi, prends cette chaine de caractères et considères la comme un objet de type TMenuItem...

    Pour optimiser le code, on peut déjà procéder comme suit :
    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
    var
      MenuItem, SubMenuItem: TMenuItem;
      I: Integer;
    const
      NomSubMenu_EMail: array [1..4] of String=('Informations','Research','Commercial','Formations');
    begin
     
    // Effacer tous les éléments de menu
      PopupMenu1.Items.Clear;
     
    // Créer le 1° élément de menu
      MenuItem := TMenuItem.Create(PopupMenu1);
    // Affecter à Caption le titre
      MenuItem.Caption := 'EMail';
    // Ajouter au PopupMenu
      PopupMenu1.Items.Add(MenuItem);
     
    // Créer les 4 sous-menus
      for i := 1 to 4 do
      begin
        // La variable est une variable de travail, donc réutilisable...
        SubMenuItem := TMenuItem.Create(MenuItem);
        SubMenuItem.Caption := NomSubMenu_EMail[i];
        MenuItem.Add(SubMenuItem);
      end;
    end;
    On peut aller encore plus loin, mais il ne faut pas non plus que cela devienne illisible et ne facilite pas la maintenance...

  3. #3
    Membre averti
    Inscrit en
    Mars 2007
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 50
    Par défaut
    Merci de la réponse,

    Ç'est vrai, j'aurais du y penser aussi.

    "C'est normal, vous dites à Delphi, prends cette chaine de caractères et considères la comme un objet de type TMenuItem..."

    Je pensais qu'avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TMenuItem('SubItem_'+IntToStr(I))
    je lui disais : cree moi un "TMenuItem" avec comme nom "('SubItem_'+IntToStr(I))"

    mais bon ça ne doit pas être la bonne formulation.

  4. #4
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 089
    Par défaut
    Pour le code de création, la boucle sans approprié !

    Si tu souhaites retrouver un composant par son nom dans la collections Components du Owner (PopupMenu1 dans le cas présent), il y a la méthode FindComponent !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Membre averti
    Inscrit en
    Mars 2007
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 50
    Par défaut
    Bonjour ShaiLeTroll,

    Justement j'avais vu des exemples de la méthode "FindComponent" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (Findcomponent('Form'+IntToStr(i)+'.Label1') as TLabel).Visible:=True;
    et c'est en voyant ce genre de chose que je me suis dis qu'il y avait peut être moyen de faire quelque chose "d’élégant" avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TMenuItem('SubItem_'+IntToStr(I)).Create(Item_1);

  6. #6
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 786
    Par défaut
    Bonjour,
    On peut nommer les composants lors de leur création dynamique, il suffit de modifier la boucle en rajoutant l'instruction suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SubItem.Name := 'SubItem_' + IntToStr(i);
    Et pour retrouver le composant il suffit de l'instruction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if MenuItem.FindComponent('SubItem_3') <> nil then
        ShowMessage('SubItem_3 Trouvé.')
      else
        ShowMessage('SubItem_3 non trouvé');
    Attention à éviter les doublons lors du nommage...

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

Discussions similaires

  1. Ameliorer mon code
    Par GTSLASH dans le forum C#
    Réponses: 0
    Dernier message: 28/12/2011, 09h54
  2. ameliorer un peu mon code
    Par ssk2510 dans le forum Interfaces Graphiques en Java
    Réponses: 6
    Dernier message: 04/02/2011, 10h03
  3. [langage] algo de bissection dans mon code
    Par killy dans le forum Langage
    Réponses: 5
    Dernier message: 19/01/2004, 18h35
  4. Popup menu ?
    Par AnneOlga dans le forum C++Builder
    Réponses: 2
    Dernier message: 15/12/2003, 16h12
  5. Mettre un popup menu invisible ??
    Par Alberto dans le forum Composants VCL
    Réponses: 2
    Dernier message: 20/12/2002, 09h02

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