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

Langage Delphi Discussion :

Récupérer l'évènement d'un OnMousexxx


Sujet :

Langage Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2005
    Messages : 158
    Points : 103
    Points
    103
    Par défaut Récupérer l'évènement d'un OnMousexxx
    Salut a tous,
    Dans un soucis de centralisation de mon code source, je m'efforce de créer des procédure réutilisables pour d'autres parties de mon code. C'est pour ca que j'ai créé une procedure globale pour les évènement souris, le problème est que maintenant il faut que je récupère l'évènement, a savoir OnMouseMove,OnMouseUp,... ... Je sais récupérer le type de bouton sur lequel on a cliqué mais je ne sais toujours pas comment obtenir l'évènement.
    Merci pour votre aide.

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 106
    Points : 66
    Points
    66
    Par défaut
    Je n'ai pas vraiment la solution a ton probleme, mais peut etre une idee....

    Les evenement n'ont pas toujours le meme nombre de parametres, Tu peux peut-ete essayer en verifiant quels parametres sont "unassigned" savoir quel evenement tu as appeler?!

    Je ne sais pas si ca t'aide...

    J'ai aussi une question ou tu pourra surement m'aider... J'essaie d'ecrire une fonction globale juste pour un evenement: OnKeyPress.
    J'ai fait ca comme ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    procedure OnKeyPress_CancelForbiddenChar(Sender: TObject; var Key: Char);
    implementation
    procedure OnKeyPress_CancelForbiddenChar(Sender: TObject; var Key: Char);
    begin
    	if Key = '_' then
    		Key := #0;
    end;
    Le probleme c'est que quand je suis sur un controle et que je vais ajouter la fonction, elle ne figure pas sur la liste. Comment faire pour que la fonction soit reconnu comme une fonction "evenement"?
    (L'unite ou figure ma fonction est inclue dans l'unite de mes controles.)

  3. #3
    Membre expert
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Points : 3 575
    Points
    3 575
    Par défaut
    vive l'objet !

    dans ce cas, créé une form ancêtre avec ton code source répétitif, pas seulement sur onmouse...

    puis dans les form enfants, le inherited de onMousexxx (par exemple) appelera ton code redondant, auquel tu pourras ajouter dans l'enfant éventuellement du code spécifique

    Sinon, un autre moyen, est de créé une/des méthodes (avec exactement les même paramètre que les evts correspondant), et de les affecter dynamiquement au besoin. ie

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Monobjet.OnMouseMove := MaMethodeGeneriqueOnMouseMove

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2005
    Messages : 158
    Points : 103
    Points
    103
    Par défaut
    en fait, c'est pas vraiment ce que je veux faire, ce que je veux faire c'ets : dans une procédure applicable a touts les évènements OnMouseXXX, exécuter du code relatifs a : soit OnMouseMouve si c'est onMouseMove, onMouseUp si c'est OnMouseUp, .. mais dans une seule procédure, voici un bout de code, il n'est pas explicite car je n'ai implémenté que le cas de OnMouseDown et OnMouseUp (c'est un exemple de ce que je veux faire).

    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
    procedure TForm1.FormMouseXXX(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      //uniquement si l'évènement est OnMouseDown.
      if Button in [mbLeft,mbRight,mbMiddle] then
        case Button of
          mbLeft   :  simulateurNumber := 10;
          mbRigght :  simulateurNumber := 20;
          mbMiddle :  simulateurNumber := 30;
        end;
     
      //Uniquement si l'évènement est OnMouseUp.
      if Button in [mbLeft,mbRight,mbMiddle] then
        case Button of
          mbLeft : simulateurNumber := 11;
          mbRight : simulateurNumber := 21;
          mbMiddle : simulateurNumber := 31;
        end;
    end;

  5. #5
    Membre expert
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Points : 3 575
    Points
    3 575
    Par défaut
    si tu affectes OnMouseXXX à tous tes evts souris et que tu testes ShiftState sur le bouton ca pourrait marcher ?
    De toute manière, il faut traiter à part le Move et le Up/Down car les paramétres des evts ne sont pas les mêmes.
    Donc centraliser ton code dans une procedure ailleurs, appelé par les 2 evenements

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2005
    Messages : 158
    Points : 103
    Points
    103
    Par défaut
    ta première solution ne pourrait pas marcher car le shift fait référence aux touches mortes (alt,ctrl,...) par contre il y a moyen avec ta deuxième proposition, faire une procédure globale prenant un byte (de 1 à 3) en paramètres et les appeller dans mes procédure OnMouveXXX ca pourrait marcher si je ne me trompe pas ^^ ?

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2005
    Messages : 158
    Points : 103
    Points
    103
    Par défaut
    ok c'est bon, je viens de trouver une alternative, je vous donne un code pour exemple (comme quoi on ne cherche jamais asser (c'est pas très propre mais ca à quand meme le mérite de fonctionner) :

    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
    procedure TForm1.OnMouseXXX(typeEvent : Byte;Bouton: TMouseButton);
    begin
      case typeEvent of
        1 : case Bouton of
              mbLeft :  showmessage('OnMouseDown sur Gauche');
              mbRight : showmessage('OnMouseDown sur Droite');
              mbMiddle :showmessage('OnMouseDown sur Milieux');
            end;
        2 : case Bouton of
              mbLeft :  showmessage('OnMouseUp sur Gauche');
              mbRight : showmessage('OnMouseUp sur Droite');
              mbMiddle :showmessage('OnMouseUp sur Milieux');
            end;
      end;
     
    end;
     
    procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
        OnMouseXXX(1,Button);
    end;
     
    procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
        OnMouseXXX(2,Button);
    end;

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2005
    Messages : 158
    Points : 103
    Points
    103
    Par défaut
    Citation Envoyé par Redsky
    Je n'ai pas vraiment la solution a ton probleme, mais peut etre une idee....

    Les evenement n'ont pas toujours le meme nombre de parametres, Tu peux peut-ete essayer en verifiant quels parametres sont "unassigned" savoir quel evenement tu as appeler?!

    Je ne sais pas si ca t'aide...

    J'ai aussi une question ou tu pourra surement m'aider... J'essaie d'ecrire une fonction globale juste pour un evenement: OnKeyPress.
    J'ai fait ca comme ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    procedure OnKeyPress_CancelForbiddenChar(Sender: TObject; var Key: Char);
    implementation
    procedure OnKeyPress_CancelForbiddenChar(Sender: TObject; var Key: Char);
    begin
    	if Key = '_' then
    		Key := #0;
    end;
    Le probleme c'est que quand je suis sur un controle et que je vais ajouter la fonction, elle ne figure pas sur la liste. Comment faire pour que la fonction soit reconnu comme une fonction "evenement"?
    (L'unite ou figure ma fonction est inclue dans l'unite de mes controles.)
    Je ne comprends pas bien ce que tu veux dire, ce n'ets pas assez explicite, d'après ce que j'ai compris, tu n'arrives pas a appeller la fonction que tu viens de créer?
    N'oublies pas que pour appeller une fonction d'une autre unité, tu dois faire comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MonUnite.Mafonction(param1,param2,paramX);

  9. #9
    Membre expert
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Points : 3 575
    Points
    3 575
    Par défaut
    Entre parenthèses...
    Voici l'aide Delphi de TShiftState
    Qui inclut donc, l'état du bouton... (pas que les touches 'mortes')

    ssShift La touche Maj est enfoncée.
    ssAlt La touche Alt est enfoncée.
    ssCtrl La touche Ctrl est enfoncée.
    ssLeft Le bouton gauche de la souris est enfoncé.
    ssRight Le bouton droit de la souris est enfoncé.
    ssMiddle Le bouton central de la souris est enfoncé.
    ssDouble On a double-cliqué sur la souris.

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2005
    Messages : 158
    Points : 103
    Points
    103
    Par défaut
    Autant pour moi, je pensais que c'était uniquement pour ce qui concerne les touches mortes, entre () aussi, je viens d'implémenter mon code et il fonctionne parfaitement.. ^^ . Je suppose que ca doit aussi marcher avec le shift alors ^^.

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 16/04/2006, 00h01
  2. Réponses: 3
    Dernier message: 06/11/2005, 00h50
  3. [JACOB] récupérer les événements d'objet COM
    Par zlavock dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 12/05/2005, 14h07
  4. récupérer l'événement "fermeture par la croix" de
    Par hamurielle dans le forum Windows Forms
    Réponses: 4
    Dernier message: 08/04/2005, 11h35
  5. Récupérer un évènement du presse papier
    Par cedrolin dans le forum MFC
    Réponses: 2
    Dernier message: 27/07/2004, 00h03

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