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 :

Accéder à un TMenuItem créé dynamiquement


Sujet :

Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 123
    Points : 63
    Points
    63
    Par défaut Accéder à un TMenuItem créé dynamiquement
    Bonjour,
    j'ai dans un PopMenu, un menu 'Exemple' ayant pour nom Exemple1.
    j'ajoute dynamiquement 4 Menus només M1, M2, M3 et M4.

    plus tard, je voudrais accéder à ces menu pour les rendre invisible, par exemple.


    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
     
     
    var
      i: byte;
      NewItem: TMenuItem;
    begin
      for i:=1 to 4 do begin                                 // création des 4 menus
        NexItem:=TMenuItem.create(PopMenu1);
        NexItem.caption:='M '+InToStr(i);
        NexItem.name:='M'+InToStr(i);                           // nom du menu
        PopMenu1.Items.Add(NewItem);
      end;
     
      // !!!!!!!   ici je voudrais accéder aux menus créés   !!!!!!
      With TMenuItem(FindComponent('M2') do
        visible:=false;                                     // ici, ça ne marche pas --> il n'a pas trouvé le menu que je viens de créer
    end;
    si je met à la place de M2, le nom du menu créé en statique (Exemple1), cela fonctionne normalement.
    merci pour votre aide

  2. #2
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut
    Soit tu les crées et conserve une référence dans un tableau, soit tu te sers d'un FindComponent('Exemple1') as TPopMenu pour lister ses Items.
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  3. #3
    Membre confirmé Avatar de cantador
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2006
    Messages : 569
    Points : 484
    Points
    484
    Par défaut
    tu peux le faire au niveau de la création directe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if i = 2 then NewItem.Enabled := false;
    mais ce n'est pas tout à fait ce que tu souhaites faire..

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 123
    Points : 63
    Points
    63
    Par défaut Accéder à un TMenuItem créé dynamiquement
    Bonjour,
    tout d'abord, merci pour vos réponses.

    Pour Cantador:
    j'avais trouvé cette solution, mais je souhaite agir sur ces menus beaucoup plus tard dans le programme, et il faut donc que le composant soit retrouvé avec son nom.

    Pour Tourlourou:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    With TMenuItem(FindComponent('Exemple1') do
        visible:=false;
    ce bout de code fonctionne, mais ce menu est créé statiquement,
    c'est lorsque j'essaye d'en créer un dynamiquement que je n'arrive plus à y accéder


    "tu les crées et conserve une référence dans un tableau"
    oui, c'est peut-être la solution, mais un exemple serait le bienvenu.

    de plus je préfèrerais y accéder tout simplement par le nom de ce menu. (M1, M2, M3 ou M4)

  5. #5
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 693
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 693
    Points : 13 128
    Points
    13 128
    Par défaut
    Citation Envoyé par neho88 Voir le message
    ce bout de code fonctionne, mais ce menu est créé statiquement,
    c'est lorsque j'essaye d'en créer un dynamiquement que je n'arrive plus à y accéder
    FindComponent est une méthode d'objet et énumère les composants possédés par cet objet.

    Lorsque qu'un menu est ajouté au design, c'est la fiche le propriétaire mais comme tu le crées ici dynamiquement par TMenuItem.create(PopMenu1), il appartient à PopMenu1.

    Il faut donc soit utiliser PopMenu1.FindComponent(), soit fixer la fiche comme propriétaire par TMenuItem.create(Self)

  6. #6
    Membre confirmé Avatar de cantador
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2006
    Messages : 569
    Points : 484
    Points
    484
    Par défaut
    @neho88 :

    en se servant de l'évènement OnPopup :

    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
    44
    45
    46
    47
    48
    49
    50
     
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, Menus, StdCtrls;
     
    type
      TForm1 = class(TForm)
        PopupMenu1: TPopupMenu;
        procedure FormCreate(Sender: TObject);
        procedure PopupMenu1Popup(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
      NewItem: TMenuItem;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.FormCreate(Sender: TObject);
    var
      i: byte;
    begin
      for i := 1 to 4 do begin // création des 4 menus
        NewItem := TMenuItem.create(self);
        NewItem.caption := 'M ' + IntToStr(i);
        NewItem.name := 'M' + IntToStr(i); // nom du menu
        PopupMenu1.Items.Add(NewItem);
      end;
    end;
     
    procedure TForm1.PopupMenu1Popup(Sender: TObject);
    var
      i: integer;
    begin
      for i := 0 to ComponentCount - 1 do
        if Components[i] is TMenuItem then
          if TMenuItem(components[i]).Name = 'M2' then
            TMenuItem(components[i]).Enabled := false;
    end;
    end.
    on pourrait bien sûr agrémenter l'exercice en prévoyant des cases à cocher qu'on lirait..etc

    @+

  7. #7
    Membre confirmé Avatar de cantador
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2006
    Messages : 569
    Points : 484
    Points
    484
    Par défaut
    ce code reste néanmoins superficiel et montre juste une piste de réflexion..
    il faut penser à libérer les objets créés et pour faire les choses bien, il est nécessaire également de stocker
    l'information quelque part si on veut pouvoir la modifier ultérieurement (fichier ini ou table) dans une page administrateur par exemple.
    @+

  8. #8
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 419
    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 419
    Points : 5 818
    Points
    5 818
    Par défaut
    salut

    as tu essayé un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    var
      ITm : TItemMenu;
    ...
    Begin
    ...
      ITm := PopMenu1.items.find('M2');
      ITm.enabled := ...
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  9. #9
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 387
    Points : 2 999
    Points
    2 999
    Par défaut
    La version de Delphi n'étant pas indiquée, voici le code corrigé sous Berlin:

    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
      i: byte;
      NewItem: TMenuItem;
    begin
      for i := 1 to 4 do
      begin // création des 4 menus
        NewItem := TMenuItem.create(PopupMenu1);
        NewItem.name := 'M' + InTtoStr(i); // nom du menu
        NewItem.caption := NewItem.name;
        PopupMenu1.Items.Add(NewItem);
      end;
     
      PopupMenu1.Items.Find('M1').visible := false;
    Sinon:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NewItem := PopupMenu1.FindComponent('M1') as TMenuItem;

Discussions similaires

  1. Réponses: 2
    Dernier message: 06/05/2014, 09h16
  2. Accéder aux controles générés dynamiquement xaml
    Par bobylastar49 dans le forum C#
    Réponses: 1
    Dernier message: 04/06/2013, 01h24
  3. Accéder à un objet créé dynamiquement
    Par c4rr3r4 dans le forum VB.NET
    Réponses: 1
    Dernier message: 21/01/2011, 09h49
  4. Réponses: 3
    Dernier message: 29/05/2007, 10h17
  5. [BDS2006] Erreur création dynamique TMenuItem
    Par FredericB dans le forum C++Builder
    Réponses: 1
    Dernier message: 19/08/2006, 19h08

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