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 :

Comment surcharger OnChange d'un TTrackbar


Sujet :

C++Builder

  1. #1
    Membre confirm�
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    61
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 61
    Par d�faut Comment surcharger OnChange d'un TTrackbar
    Bonjour,
    J'ai cr�� un composant d�rivant de TTrackbar pour obtenir un comportement de joyscick. Notamment, sur l'�v�nement OnMouseUp, le curseur est automatiquement ramen� � 0.
    Mon probl�me est que durant ce retour � 0, je ne veux pas que l'�v�nement OnChange soit transmis et je ne sais pas quelle methode surcharger pour modifier le comportement de OnChange.
    J'ai essay� de positionner un flag sur le OnMouseUp mais l'�v�nement OnChange est transmis avant.

    Merci de votre aide.

  2. #2
    Membre averti
    Inscrit en
    Mars 2006
    Messages
    23
    D�tails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 23
    Par d�faut
    Je n'ai pas bien compris ton probl�me mais si tu veux emp�cher l'�v�nement OnChange, tu peux faire pointer l'event vers NULL le temps que tu veux.

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    TrackBar1->OnChange = NULL;
    ........
    ....
    TrackBar1->OnChange = TrackBar1Change;
    Bonne journ�e

  3. #3
    Membre confirm�
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    61
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 61
    Par d�faut
    Dans mon composant Tjoystick d�riv� de TTrackbar, je sais intercepter les �v�nements souris avant de les retransmettre � l'appelant.

    exemple :
    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
     
    class PACKAGE TJoystick : public TTrackBar
    {
    protected:
       DYNAMIC void __fastcall MouseUp(TMouseButton Button, Classes::TShiftState Shift, int X, int Y);
    public:
       __fastcall TJoystick(TComponent* Owner);
     
    __published:
       __property OnMouseUp;
    };
     
    void __fastcall TJoystick::MouseUp(TMouseButton Button, Classes::TShiftState Shift, int X, int Y)
    {
       // Mon traitement.....
       TTrackBar::MouseUp(Button, Shift, X, Y);
    }
    Mais je ne sais pas faire la m�me chose avec l'�v�nement OnChange car je ne trouve pas de m�thode �quivalente � MouseUp.

  4. #4
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 412
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 412
    Par d�faut
    Salut !

    Rien n'emp�che de faire dans la OnChange :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
     
    if(Position != 0)
        {
        //Donc ... on traite 
        }
    M�me si dans la OnMouseUp on fait :

    Non ???

    Par contre... � titre perso, je fais ce genre de truc en d�rivant de TCustomControl (ou directement sur une Form avec une classe sachant se dessiner sur un canvas) ... surtout si on a deux axes � g�rer (x,y) !

    A plus !

  5. #5
    Membre confirm�
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    61
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 61
    Par d�faut
    Merci de vos r�ponses.

    Finalement, j'ai opt� pour une approche utilisant le MouseMove.
    Ce n'est peut-�tre pas l'id�al sur le plan de l'�l�gance mais �a r�pond � mon besoin. Ci-joint le code si �a interresse quelqu'un.

    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    //---------------------------------------------------------------------------
     
    #ifndef JoystickH
    #define JoystickH
    //---------------------------------------------------------------------------
    #include <SysUtils.hpp>
    #include <Classes.hpp>
    #include <ComCtrls.hpp>
    #include <Controls.hpp>
    //---------------------------------------------------------------------------
    class PACKAGE TJoystick : public TTrackBar
    {
    private:
       TNotifyEvent doChangeJS;
       TNotifyEvent doStart;
       TNotifyEvent doStop;
       int m_position;
       int m_delayChange;
       TTimer *m_timer;
     
       int m_min;
       int m_max;
     
    protected:
       DYNAMIC void __fastcall MouseUp(TMouseButton Button, Classes::TShiftState Shift, int X, int Y);
       DYNAMIC void __fastcall MouseDown(TMouseButton Button, Classes::TShiftState Shift, int X, int Y);
       DYNAMIC void __fastcall MouseMove(Classes::TShiftState Shift, int X, int Y);
     
       void __fastcall doTimer(TObject *Sender);
       void __fastcall setMax(int Valeur);
     
    public:
       __fastcall TJoystick(TComponent* Owner);
       __fastcall ~TJoystick(void);
     
       void __fastcall reset(void);
     
    __published:
       __property TNotifyEvent OnChangeJS = { read = doChangeJS, write = doChangeJS };
       __property int DelayChange = { read = m_delayChange, write = m_delayChange };
       __property int Min = { read = m_min };
       __property int Max = { read = m_max, write = setMax };
       __property TNotifyEvent OnStart = { read = doStart, write = doStart };
       __property TNotifyEvent OnStop = { read = doStop, write = doStop };
     
    };
    //---------------------------------------------------------------------------
    #endif
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
     
    //---------------------------------------------------------------------------
     
    #include <vcl.h>
     
    #pragma hdrstop
     
    #include "Joystick.h"
    #pragma package(smart_init)
    //---------------------------------------------------------------------------
    //  ValidCtrCheck est utilisé pour vérifier que les composants créés n'ont
    // aucune fonction virtuelle pure.
    //
     
    static inline void ValidCtrCheck(TJoystick *)
    {
       new TJoystick(NULL);
    }
    //---------------------------------------------------------------------------
     
    namespace Joystick
    {
       void __fastcall PACKAGE Register()
       {
           TComponentClass classes[1] = {__classid(TJoystick)};
           RegisterComponents("General", classes, 0);
       }
    }
    //---------------------------------------------------------------------------
     
    __fastcall TJoystick::TJoystick(TComponent* Owner)
       : TTrackBar(Owner), m_position(0)
    {
       PageSize          = 0;
       Max               = 10;
       TickMarks         = tmBoth;
       DelayChange       = 100;
       Max = 10;
     
       m_timer           = new TTimer(this);
       m_timer->Enabled  = true;
       m_timer->Interval = 0;
       m_timer->OnTimer  = doTimer;
     
    }
    //---------------------------------------------------------------------------
     
    __fastcall TJoystick::~TJoystick(void)
    {
       delete m_timer;
    }
    //---------------------------------------------------------------------------
     
    void __fastcall TJoystick::MouseDown(TMouseButton Button, Classes::TShiftState Shift, int X, int Y)
    {
       if(! doStart) return;
     
       int posSlider = (Orientation == trHorizontal) ? Width / 2 : Height / 2;
       int xy        = (Orientation == trHorizontal) ? X : Y;
     
       if(xy >= posSlider - 4 && xy <= posSlider + 4)
          doStart(this); // La souris a été cliquée sur le slider
    }
     
    //---------------------------------------------------------------------------
     
    void __fastcall TJoystick::MouseUp(TMouseButton Button, Classes::TShiftState Shift, int X, int Y)
    {
       Position = 0;
       if(doStop)
          doStop(this); //La sousis a été relachée
    }
    //---------------------------------------------------------------------------
     
    void __fastcall TJoystick::reset(void)
    {
       // Pour ramener le slider à 0 si l'evt MouseUp n'a pas pu être transmis
       Position = 0;
    }
    //---------------------------------------------------------------------------
     
    void __fastcall TJoystick::MouseMove(Classes::TShiftState Shift, int X, int Y)
    {
       // Pour régler la fréquence d'envoi des positions
       if(doChangeJS)
          m_timer->Interval = m_delayChange;
    }
    //---------------------------------------------------------------------------
     
    void __fastcall TJoystick::doTimer(TObject *Sender)
    {
       if(doChangeJS)
       {
          if(Position == m_position) return;
          m_position = Position;
          m_timer->Interval = 0;
          doChangeJS(this); // Envoi changement de position
       }
    }
    //---------------------------------------------------------------------------
     
    void __fastcall TJoystick::setMax(int Valeur)
    {
       // Le joystick à sa position 0 au milieu.
       // Le max détermine le Min.
       if(Valeur >= 0)
       {
          m_max = Valeur;
          m_min = -Valeur;
          TTrackBar::Max = m_max;
          TTrackBar::Min = m_min;
       }
    }

Discussions similaires

  1. Comment surcharger (hook) n'importe quelle API windows ?
    Par RazielReaver dans le forum API, COM et SDKs
    R�ponses: 12
    Dernier message: 05/07/2020, 18h41
  2. R�ponses: 1
    Dernier message: 14/04/2006, 21h46
  3. [C#]Comment surcharger l'op�rateur [] ?
    Par NicolasJolet dans le forum C#
    R�ponses: 11
    Dernier message: 09/04/2006, 12h00
  4. [C#/C++] Comment surcharger attribut d'1 Event de Control ?
    Par NicolasG dans le forum Windows Forms
    R�ponses: 2
    Dernier message: 05/02/2006, 17h55
  5. Comment surcharger la m�thode OnClose d'un TFrame ?
    Par sdebrois dans le forum Composants VCL
    R�ponses: 2
    Dernier message: 17/01/2005, 20h57

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