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

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre confirm�
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    74
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 74
    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...

  2. #2
    Membre averti

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

    Informations forums :
    Inscription : Mars 2002
    Messages : 25
    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 confirm�
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    74
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 74
    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� !

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 74
    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

  5. #5
    Membre averti

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

    Informations forums :
    Inscription : Mars 2002
    Messages : 25
    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 confirm�
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    74
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 74
    Par d�faut
    ok merci.
    je vais essayer.

+ 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. 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