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
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : novembre 2005
    Messages : 116
    Points : 60
    Points
    60
    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 634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : mars 2005
    Messages : 3 634
    Points : 10 416
    Points
    10 416
    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 10.3.2 Rio 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 : 463
    Points
    463
    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
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : novembre 2005
    Messages : 116
    Points : 60
    Points
    60
    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
    Profil pro
    Inscrit en
    septembre 2008
    Messages
    5 212
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : septembre 2008
    Messages : 5 212
    Points : 11 535
    Points
    11 535
    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 : 463
    Points
    463
    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 : 463
    Points
    463
    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 156
    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 156
    Points : 5 283
    Points
    5 283
    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 137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : novembre 2007
    Messages : 3 137
    Points : 2 815
    Points
    2 815
    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, 10h16
  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, 02h24
  3. Accéder à un objet créé dynamiquement
    Par c4rr3r4 dans le forum VB.NET
    Réponses: 1
    Dernier message: 21/01/2011, 10h49
  4. Réponses: 3
    Dernier message: 29/05/2007, 11h17
  5. [BDS2006] Erreur création dynamique TMenuItem
    Par FredericB dans le forum C++Builder
    Réponses: 1
    Dernier message: 19/08/2006, 20h08

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