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

C++Builder Discussion :

Evènement OnClick défini dynamiquement


Sujet :

C++Builder

  1. #1
    Membre éprouvé

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 163
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 163
    Points : 1 148
    Points
    1 148
    Par défaut Evènement OnClick défini dynamiquement
    Bonjour à tous,

    après quelques recherches sur le forum et sur developpez.com j'en viens à poster ici.
    Je crée dynamiquement des TMenuItem pour remplir mon TPopupMenu. Je souhaiterais maintenant affecter une méthode à l'évènement OnClick de ces éléments....et là je sèche .

    J'ai ma méthode pour le OnClick déclarée dans ma TMainForm.
    La méthode se trouve dans une autre classe qui n'a pas accès à la classe TMainForm. De ce fait je dois passer la méthode pour le OnClick en tant que paramètre de la méthode de construction du menu.

    Quel type dois-je utiliser ?
    J'ai essayer TNotifyEvent et à tout hasard de passer par un void*, mais j'obtient déjà une erreur Type non autorisé à la compilation.

    Merci d'avance pour votre aide !
    Neilos

  2. #2
    Membre du Club Avatar de bhahmed
    Inscrit en
    Août 2006
    Messages
    84
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Août 2006
    Messages : 84
    Points : 41
    Points
    41
    Par défaut
    peut être ça va t'aider : moi je creè des Timages dynamiques et je leurs affecte les mvts de la sourie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void __fastcall TForm1::ImageDblClick(TObject *Sender)
    void __fastcall TForm1::ImageMouseUp(TObject *Sender, TMouseButton Button,TShiftState Shift, int X, int Y)
    void __fastcall TForm1::ImageMouseMove(TObject *Sender, TShiftState Shift,int X, int Y)
    void __fastcall TForm1::ImageMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y)
    puis j'attribue ces methodes à une image :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Image[i]->OnMouseDown = ImageMouseDown;
    Image[i]->OnMouseMove = ImageMouseMove;
    Image[i]->OnMouseUp   = ImageMouseUp;
    et voici la déclaration des ces méthodes dans le .h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void __fastcall ImageMouseDown(TObject *Sender,
              TMouseButton Button, TShiftState Shift, int X, int Y);
            void __fastcall ImageMouseMove(TObject *Sender, TShiftState Shift,
              int X, int Y);
            void __fastcall ImageMouseUp(TObject *Sender, TMouseButton Button,
              TShiftState Shift, int X, int Y);
            void __fastcall ImageDblClick(TObject *Sender);

  3. #3
    Membre averti

    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2003
    Messages : 288
    Points : 334
    Points
    334
    Par défaut
    Je fais ça avec TNotifyEvent:
    Le call (dans la main form), AddMenuFromPIDL est une simple fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    p3d::AddMenuFromPIDL(lpIdl, mnSender, mnSender->Count,
                                   mnFavoriteShorcutClick, mnFavoriteClick, false);
    La fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    void AddMenuFromPIDL(LPITEMIDLIST pIdl, TMenuItem *mnMenu, int nOffset,
            TNotifyEvent lpfnShellLinkClick, TNotifyEvent lpfnParentClick,
            bool bLoopSubfolders)
    {
    ...
      mnNewItem = new TMenuItem(mnMenu);
      mnNewItem->Caption = AnsiString(lpszName, strlen(lpszName));
      mnNewItem->OnClick = lpfnShellLinkClick;
    ...
    }
    yarp
    www.senosoft.com

  4. #4
    Membre éprouvé

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 163
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 163
    Points : 1 148
    Points
    1 148
    Par défaut
    Merci yarp, mais peut tu encore me montrer le prototype de ta méthode mnFavoriteClick ?

    Merci d'avance.
    Neilos

  5. #5
    Membre averti

    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2003
    Messages : 288
    Points : 334
    Points
    334
    Par défaut
    C'est vraiment un OnClick standard (généré par l'IDE). mnFavorite est un des menus de la TForm (and proud child of TMainMenu .
    Donc dans le .h de la TForm (partie réservée aux contrôles du DFM):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    TMenuItem *mnFavorite;  
     
    void __fastcall mnFavoriteClick(TObject *Sender);
    Par contre mnFavoriteShorcutClick a le même prototype mais n'est pas géré par le dfm (un OnClick programmé en private), mais les 2 cas fonctionnent.

    Je ne sais pas pourquoi ton code ne compile pas, mais je n'ai pas de pb pour passer une méthode de la VCL à une fonction (BCB 5).

  6. #6
    Membre expérimenté
    Avatar de bakaneko
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 268
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 268
    Points : 1 427
    Points
    1 427
    Par défaut
    En faisant le code suivant, cela a fonctionné malgré un avertissement

    Création du MenuItem
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    TMenuItem* Item = new TMenuItem(this);
    Item->Caption = "Toto";
    Item->OnClick = Click;
     
    PopupMenu->Items->Add (Item);
    Fonction du clic
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void __fastcall TForm1::Click(TObject *Sender)
    {
     MessageDlg("Toto",mtInformation,TMsgDlgButtons()<<mbOK,0);
    }
    Message d'avertissment
    [C++ Avertissement] Unit1.h(63): W8022 '_fastcall TForm1::Click(TObject *)' cache une fonction virtuelle '_fastcall TControl::Click()'
    J'respère que cela correspond à tes désirs.
    + + +

  7. #7
    Membre éprouvé

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 163
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 163
    Points : 1 148
    Points
    1 148
    Par défaut
    Bonsoir à tous,

    cela fonctionne désormais sans problème.
    En fait j'avais un peu tout mélangé et je passais en paramètre de ma méthode pour l'argument de type TNotifyEvent ceci :

    En revenant à la simplicité et en mettant

    tout fonctionne !

    Merci pour votre aide !
    Neilos

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

Discussions similaires

  1. Evènement sur composant dynamique
    Par Sakapatate dans le forum AWT/Swing
    Réponses: 6
    Dernier message: 22/04/2007, 11h47
  2. Evênement onclick créé dynamiquement
    Par Mister Nono dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 12/02/2007, 13h40
  3. Evènement OnClick défini dynamiquement avec parametre
    Par GuiTwo dans le forum C++Builder
    Réponses: 2
    Dernier message: 18/12/2006, 11h58
  4. Evénement sur TMemo dynamique
    Par rasta girl dans le forum Delphi
    Réponses: 4
    Dernier message: 31/05/2006, 12h57
  5. Evénement OnClick
    Par Kerod dans le forum C++Builder
    Réponses: 3
    Dernier message: 01/03/2006, 22h50

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