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

Lazarus Pascal Discussion :

Récupérer le nom du menu parent (PopupMenu) de l'option cliquée [Lazarus]


Sujet :

Lazarus Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mars 2009
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 16
    Par défaut Récupérer le nom du menu parent (PopupMenu) de l'option cliquée
    Bonjour,

    jusqu'à présent, j'ai utilisé FreePascal pour des petits projets rapidement prototypés et c'etait très bien, le langage est rapide, plus agréable à utiliser que le C mais je m'attaque à un projet GUI et j'ai un problème. Je me rends compte que la doc de Lazarus/FreePascal est vraiment insuffisante et pas du tout explicite (par exemple citer les fonctions, c'est bien mais il y a très peu d'exemples). Bon voici ma question :

    j'ai créé un menu popup dynamique contrôlé par un TrayIcon ; tout se passe bien, j'ai donc un menu qui s'affiche correctement, j'ai lié les options à une procédure MyPopupEvent pour récupérer le nom de l'option du menu cliqué et ça marche bien, je récupère l'info par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    var
    ResCH : string;
     
    ResCH := (sender as TmenuItem).caption;
    Maintenant le problème. Je voudrais récupérer également le nom du menu parent de l'option cliquée et là ça coince : j'ai récupéré un exemple sur le net que j'ai modifié :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    var
    ALabel : TLabel;
    Caller : TComponent;   
     
    Caller := ((Sender as TMenuItem).GetParentMenu as TPopupMenu).PopupComponent;
    ALabel := TLabel(Caller);  
     
    ShowMessage(ALabel.Caption);  // il semble que cette ligne provoque une erreur fatale du genre "le projet a levé une exception de class External:SIGSEGV At Adress ....."
    Le projet se compile pourtant parfaitement ; si vous avez une idée je suis à l'écoute, merci.

  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 jack2020 Voir le message
    maintenant le probleme. je voudrais recuperer egallement le nom du menu parent de l'option clique et la ca coince, j'ai recupere un exemple sur le net que j'ai modifie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    var
    ALabel : TLabel;
    Caller : TComponent;   
     
    Caller := ((Sender as TMenuItem).GetParentMenu as TPopupMenu).PopupComponent;
    ALabel := TLabel(Caller);  
     
    ShowMessage(ALabel.Caption);  // il semble que cette ligne provoque une erreur fatale du genre "le projet a leve une exception de class External:SIGSEGV At Adress ....."
    D'une part, la propriété PopupComponent n'est pas assigné (= nil), d'autre part avant de transtyper un TComponent en TLabel, il faut être sur que le type réel correspond... Sans plus d'information (cf. ci-après), et compte tenu des informations que vous avez fournies, je penserai que le composant est du type TTrayIcon.

    Mais, si on regarde le code affecté à la propriété PopupComponent (clic-droit, chercher la déclaration) du TPopMenu, on constate qu'aucune assignation n'est faite dessus. Il faut donc le faire vous même par code, dans le gestionnaire d'événement OnCreate de la fiche, par exemple.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      PopupMenu1.PopupComponent := TrayIcon1;
    end;
    Ensuite, vous pourrez récupérer l'information (attention car tous les composants n'ont pas de propriété Caption) : TPopupMenu(TMenuItem(Sender).GetParentMenu).PopupComponent.Name

  3. #3
    Membre averti
    Inscrit en
    Mars 2009
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 16
    Par défaut
    Bonjour,

    merci de votre reponse, je pensais que c'etait automatique puisque j'ai utilise lazarus pour creer la form. j'ai assigne comme indique...

    la ligne suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ShowMessage(((Sender as TMenuItem).GetParentMenu as TPopupMenu).PopupComponent.Name);
    renvoie TrayIcon1

    je cree le menu et sous menu par cette methode :

    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
     
    var
      MenuItem, SubMenuItem: TMenuItem;
     
    MenuItem := TMenuItem.Create(PopupMenu1);
    // Affecter à Caption le titre
    MenuItem.Caption := "Menu principal 1";
    // Ajouter au PopupMenu
    PopupMenu1.Items.Add(MenuItem);
     
    // ensuite j'ajoutes sousmenus disons 2 options
     
    SubMenuItem := TMenuItem.Create(MenuItem);
    SubMenuItem.Caption := "Sous menu 1";
    // lier a MyPopupEvent
    SubMenuItem.OnClick := @MyPopupEvent;
    MenuItem.Add(SubMenuItem);
     
    SubMenuItem := TMenuItem.Create(MenuItem);
    SubMenuItem.Caption := "Sous menu 2";
    // lier a MyPopupEvent
    SubMenuItem.OnClick := @MyPopupEvent;
    MenuItem.Add(SubMenuItem);
    je gere manuellement l'activation du popupmenu par le bouton gauche de la souris, je me sers du bouton droit pour faire une demande de fermeture du programme...

    dans MyPopupEvent, je peux recuperer l'option clique par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (sender as TmenuItem).caption;
    mais comment recuperer le libelle du menu parent, par exemple quand je cliques sur "Sous menu 2", comment obtenir "Menu principal 1"

    ca doit etre tout simple, mais ca prend la tete...

  4. #4
    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
    Re,
    Citation Envoyé par jack2020 Voir le message
    mais comment recuperer le libelle du menu parent, par exemple quand je cliques sur "Sous menu 2", comment obtenir "Menu principal 1"
    En interrogeant son Parent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    MenuItem := TMenuItem(Sender);
    if (MenuItem.Parent <> nil) and (MenuItem.Parent is TMenuItem) then
      LibelleMenuParent := TMenuItem(MenuItem.Parent).Caption;
    Si il y a plusieurs sous niveaux, on réitère...

  5. #5
    Membre averti
    Inscrit en
    Mars 2009
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 16
    Par défaut
    Merci beaucoup, ca marche, je crois que je me fais vieux...

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 17/02/2014, 10h28
  2. Récupérer le nom du répertoire parent
    Par nicomax34 dans le forum Langage
    Réponses: 8
    Dernier message: 02/02/2009, 10h17
  3. Récupérer les noms des classes parents
    Par see++ dans le forum Général Python
    Réponses: 2
    Dernier message: 12/03/2007, 17h35
  4. Récupérer le nom du sous-menu
    Par sabbe dans le forum Access
    Réponses: 3
    Dernier message: 18/08/2006, 00h34
  5. [TTreeView] Comment récupérer le nom d'un parent ?
    Par EssaiEncore dans le forum Composants VCL
    Réponses: 2
    Dernier message: 17/11/2005, 16h43

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