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 :

Redéfinir l'événement OnExit de mon composant TEditFloat


Sujet :

C++Builder

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 74
    Points : 62
    Points
    62
    Par défaut Redéfinir l'événement OnExit de mon composant TEditFloat
    bonjour,

    j'essaye de faire un composant TEditFloat (BCB 4).
    qui, comme son nom l'indique, hérite du TEdit.
    J'ai réussi à rajouter quelques proriétés dans l'inspecteur d'objets.
    Certaines propriétés concernent la valeur du flottant (des bornes),
    et d'autres concernent le format de la représenation du flottant (caractère du séparateur décimal, caractère entre milliers, nb de chiffres après la virgule).
    Je voudrais "surcharger" l'évenement OnExit de TEditFloat
    par rapport au TEdit pour afficher automatiquement mon flottant au format défini quand l'utilisateur quitte la zone.

    J'ai surchargé OnChange et ça se passe bien,
    mais le OnExit ne fonctionne pas.
    En pas à Pas, en mettant mes unités EditFloat.cpp/.h dans le même dossier qu'un petit projet test, je parviens à passer dans le code de l'événement OnChange de TEditFloat mais pas dans celui de OnExit...

    Je suppose que je m'y prends mal pour redéfinir le code de l'événement OnExit, mais j'ai atteind les limites de l'aide builder
    et je n'ai pas trouvé de questions ressemblantes sur le forum...


    Voici quelques extraits de code pour expliquer
    comment j'ai fait pour redéfinir les 2 gestionnaires événements :

    dans le .h, dans la class PACKAGE TEditFloat : public TEdit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public :
      TNotifyEvent FOnChange;
      TNotifyEvent FOnExit;
     
       void __fastcall Change();
       void __fastcall Exit();
     
    published :
       __property TNotifyEvent OnChange 
       = {read=FOnChange, write=FOnChange};
    __property TNotifyEvent OnExit
       = {read=FOnExit, write=FOnExit};[/

    dans le .cpp

    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
    void __fastcall TEditFloat::Change()
     
    {
       if(!CModeInit)
      {
        TEdit::Change();     // effectue la gestion standard,
                                      // y compris l'appel du gestionnaire
         // Votre personnalisation s'effectue ici :
     
         try{ Cval.SetStrVal(Text); }
         catch(...){ Cval = 0; }
     
         //....
      }
    }
    //------------------------------------
    void __fastcall TEditFloat::Exit()
    {
      TEdit::DoExit();        
     
      try  {Cval.SetStrVal(Text);}
      catch(...){ Cval = 0; }
     
      Cvaleur       = Cval.GetVal();
     
      CModeInit = true;
         Text = Cval.GetStrVal();
      CModeInit = false;
    }

    quelques explications du code pour les curieux :
    Cval est une instance de la classe Cdouble
    qui a un attribut double et un attribut AnsiString pour la repésentation.
    Cval est public de TEditFloat.
    Cvaleur est un double private de TEditFloat.

    CModeInit est un attribut private de TEditFloat.
    S'il vaut vrai, le Code de l'événement OnChange est inateignable,
    ce qui devrait permettre de modifier le texte sans problème sur l'événement OnExit...
    seb

  2. #2
    Membre régulier

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 25
    Points : 81
    Points
    81
    Par défaut
    Salut,
    Déjà il me semble qu'il faudrait que tu respectes le prototype des fonctions pointées par OnExit et OnChange qui reçoivent en paramètre TObject* Sender.
    Ensuite, je pense que tu devrais surcharger DoExit et non Exit et faire appel à la méthode ancêtre à la fin de ta méthode et non au début. Tu n'es même pas obligé de faire appel à la méthode ancêtre d'ailleurs, il suffirait que tu places
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if (FOnExit)
      FOnExit(this)
    à la fin de ta méthode.
    Je ne sais pas si ça suffira, tiens nous au courant.
    @+
    Frédéric

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 74
    Points : 62
    Points
    62
    Par défaut
    hugh,

    Pour le premier point,
    il n'ya pas besoin de mettre TObject *Sender en paramètre
    pour redéfinir (ou définir ?) un événement au niveau d'un composant.
    C'est un void qu'il attend en paramètre.
    Je crois bien que c'est seulement dans la gestion d'un composant instancié qu'on va pouvoir parler de TObject * Sender.

    Par contre, tu as traison, c'est DoExit qu'il faut redéfinir :

    avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    TNotifyEvent FOnDoExit;
    void __fastcall DoExit();
    en public de ma classe TEditFloat, et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    __property TNotifyEvent OnDoExit  
    = {read=FOnDoExit, write=FOnDoExit};
    en published

    Ca marche !!!

    J'ai trouvé cet élément dans l'aide à propos
    de TWinControl:oExit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    TWinControl::DoExit
    Génère un événement OnExit.
     
    DYNAMIC void __fastcall DoExit(void);
     
    Description
     
    La méthode DoExit ne fait rien d'autre qu'appeler l'éventuel gestionnaire d'événement associé à l'événement OnExit. Surchargez DoExit pour proposer des réponses en plus de l'appel du gestionnaire d'événement  ou pour supprimer l'événement OnExit.
    Ce qui explique pourquoi la redéfinition de OnExit ne marchait pas...

    Sur le troisième point, il est indiqué dans l'aide que l'appel à la méthode ancêtre doit se faire avant la personnalisation de l'événement.
    Alors sauf vot' respect, ou une bonne raison je crois que je vais laisser les choses comme ça...

    En tout cas merci beaucoup, ta réponse m'a débloqué !
    seb

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 74
    Points : 62
    Points
    62
    Par défaut
    j'allais oublier le code de l'événent DoExit lui-même, dans le .cpp :


    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
    void __fastcall TEditFloat::DoExit()
     
    {
      TEdit::DoExit();        
     
      try{ Cval.SetStrVal(Text);}
      catch(...)
      {  Cval = 0; }
     
      //....  j'allège un peu...
     
      CModeInit = true;
     Text = Cval.GetStrVal();
      CModeInit = false;
    }
    encore merci !
    a bientôt
    seb

  5. #5
    Membre régulier

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 25
    Points : 81
    Points
    81
    Par défaut
    Citation Envoyé par Seb des Monts
    Par contre, tu as traison, c'est DoExit qu'il faut redéfinir :

    avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    TNotifyEvent FOnDoExit;
    void __fastcall DoExit();
    en public de ma classe TEditFloat, et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    __property TNotifyEvent OnDoExit  
    = {read=FOnDoExit, write=FOnDoExit};
    en published

    Ca marche !!!

    J'ai trouvé cet élément dans l'aide à propos
    de TWinControl:oExit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    TWinControl::DoExit
    Génère un événement OnExit.
     
    DYNAMIC void __fastcall DoExit(void);
     
    Description
     
    La méthode DoExit ne fait rien d'autre qu'appeler l'éventuel gestionnaire d'événement associé à l'événement OnExit. Surchargez DoExit pour proposer des réponses en plus de l'appel du gestionnaire d'événement  ou pour supprimer l'événement OnExit.
    Je pense qu'il doit y avoir une erreur : DoExit n'est pas une méthode pointée par un évèvement OnExit, elle appelle OnExit si OnExit est assigné. Tandis que DoExit est appelé par CMExit. Tu dois surcharger DoExit sans en faire une méthode pointée par un évènement.
    Pour le reste, effectivement, je me suis trompé, j'ai confondu les méthodes à surcharger et l'implémentation des méthodes pointées par des évènements. Pour excuses , il me semble que ton code comporte des confusions. Je ne crois pas en l'occurence que tu sois obligé de déclarer des évènements OnExit et OnChange, il te suffirait sans doute amplement de surcharger les méthodes Change et DoExit.
    @+
    Frédéric

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 74
    Points : 62
    Points
    62
    Par défaut
    ok merci.
    je vais essayer.
    seb

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 09/05/2006, 11h03
  2. [List] Créer mon composant
    Par soad dans le forum Composants
    Réponses: 3
    Dernier message: 02/12/2005, 08h00
  3. Créer un événement à mon composant
    Par natie_49 dans le forum Composants VCL
    Réponses: 12
    Dernier message: 22/06/2005, 11h01
  4. [CR][VS.NET] Événement "Détails" de mon rapport
    Par theflamme dans le forum SDK
    Réponses: 3
    Dernier message: 01/12/2004, 07h07
  5. exploiter un évènement d'un sous composant dans un
    Par bjl dans le forum Composants VCL
    Réponses: 2
    Dernier message: 20/12/2002, 16h44

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