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 :

Utilisation de ControlAtPos


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné

    Homme Profil pro
    Chef de Projet ATIC
    Inscrit en
    Novembre 2005
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Chef de Projet ATIC
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2005
    Messages : 274
    Par défaut Utilisation de ControlAtPos
    Hello,

    Dans un fiche (FMain) j'ai un composant JvPageControl avec 4 onglets. Dans ces onglets j'ai des TGroupBox.

    J'aimerais déclencher une action lorsque le curseur de la souris passe au dessus de certains contrôles (activés ou non). Je me suis donc dirigé vers la fonction ControlAtPos, mais cette fonction ne me renvoi que le composant JvPageControl, pas les composants contenus dedans.

    Pour tester j'ai créé :

    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
    procedure TFMain.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    var
      tmpCoord : TPoint;
      tmpcontrol : TControl;
    begin
      tmpCoord.X := X;
      tmpCoord.Y := Y;
      tmpcontrol := FMain.ControlatPos(tmpCoord, True, True);
      If tmpcontrol = nil then
      begin
        FMain.Caption := 'Rien...';
        exit;
      end;
        FMain.Caption := tmpcontrol.Name;
    end;
    Une idée pour résoudre ce problème ?

  2. #2
    Membre chevronné

    Homme Profil pro
    Chef de Projet ATIC
    Inscrit en
    Novembre 2005
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Chef de Projet ATIC
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2005
    Messages : 274
    Par défaut
    A force de test, de débug, etc... j'ai un peu avancé.

    Je me suis aperçu qu'il faut activer la méthode OnMouseMove sur tous les contrôles pour que cet événement soit géré. Le faire sur la fiche principale n'est pas suffisant, l'évènement OnMouseMove étant transmis au controle où se trouve la souris et pas à la fiche.

    Existe-t-il un autre moyen ? car je ne peux pas assigner une procédure à tous les composants, surtout que certains n'ont pas d'évènement OnMouseMove.

  3. #3
    Membre chevronné

    Homme Profil pro
    Chef de Projet ATIC
    Inscrit en
    Novembre 2005
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Chef de Projet ATIC
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2005
    Messages : 274
    Par défaut
    Ca y'est, j'ai trouvé !!

    Si cela intéresse certains, j'intercepte les messages de Windows à l'aide d'un composant TJVAppEvents (composants Jedi VCL) et en utilisant l'évènement OnMessage. On peut faire sans ce composant, mais je ne sais plus utiliser les hooks & cie

    La procédure est exécutée à chaque que le souris est déplacée sur la fiche, quelque soit le composant ou conteneur où elle se trouve.

    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
    procedure TFMain.JvAppEvents1Message(var Msg: tagMSG; var Handled: Boolean);
    var
      tmpControl, tmpParentControl : TControl;
    begin
    // Ne traite que les messages WM_MouseMove
      If Msg.message <> WM_MouseMove then
        Exit;
    // Trouve le controle sous le curseur
      tmpControl := Fmain.ControlAtPos(FMain.ScreenToClient(Mouse.CursorPos), True, True);
      tmpParentControl := nil;
    // Boucle pour trouver les controles enfants
      While (tmpControl is TWinControl) and (tmpParentControl = nil) do
    // Si ce controle contient des enfants
      If (TWinControl(tmpControl).ControlCount > 0) then
      begin
    // Mémorise le controle parent
        tmpParentControl := tmpControl;
    // Retourne l'éventuel controle enfant
        tmpControl := TWinControl(tmpControl).ControlAtPos(TWinControl(tmpControl).ScreenToClient(Mouse.CursorPos), True, True);
    // S'il n'y en pas, il faut utiliser le controle parent
        if tmpControl <> nil then
          tmpParentControl := nil;
      end
      else
        Break;
      Application.ProcessMessages;
    // Si on a retenu un control parent, on l'utilise
      if tmpParentControl <> nil then
        tmpControl := tmpParentControl;
    // Si aucun controle sous la souris, sort de la procédure
      if tmpControl = nil then
        Exit;
    // Traitement à effectuer sur le controle sous la souris
      FMain.Caption := tmpcontrol.Name;
    end;

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

Discussions similaires

  1. utiliser les tag [MFC] [Win32] [.NET] [C++/CLI]
    Par hiko-seijuro dans le forum Visual C++
    Réponses: 8
    Dernier message: 08/06/2005, 15h57
  2. Réponses: 4
    Dernier message: 05/06/2002, 14h35
  3. utilisation du meta type ANY
    Par Anonymous dans le forum CORBA
    Réponses: 1
    Dernier message: 15/04/2002, 12h36
  4. [BCB5] Utilisation des Ressources (.res)
    Par Vince78 dans le forum C++Builder
    Réponses: 2
    Dernier message: 04/04/2002, 16h01
  5. Réponses: 2
    Dernier message: 20/03/2002, 23h01

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