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 :

Simuler l'évènement OnMouseOver de Java


Sujet :

Delphi

  1. #1
    bruce-willis
    Invité(e)
    Par défaut Simuler l'évènement OnMouseOver de Java
    En Delphi, les composants visuels ne possèdent pas l'évènement OnMouseOver et OnMouseOut, pas comme les autres langages comme Java.
    Donc, on associe les évènements existants: OnMouseMove, OnMouseUp, OnMouseDown. Le composant TLabel possède nativement les évènements OnMouseEnter et OnMouseLeave.
    C'est facile pour faire un drag & drop ou tracer un rectangle:
    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
     
    StartX,StartY:Integer;{Déclarer au début de l'unitéde la fiche}
     
    {Utiliser ce code comme le gestionnaire d'événement OnMouseDown de la fiche :}
     
    procedure TForm1.FormMouseDown(Sender:TObject;Button:TMouseButton;Shift:TShiftState;X,Y:Integer);
    begin
    StartX :=X;
    StartY :=Y;
    end;
     
    {Utiliser ce code comme le gestionnaire d'événement OnMouseUp de la fiche :}
     
    procedure TForm1.FormMouseUp(Sender:TObject;Button:TMouseButton;Shift:TShiftState;X,Y:Integer);
    begin
    Form1.Canvas.Rectangle(StartX,StartY,X,Y);
    StatusBar1.Panels[0].Text :='';
    StatusBar1.Panels[1].Text :='';
    StatusBar1.Panels[2].Text :='';
    StatusBar1.Panels[3].Text :='';
    end;
    Mais comment faire pour OnMouseOver? ça me creuse l'esprit depuis un moment!

  2. #2
    Membre extrêmement actif
    Avatar de randriano
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 221
    Par défaut
    Moi aussi, je me suis posé la question: pourquoi Borland (du moins Delphi 7 et antérieur) n'inclut pas cet évènement, je ne sais pas pour Delphi 2005 et 2006.
    randriano.dvp.com
    Développeur. Product Owner [Agile]. Sites web, mobile apps, système d'information (SI).

  3. #3
    Membre Expert Avatar de philnext
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 553
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 553
    Par défaut
    Comme tu dis certains composants (TLabel ou dansla JVCL) possèdent le OnMouseEnter (qui me semble d'ailleurs plus cohérent que OnMouseOver) et ça ne te va pas pource que tu veux faire ? Ou tu aimerais que d'autres composants aient ce OnMouseEnter (et donc OnMouseLeave) ?

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    405
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 405
    Par défaut
    il te faut gérer les messages de windows CM_MOUSEENTER et CM_MOUSELEAVE

    un exemple http://www.swissdelphicenter.ch/torr...de.php?id=1068

  5. #5
    Membre éclairé Avatar de user 56gt8
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 86
    Par défaut
    Avec l'évènement form.mousemove, tu peux générer un test sur différentes surfaces correspondant à des composants.

    Tu crées une classe Tsurface avec private X1,X2,Y1,Y2 qui correspondent aux coordonées des composants ,
    une procedure surface.generatevent qui envoit une boolean 'test' (public)

    A chaque mousemove tu testes les coordonnées sur ton array de Tsurface.Le mouse move gènère du x,y.


    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
    -------------------------------dans les types
    Tsurface = class
         constructor create(X1,X2,Y1,Y2 : integer)
         procedure GenerateEvent
         private X1,X2,Y1,Y2 :integer;
         public  test: boolean;
    end;
     
    -------------------------------dans les var
    surface: array[1..?]of Tsurface ;
     
    -------------------------------dans le code
     
    pour la procedure mousemove sur la main form.
     
    for ix:=1 to (nombres de Tsurface) do
    if (X>surface.[ix].X1) and (X<surface.[ix].X2) and (Y>surface.[ix].Y1)and(Y<surface.[ix].Y2) then Surface[ix].GenerateEvent;
    ----------------------------------------------------------------
    Le plus chiant c'est qu'il faut enregistrer les coordonées des composants à tester lors de leur création dans les variables de la classe surface crée en parallèle...(j'imagine mais je ne ferais pas !)

    Bref si tu veux te prendre la tête, voilà une bonne solution.

    Le plus simple c'est d'adopter une version récente de delphi comme le laissait sous entendre rakoto vu que les évènemets de la souris sont tous gérés.

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    405
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 405
    Par défaut
    non le plus simple c'est de gérer les messages de windows, chose que borland à oublié de faire, cela doit fonctionner même sous delphi 1

  7. #7
    Membre émérite
    Profil pro
    Inscrit en
    Février 2006
    Messages
    624
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 624
    Par défaut
    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
    unit test;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Classes, Controls, Forms, Dialogs;
     
    type
      TNewLabel = class (TLabel)
      private
        { Private declarations }
        FOnMouseLeave: TNotifyEvent;
        FOnMouseEnter: TNotifyEvent;
        procedure CMMouseEnter(var msg: TMessage);message CM_MOUSEENTER;
        procedure CMMouseLeave(var msg: TMessage);message CM_MOUSELEAVE;
      protected
        { Protected declarations }
        procedure DoMouseEnter; virtual;
        procedure DoMouseLeave; virtual;
      public
        { Public declarations }
      published
        { Published declarations }
        property OnMouseEnter: TNotifyEvent read FOnMouseEnter write FOnMouseEnter;
        property OnMouseLeave: TNotifyEvent read FOnMouseLeave write FOnMouseLeave;
      end;
     
    implementation
     
     
    procedure TNewLabel .CMMouseEnter(var msg: TMessage);
    begin
      DoMouseEnter;
    end;
     
    procedure TNewLabel .CMMouseLeave(var msg: TMessage);
    begin
      DoMouseLeave;
    end;
     
    procedure TNewLabel .DoMouseEnter;
    begin
      if Assigned(FOnMouseEnter) then FOnMouseEnter(Self);
    end;
     
    procedure TNewLabel .DoMouseLeave;
    begin
      if Assigned(FOnMouseLeave) then FOnMouseLeave(Self);
    end;
     
    end.

  8. #8
    bruce-willis
    Invité(e)
    Par défaut
    exoseven, tu as raison d'insister sur la manipulation des messages CM_MOUSEENTER et CM_MOUSELEAVE, c'est le minimum à attendre d'un bon développeur.
    Mais je me demande si Delphi 2005 ou supérieur possède déja cet évènement?

    ROUXEL!
    J'ai testé ton code et j'ai une question:est-ce que ce sera la même chose avec TImage, TButton, TPanel,etc.?
    Comment faire pour insérer ce nouveau composant dans la palette de Delphi?

  9. #9
    Membre émérite
    Profil pro
    Inscrit en
    Février 2006
    Messages
    624
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 624
    Par défaut
    Pour installer le compo tu ajoutes dans l'unité
    section interface: procedure Register;
    "" implementation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure Register;
    begin
      RegisterComponents('NewCompo', [TNewLabel]);
    end;
    Ensuite dans le menu compo-> installer un compo: tu fournis l'unité.

    Pour les autres composant le principe est le meme, tu captures les 2 messages et tu leurs connectes un evenement.

    PS/Ajoutes des proprietes comme ColorEnter, ColorExit etc... si tu veux reproduire une balise <link> ou <a>

  10. #10
    Membre émérite
    Profil pro
    Inscrit en
    Février 2006
    Messages
    624
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 624
    Par défaut
    j'ai ajouté 2 propriétés pour les couleurs:

    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
    unit UNewLabel;
     
    interface
     
    uses
      Windows,Graphics, StdCtrls, Messages, SysUtils, Classes, Controls, Forms, Dialogs;
     
    type
      TNewLabel = class (TLabel)
      private
        { Private declarations }
        FFontEnter: TFont;
        FFontLeave: TFont;
        FOnMouseLeave: TNotifyEvent;
        FOnMouseEnter: TNotifyEvent;
        procedure CMMouseEnter(var msg: TMessage);message CM_MOUSEENTER;
        procedure CMMouseLeave(var msg: TMessage);message CM_MOUSELEAVE;
      protected
        { Protected declarations }
        procedure DoMouseEnter; virtual;
        procedure DoMouseLeave; virtual;
      public
        Constructor Create(AOwner: TComponent); override;
        Destructor Destroy; override;
      published
        { Published declarations }
        property OnMouseEnter: TNotifyEvent read FOnMouseEnter write FOnMouseEnter;
        property OnMouseLeave: TNotifyEvent read FOnMouseLeave write FOnMouseLeave;
        property FontEnter: TFont read FFontEnter write FFontEnter;
        property FontLeave: TFont read FFontLeave write FFontLeave;
      end;
     
    procedure Register;
     
    implementation
     
     
    procedure TNewLabel .CMMouseEnter(var msg: TMessage);
    begin
      Font.Assign(FFontEnter);
      DoMouseEnter;
    end;
     
    procedure TNewLabel .CMMouseLeave(var msg: TMessage);
    begin
      Font.Assign(FontLeave);
      DoMouseLeave;
    end;
     
    constructor TNewLabel.Create(AOwner: TComponent);
    begin
      inherited;
      FFontEnter := TFont.Create;
      FFontLeave := TFont.Create;
      FFontEnter.Assign(Font);
      FFontLeave.Assign(Font);
    end;
     
    destructor TNewLabel.Destroy;
    begin
      FFontEnter.Free;
      FFontLeave.Free;
      inherited;
    end;
     
    procedure TNewLabel .DoMouseEnter;
    begin
      if Assigned(FOnMouseEnter) then FOnMouseEnter(Self);
    end;
     
    procedure TNewLabel .DoMouseLeave;
    begin
      if Assigned(FOnMouseLeave) then FOnMouseLeave(Self);
    end;
     
    procedure Register;
    begin
     RegisterComponents('FRox', [TNewLabel]);
    end;
     
    end.

  11. #11
    Membre Expert Avatar de philnext
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 553
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 553
    Par défaut
    Belle réalisation...bon pour moi les TLabel étaient parmis les rares qui avaient ces évènements mais bon...

  12. #12
    bruce-willis
    Invité(e)
    Par défaut
    Bon, tous ces conseils me suffisent amplement!

    Merci à tous!

Discussions similaires

  1. comment simuler un événement ?
    Par danyboy85 dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 05/11/2008, 08h01
  2. [Débutant] Associer un évènement à un bouton JAVA
    Par melodyyy dans le forum Interfaces Graphiques en Java
    Réponses: 2
    Dernier message: 28/01/2008, 20h44
  3. [Tableaux] Erreur sur évènement onmouseover
    Par pat06 dans le forum Langage
    Réponses: 25
    Dernier message: 17/10/2007, 18h05
  4. Changer l'événement onmouseover
    Par Kosti dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 31/08/2007, 19h28
  5. Simuler des évènements de la souris
    Par Odulo dans le forum Linux
    Réponses: 7
    Dernier message: 03/01/2007, 15h26

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