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 :

création dynamique d'un sous-menu


Sujet :

Delphi

  1. #1
    Membre confirmé
    Avatar de OutOfRange
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 533
    Points : 474
    Points
    474
    Par défaut création dynamique d'un sous-menu
    Bonjour
    Ma fiche contient un popupmenu
    Les éléments de menus sont créés dynamiquement
    A la conception, je ne connais ni leur nombre, ni leur nom
    Pourtant j'ai besoin de créér dynamiquement les items qui seront des sous-menus de ce popup
    Voici mon code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    itemparent:=Tmenuitem(findcomponent('menfam'+inttostr(nbfam)));
    nouvmenu:=TMenuItem.Create(itemparent);
    nouvmenu.Name:='menrub'+inttostr(c);
    nouvmenu.Caption:=rub[c];
    itemparent.Insert(0,nouvmenu);
    qui compile sans pb mais plante à l'exécution, lors de l'insertion (dernière ligne)
    ---------------------rectification
    J'avais oublié que je gère une exception + haut et je lançais l'appli depuis l'EDI...
    En fait, il n'y a pas de plantage, mais aucun sous-menu n'est inséré
    Je vais essayer de voir d'où peut venir l'erreur, avant de délester
    Merci pour votre aide

  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
    Il faudrait déterminer précisément (par exemple en exécutant pas-à-pas) quelle ligne plante. Le pb avec la gestion des erreurs, c'est qu'elle "couvre" toutes les erreurs qui ne sont pas explicitement gérées. Il se peut donc que FindComponent ne ramène rien, que IntToStr ou rub [c], etc... renvoie une erreur.
    Au niveau du code, la seule chose qui me pose problème est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nouvmenu:=TMenuItem.Create(itemparent);
    Le paramètre le Create étant l'Owner, j'aurais écrit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nouvmenu:=TMenuItem.Create(Self);

  3. #3
    Membre confirmé
    Avatar de OutOfRange
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 533
    Points : 474
    Points
    474
    Par défaut
    Salut rsc

    Effectivement, l'erreur venait du paramètre du create
    Ce qui signifierait que le Owner d'un TMenuItem ne peut pas être un autre TMenuItem
    Je pensais en faisant comme j'ai fait, me dispenser du destructeur, le menu auquel appartient mon "sous menu" étant détruit avec la fiche
    Bon, va falloir réviser la création dynamique de composants

    D'ailleurs, je n'ai jamais compris comment le Owner d'un composant pouvait être ce composant lui-même

    Décidement, la POO ne m'a pas encore révélé tous ses secrets

    Merci rsc

  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
    Citation Envoyé par OutOfRange
    D'ailleurs, je n'ai jamais compris comment le Owner d'un composant pouvait être ce composant lui-même
    C'est effectivement impossible !
    Si c'est le Create (Self) qui te fait dire cela, note que le Self ne représente pas le composant, mais la TForm, dans la mesure où ton code se trouve généralement dans une procédure d'objet TMyForm.MaProcedure.
    Essaie d'utiliser Self dans une procédure "simple" (Procedure FaitCela) et tu auras une erreur de compilation (sauf si c'est dans un bloc with, mais c'est une autre histoire).

  5. #5
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 290
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 290
    Points : 1 941
    Points
    1 941
    Par défaut
    Self n'est pas le composant mais la fiche ici non?

  6. #6
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Pour ajouter et créer un sous menu, il te suffit de rajouter un menuitem dans un menuitem

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    MonNouveauMenuItem := TMenuitem.Create(LePopUpMenu);
    // configuration e ton MenuItem
    MonNouveauMenuIem.caption := 'test';
     
    // Ajout du MenuItem dans le MenuItem qu'on veut faire devenir sous menu
    MonSousMenu.add(MonNouveauMenuItem);

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

    il y a plus simple pour creer des menu dynamique
    ...
    utiliser les fonction de l'unité menus
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    function NewMenu(Owner: TComponent; const AName: string; const Items: array of TMenuItem): TMainMenu;
    function NewPopupMenu(Owner: TComponent; const AName: string;
      Alignment: TPopupAlignment; AutoPopup: Boolean; const Items: array of TMenuItem): TPopupMenu;
    function NewSubMenu(const ACaption: string; hCtx: THelpContext;
      const AName: string; const Items: array of TMenuItem; AEnabled: Boolean = True): TMenuItem;
    function NewItem(const ACaption: string; AShortCut: TShortCut;
      AChecked, AEnabled: Boolean; AOnClick: TNotifyEvent; hCtx: THelpContext;
      const AName: string): TMenuItem;
    function NewLine: TMenuItem;
    @+ Phil

  8. #8
    Membre confirmé
    Avatar de OutOfRange
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 533
    Points : 474
    Points
    474
    Par défaut
    Bonjour
    Citation Envoyé par rsc & Linkin
    Si c'est le Create (Self) qui te fait dire cela, note que le Self ne représente pas le composant, mais la TForm, dans la mesure où ton code se trouve généralement dans une procédure d'objet TMyForm.MaProcedure.
    Je comprends mieux maintenant. Faut dire que l'aide sur self n'est pas des plus limpides... (je n'ai pas encore assimilé tout ce jargon pascalien...)
    Citation Envoyé par anapurna
    l y a plus simple pour creer des menu dynamique
    ...
    utiliser les fonction de l'unité menus
    OK, avec toutefois une 'tite réserve
    Citation Envoyé par aide D6
    L'élément renvoyé par NewItem n'a pas de propriétaire. Vous êtes responsable de la libération de sa mémoire lorsqu'elle n'est plus nécessaire. Les méthodes Delete et Remove de TMenuItem ne libèrent pas la mémoire.
    Alors qu'avec la méthode create(self), mon item est détruit et sa place mémoire libérée avec la fiche...
    Bon j'espère cette fois avoir tout bien compris

    Meci à tous

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

Discussions similaires

  1. Création dynamique de sous menu
    Par mhb3010 dans le forum C++Builder
    Réponses: 1
    Dernier message: 19/09/2008, 10h08
  2. Sous menu Dynamique
    Par philippe30 dans le forum Delphi
    Réponses: 2
    Dernier message: 25/05/2006, 17h04
  3. [VB6] sous menu dynamique
    Par malhivertman1 dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 07/03/2006, 14h13
  4. [PopupMenu] Créer dynamiquement un sous menu (submenu)
    Par MiJack dans le forum Composants VCL
    Réponses: 4
    Dernier message: 01/02/2006, 13h41
  5. Créer un sous-menu dynamiquement
    Par PurL dans le forum C++Builder
    Réponses: 4
    Dernier message: 09/09/2004, 10h31

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