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

Delphi Discussion :

Comment détecter que la souris quitte un TListBox


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4
    Par défaut Comment détecter que la souris quitte un TListBox
    J'ai un formulaire qui contient entre autres, trois TListBox.
    J'effectue actuellement un traitement spécifique selon la position de la souris dans ces TListbox.

    Je souhaite effectuer un autre traitement lorsque la souris quitte un TListBox au moment où la souris sort du TListBox.

    Si la souris revient sur ce TListBox, je veux refaire le même traitement lorsqu'elle en sortira à nouveau.

    Quelle est la meilleure façon de s'y prendre?

  2. #2
    Membre émérite
    Avatar de denokan
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2002
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2002
    Messages : 434
    Par défaut
    il faut dériver ta ListBox pour faire un nouveau composant répondant au message CM_MOUSEENTER et CM_MOUSELEAVE. ci-après une TImage dérivée, tu dois faire la même chose avec une ListBox, ou tout autre composant que tu souhaites.

    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
     
    unit UHoverImage;
    (*
      Une TImage qui réponds aux évènement OnMouseEnter et OnMouseLeave
    *)
     
    interface
     
    uses
      Classes, Controls, Messages, ExtCtrls;
     
    type
      THoverImage = class(TImage)
      private
        FMouseEnter : TNotifyEvent;
        FMouseLeave : TNotifyEvent;
        procedure doMouseEnter(var Msg : TMessage); message CM_MOUSEENTER;
        procedure doMouseLeave(var Msg : TMessage); message CM_MOUSELEAVE;
      published
        property OnMouseEnter : TNotifyEvent read FMouseEnter write FMouseEnter;
        property OnMouseLeave : TNotifyEvent read FMouseLeave write FMouseLeave;
      end;
     
    procedure Register;
     
    implementation
     
    procedure Register;
    begin
      RegisterComponents('Supplément', [THoverImage]);
    end;
     
    procedure THoverImage.doMouseEnter(var Msg : TMessage);
    begin
      if Assigned(FMouseEnter) then
        FMouseEnter(Self);
    end;
     
    procedure THoverImage.doMouseLeave(var Msg : TMessage);
    begin
      if Assigned(FMouseLeave) then
        FMouseLeave(Self);
    end;
     
    end.
    la procédure Register permet de rajouter le composant dans la barre de composants

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4
    Par défaut ... exception ... 'Class TListBox not found'
    En compilant, dès le début de l'exécution, je reçois l'erreur:

    Project ScrabbleCool.exe raised exception class EClassNotFound with message 'Class TListBox not found'. Process stopped. Use Step or Run to continue.

    Mais j'ai probablement mal implanté ta suggestion.

    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
     
      TMyTListBox_OnMouseLeave = class(TListBox)
        private
        FMouseEnter : TNotifyEvent;
        FMouseLeave : TNotifyEvent;
        procedure doMouseEnter(var Msg : TMessage); message CM_MOUSEENTER;
        procedure doMouseLeave(var Msg : TMessage); message CM_MOUSELEAVE;
      published
        property OnMouseEnter : TNotifyEvent read FMouseEnter write FMouseEnter;
        property OnMouseLeave : TNotifyEvent read FMouseLeave write FMouseLeave;
      end;
     
     
      TExistence = class(TForm)
        ListBox7plus1: TMyTListBox_OnMouseLeave;
        ListBoxCousins: TMyTListBox_OnMouseLeave;
        ListBoxSousMots: TMyTListBox_OnMouseLeave;
        ...
      end;
     
    implementation
     
    procedure TMyTListBox_OnMouseLeave.doMouseEnter(var Msg : TMessage);
    begin
      if Assigned(FMouseEnter) then
        FMouseEnter(Self);
    end;
     
    procedure TMyTListBox_OnMouseLeave.doMouseLeave(var Msg : TMessage);
    begin
      if Assigned(FMouseLeave) then
        FMouseLeave(Self);
    end;
    Qu'est-ce que je n'ai pas compris?

  4. #4
    Membre émérite
    Avatar de denokan
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2002
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2002
    Messages : 434
    Par défaut
    est-ce que StdCtrls (dans laquelle est déclarée la classe TListBox) est bien dans les uses ?

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4
    Par défaut Précisions sur l'erreur
    Oui, stdctrls est dans les 'uses'.
    Il y a d'ailleurs d'autres références à 'TListBox' dans ce 'unit'.

    Ce qui m'intrigue, c'est que l'erreur se produit à l'exécution, toujours après le 'CreateForm' du formulaire dans lequel j'ai défini mon nouveau TListBox.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    begin
      Application.Initialize;
      Application.CreateForm(TFormPrincipale, FormPrincipale);
      Application.CreateForm(TFormApropos, FormApropos);
      Application.CreateForm(TExistence, Existence); 
      Application.CreateForm(TFormDefinitions, FormDefinitions);
      Application.CreateForm(TFormChargerDict, FormChargerDict);
      Application.CreateForm(TFormChrono, FormChrono);
      Application.CreateForm(TFormTester, FormTester);
      Application.CreateForm(TFormChrono2, FormChrono2);
      Application.Run;
    end.
    Autrement dit, lorsque l'erreur se produit, il y a une flèche verte pointant sur l'instruction qui suit 'Application.CreateForm(TExistence, Existence);'

    Ce fait devrait nous mettre sur une piste mais je n'ai pas suffisamment d'expérience en Delphi pour "voir" cet indice.

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4
    Par défaut Erreur même en réduisant le code au minimum
    Indice supplémentaire:
    Si je réduis le code de façon qu'à ne redéfinir TListBox pour "un autre nom", la même erreur se produit.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
      TMyTListBox_OnMouseLeave = class(TListBox)
      end;
     
      TExistence = class(TForm)
        ListBox7plus1: TMyTListBox_OnMouseLeave;
        ListBoxCousins: TMyTListBox_OnMouseLeave;
        ListBoxSousMots: TMyTListBox_OnMouseLeave;
        ...
      end;
    et j'ai mis en commentaire tout ce qui est relatif aux procédures
    'doMouseEnter' et 'doMouseLeave'.

    NOTE: info supplémentaire qui m'apparaît superflue mais sait-on jamais.
    Lorsque je lance la compilation, je reçois trois messages, un pour chacune des déclarations ci-dessus dans 'TExistence' qui dit ceci:

    Field Existence.ListBox7plus1 should be of type TListBox but is declared 'TMyTListBox_OnMouseLeave'. Correct the declaration?

    et je réponds "NON".

Discussions similaires

  1. Comment détecter que la ligne selectionnée en est une bien précise ?
    Par Invité dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 31/07/2012, 10h42
  2. Réponses: 6
    Dernier message: 25/02/2008, 21h38
  3. Réponses: 4
    Dernier message: 22/05/2007, 09h22
  4. Réponses: 4
    Dernier message: 11/06/2006, 05h39
  5. Réponses: 8
    Dernier message: 14/03/2005, 21h43

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