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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    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