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 :

Connaitre le composant survolé


Sujet :

Delphi

  1. #1
    Membre du Club
    Inscrit en
    Mai 2007
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 79
    Points : 55
    Points
    55
    Par défaut Connaitre le composant survolé
    Bonjour,

    Je souhaiterais savoir s'il est possible de connaitre l'objet quand il est survolé par le curseur. Mon principal soucis est que je ne peux pas utiliser les événements OnMouseMove, Enter, ...

    Je sais que l'on peut connaître la position du curseur avec Mouse.CursorPos, mais je ne sais pas comment connaître le composant qu'il y a dessous.

    Merci de votre aide

    Altaruk

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

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 552
    Points : 1 780
    Points
    1 780
    Par défaut
    Utilise le Hint dans lequel tu met le nom de ton composant.

  3. #3
    Membre du Club
    Inscrit en
    Mai 2007
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 79
    Points : 55
    Points
    55
    Par défaut
    J'ajoute de la difficulté, ... je ne peux pas utiliser le hint ...

  4. #4
    Membre éclairé Avatar de peter27x
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 029
    Points : 757
    Points
    757
    Par défaut
    Citation Envoyé par altaruk Voir le message
    Bonjour,

    Je souhaiterais savoir s'il est possible de connaitre l'objet quand il est survolé par le curseur. Mon principal soucis est que je ne peux pas utiliser les événements OnMouseMove, Enter, ...

    Je sais que l'on peut connaître la position du curseur avec Mouse.CursorPos, mais je ne sais pas comment connaître le composant qu'il y a dessous.

    Merci de votre aide

    Altaruk

    Je pense qu'il faut faire pointer chaque évènement onMouseMouve de chaque composant de ta Form vers une procédure générique (boucle à écrire dans le mainForm.create par exemple). Je vois pas trop d'autre solution (du moins simple et efficace !).

    Mais sinon, pourquoi diable dis tu que : "Mon principal soucis est que je ne peux pas utiliser les événements OnMouseMove" ?

  5. #5
    Membre du Club
    Inscrit en
    Mai 2007
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 79
    Points : 55
    Points
    55
    Par défaut
    Je suis désolé, mais je ne peux pas utiliser les événements onMouseMove, onMouseEnter, ...

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

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 552
    Points : 1 780
    Points
    1 780
    Par défaut
    Et on peut savoir pkoi tu ne peux pas utiliser ni les events ni le hint ?

  7. #7
    Membre éclairé Avatar de peter27x
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 029
    Points : 757
    Points
    757
    Par défaut
    Ben oui, comme je te l'ai déjà demandé, dis nous au moins pourquoi tu peux pas les utiliser !
    Si ils sont survolés par la souris, alors y'a bien un mouseMove associé à cette satanée souris quelque part dans les neurones de notre cher Delphi !

  8. #8
    Membre éclairé Avatar de peter27x
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 029
    Points : 757
    Points
    757
    Par défaut
    Bon ok, je comprends mieux pour tes histoires de mouseMove... erreur de frappe de ta part, tu voulais écrire :

    "Connaitre le composant survolté"

    c'est ça !?

  9. #9
    Membre du Club
    Inscrit en
    Mai 2007
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 79
    Points : 55
    Points
    55
    Par défaut
    tout à fait ...

    Pour les hint, ils sont déjà utilisés dans l'appli. Plusieurs composants (ddifférents) ont le même hint, mais pas la exactement la même fonction.
    Pour les événements OnMouse, le problème est que tous les composants que j'utilise n'ont pas cet événement ... et j'ai besoin de pouvoir connaître n'importe quel composant survolé

  10. #10
    Membre éclairé Avatar de peter27x
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 029
    Points : 757
    Points
    757
    Par défaut
    Citation Envoyé par altaruk Voir le message
    tout à fait ...

    Pour les hint, ils sont déjà utilisés dans l'appli. Plusieurs composants (ddifférents) ont le même hint, mais pas la exactement la même fonction.
    Pour les événements OnMouse, le problème est que tous les composants que j'utilise n'ont pas cet événement ... et j'ai besoin de pouvoir connaître n'importe quel composant survolé
    Des composants visuels qui n'ont pas le mouseMove ?
    Le mouseMove appartient à la classe TControl, qui a priori doit être un ancêtre des composants visuels, non ?

  11. #11
    Membre du Club
    Inscrit en
    Mai 2007
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 79
    Points : 55
    Points
    55
    Par défaut
    J'utilise des composants TMS ...
    J'ai le TAdvToolBar, le TAdvControlDropDown, le TAdvComboBox, ...

  12. #12
    Membre éclairé Avatar de peter27x
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 029
    Points : 757
    Points
    757
    Par défaut
    Citation Envoyé par altaruk Voir le message
    J'utilise des composants TMS ...
    J'ai le TAdvToolBar, le TAdvControlDropDown, le TAdvComboBox, ...
    Et ces composants héritent de quoi ? Y'a pas une sorte de TControl dans le lot ? Ou assimilé qui proposerait un mouseMove (ou équivalent) ?

  13. #13
    Membre du Club
    Inscrit en
    Mai 2007
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 79
    Points : 55
    Points
    55
    Par défaut
    TAdvToolBar = class(TAdvCustomToolBar)

    ...

    TAdvCustomToolBar = class(TCustomControl)

    ...

    TCustomControl = class(TWinControl)

    ...

    TWinControl = class(TControl)

  14. #14
    Membre éclairé Avatar de peter27x
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 029
    Points : 757
    Points
    757
    Par défaut
    Citation Envoyé par altaruk Voir le message
    TAdvToolBar = class(TAdvCustomToolBar)

    ...

    TAdvCustomToolBar = class(TCustomControl)

    ...

    TCustomControl = class(TWinControl)

    ...

    TWinControl = class(TControl)

    Ben voilà, TCOntrol => qui propose TControl.onMouseMove. Tentes de ce côté là.

  15. #15
    Membre du Club
    Inscrit en
    Mai 2007
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 79
    Points : 55
    Points
    55
    Par défaut
    J'ai trouvé autre chose ...
    Je vais jeter un oeil dans cette direction ... Si je n'y arrive pas, je me pencherais vers ta suggestion.

    Dans tous les cas, je poste ma réponse !

  16. #16
    Membre éclairé Avatar de peter27x
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 029
    Points : 757
    Points
    757
    Par défaut
    Citation Envoyé par altaruk Voir le message
    J'ai trouvé autre chose ...
    Je vais jeter un oeil dans cette direction ... Si je n'y arrive pas, je me pencherais vers ta suggestion.

    Dans tous les cas, je poste ma réponse !

    C'est simple sinon:


    dans tes déclarations :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    procedure MaProcMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);

    Puis dans le create du main par ex :

    EDIT : affectations à faire dans une boucle bien sûr (une boucle sur les composants de la form), ici je donne juste un exemple de la syntaxe d'affectation ! (je peux aussi préciser qu'il faut tester que le composant est compatible avec cette affectation avant de la tenter !)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TControl(monADVControl).onMouseMouve:=MaProcMouseMove;

    Puis plus loin dans le main :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    TMainForm.MaProcMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    begin
      // yes Altaruk peut faire ce qu'il veut avec ses cheveux !
      ...
      ...
    end;


    EDIT : je sais pas ce que tu vas essayer de ton côté, mais si c'est gérer le onMouseMove de ta form principale, attention car tu vas te retrouver avec une appli qui génère un évènement mouseMove à chaque déplacement de souris (très lourd), de plus tu devras comparer x,y de la souris avec x,y de chaque composant pour savoir lequel est survolé... là aussi c'est très lourd.

  17. #17
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut Astuce
    @Salut,

    Tu peux utiliser les Message de notre chere windows

    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
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StrUtils;
     
    type
      TForm1 = class(TForm)
        Button1: TButton;
        Button2: TButton;
        Label1: TLabel;
        procedure FormCreate(Sender: TObject);
      private
        { Déclarations privées }
        Procedure AppMessage(var Msg: TMsg; var Handled: Boolean);
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      Application.OnMessage := AppMessage;
    end;
     
    procedure TForm1.AppMessage(var Msg: TMsg; var Handled: Boolean);
    VAR
      ctrl : TControl;
      x,y : Integer;
      pt  : tPoint;
    begin
      IF Msg.message = wm_MouseMove Then
      Begin
        x := Mouse.CursorPos.x; // Position du cursor
        y := Mouse.CursorPos.Y;
        Pt := Self.ScreenToClient(point(x,y)); // Par rapport à l'écran
     
        ctrl :=  ControlAtPos(point(pt.x,pt.y),true,true); // Récupère le Control survolé
        IF ctrl <> NIL THEN label1.Caption := ctrl.ClassName; // On l'affiche
       End;
      Handled := False;
    end;
     
    end.


    Tu pourrais également savoir le quelle excactement comme composant, remplace dans la condition comme ceci.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    //...
        IF ctrl <> NIL THEN
        Begin
          label1.Caption := ctrl.ClassName; // On l'affiche
          label2.Caption := Ctrl.Name; // C'est le quel
        end;
     
    //...
    PS : Ah oui n'oublis pas de lié l'évement OnCreate de ta fiche

    Tiens le DFM on ne sait jamais

    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
    object Form1: TForm1
      Left = 0
      Top = 0
      Caption = 'Form1'
      ClientHeight = 216
      ClientWidth = 426
      Color = clBtnFace
      Font.Charset = DEFAULT_CHARSET
      Font.Color = clWindowText
      Font.Height = -11
      Font.Name = 'Tahoma'
      Font.Style = []
      OldCreateOrder = False
      OnCreate = FormCreate
      PixelsPerInch = 96
      TextHeight = 13
      object Label1: TLabel
        Left = 208
        Top = 157
        Width = 31
        Height = 13
        Caption = 'Label1'
      end
      object Label2: TLabel
        Left = 208
        Top = 176
        Width = 31
        Height = 13
        Caption = 'Label2'
      end
      object Button1: TButton
        Left = 296
        Top = 88
        Width = 75
        Height = 25
        Caption = 'Button1'
        TabOrder = 0
      end
      object Button2: TButton
        Left = 296
        Top = 119
        Width = 75
        Height = 25
        Caption = 'Button2'
        TabOrder = 1
      end
      object Edit1: TEdit
        Left = 24
        Top = 8
        Width = 121
        Height = 21
        TabOrder = 2
        Text = 'Edit1'
      end
      object CheckBox1: TCheckBox
        Left = 24
        Top = 35
        Width = 97
        Height = 17
        Caption = 'CheckBox1'
        TabOrder = 3
      end
      object ListBox1: TListBox
        Left = 24
        Top = 58
        Width = 121
        Height = 97
        ItemHeight = 13
        TabOrder = 4
      end
    end

  18. #18
    Membre éclairé Avatar de peter27x
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 029
    Points : 757
    Points
    757
    Par défaut
    Citation Envoyé par BuzzLeclaire Voir le message
    @Salut,

    Tu peux utiliser les Message de notre chere windows

    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
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StrUtils;
     
    type
      TForm1 = class(TForm)
        Button1: TButton;
        Button2: TButton;
        Label1: TLabel;
        procedure FormCreate(Sender: TObject);
      private
        { Déclarations privées }
        Procedure AppMessage(var Msg: TMsg; var Handled: Boolean);
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      Application.OnMessage := AppMessage;
    end;
     
    procedure TForm1.AppMessage(var Msg: TMsg; var Handled: Boolean);
    VAR
      ctrl : TControl;
      x,y : Integer;
      pt  : tPoint;
    begin
      IF Msg.message = wm_MouseMove Then
      Begin
        x := Mouse.CursorPos.x; // Position du cursor
        y := Mouse.CursorPos.Y;
        Pt := Self.ScreenToClient(point(x,y)); // Par rapport à l'écran
     
        ctrl :=  ControlAtPos(point(pt.x,pt.y),true,true); // Récupère le Control survolé
        IF ctrl <> NIL THEN label1.Caption := ctrl.ClassName; // On l'affiche
       End;
      Handled := False;
    end;
     
    end.


    Tu pourrais également savoir le quelle excactement comme composant, remplace dans la condition comme ceci.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    //...
        IF ctrl <> NIL THEN
        Begin
          label1.Caption := ctrl.ClassName; // On l'affiche
          label2.Caption := Ctrl.Name; // C'est le quel
        end;
     
    //...
    PS : Ah oui n'oublis pas de lié l'évement OnCreate de ta fiche

    Oui ça revient à ce que je disais dans le EDIT de ma dernière réponse, méthode que je pense très lourde. De plus ta solution, cher Buzz, sert à quoi comparé à utiliser tout simplement le onMouseMove de la form ??? (c'est uniquement avec des contrôles spéciaux que Altaruk pensait ne pas pouvoir utiliser le onMouseMove (or il le peut, lire l'ensemble du fil)).

  19. #19
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Citation Envoyé par peter27x Voir le message
    Oui ça revient à ce que je disais dans le EDIT de ma dernière réponse, méthode que je pense très lourde. De plus ta solution, cher Buzz, sert à quoi comparé à utiliser tout simplement le onMouseMove de la form ??? (c'est uniquement avec des contrôles spéciaux que Altaruk pensait ne pas pouvoir utiliser le onMouseMove (or il le peut, lire l'ensemble du fil)).
    Salut,

    Pas vraiment, enfin apres ce que j'ai pu te lire. A priori cela oglige de mettre un onmouseMove sur chaque composant !!

    La proposition que j'ai fais lui permet d'éviter toute ces déclarations.

    Enfin, apres... il vera.

  20. #20
    Membre éclairé Avatar de peter27x
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 029
    Points : 757
    Points
    757
    Par défaut
    Citation Envoyé par BuzzLeclaire Voir le message
    Salut,

    Pas vraiment, enfin apres ce que j'ai pu te lire. A priori cela oglige de mettre un onmouseMove sur chaque composant !!

    La proposition que j'ai fais lui permet d'éviter toute ces déclarations.

    Enfin, apres... il vera.
    Mais non justement !!!!! Tu crois que je lui aurais proposé un truc aussi lourdingue ?

    Tu n'as pas lu le fil... je me répète....

    Une boucle dans le create et hop, une fonction mouseMouse générique pour tous les composants d'un coup... et 10 fois plus léger en temps CPU que ta solution... (ou celle qu'il tente peut être de faire dans son coin...)

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [XL-2003] Listview : connaitre la ligne survolée par la souris
    Par Korleone dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 18/05/2010, 18h51
  2. connaitre la taille exacte du composant
    Par Zorgz dans le forum Interfaces Graphiques en Java
    Réponses: 4
    Dernier message: 28/03/2007, 16h15
  3. Connaitre le Composant survolé avec la souris
    Par Hauwke dans le forum Composants VCL
    Réponses: 3
    Dernier message: 12/10/2005, 19h22
  4. Connaitre la taille d'un 'composant' texte
    Par pierre.zelb dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 25/08/2005, 11h44
  5. connaitre le composant sachant son Handle
    Par bidochon dans le forum Composants VCL
    Réponses: 2
    Dernier message: 01/10/2004, 15h33

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