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

Composants VCL Delphi Discussion :

Cacher 1 panel quand la souris le quitte


Sujet :

Composants VCL Delphi

  1. #1
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 925
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 925
    Points : 6 040
    Points
    6 040
    Par défaut Cacher 1 panel quand la souris le quitte
    Bonjour,

    J'affiche via 1 menu contextuel 1 panel qui contient les détails de l'item cliqué (panel.visible:=true).

    Je pensais naïvement utiliser l'évènement OnMouseLeave pour le "fermer" (panel.visible:=false); mais à mon grand désespoir, lorsque la souris passe sur un des compos du panel, le panel devient invisible.

    Comment procéder dans ce contexte?

    Merci par avance.
    "Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
    -----------------------
    Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
    Usus magister est optimus

  2. #2
    Membre actif
    Avatar de XeGregory
    Homme Profil pro
    Passionné par la programmation
    Inscrit en
    Janvier 2017
    Messages
    319
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Passionné par la programmation
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2017
    Messages : 319
    Points : 295
    Points
    295
    Par défaut
    Citation Envoyé par qi130 Voir le message
    Bonjour,

    J'affiche via 1 menu contextuel 1 panel qui contient les détails de l'item cliqué (panel.visible:=true).

    Je pensais naïvement utiliser l'évènement OnMouseLeave pour le "fermer" (panel.visible:=false); mais à mon grand désespoir, lorsque la souris passe sur un des compos du panel, le panel devient invisible.

    Comment procéder dans ce contexte?

    Merci par avance.
    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
    procedure TForm1.HidePanel(Sender: TObject);
    begin
      (Sender as TPanel).Visible := False;
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
      I: Integer;
    begin
      for I := 0 to ControlCount - 1 do
        if Controls[I] is TPanel then
        begin
          (Controls[I] as TPanel).Visible := True;
        end;
    end;
     
    procedure TForm1.FormCreate(Sender: TObject);
    var
      I: Integer;
    begin
      for I := 0 to ControlCount - 1 do
        if Controls[I] is TPanel then
        begin
          (Controls[I] as TPanel).OnMouseLeave := HidePanel;
        end;
    end;
    Nom : Video_2024_08_16-4_edit_0.gif
Affichages : 134
Taille : 1,65 Mo
    Vous ne pouvez pas faire confiance à un code que vous n'avez pas totalement rédigé vous-même.
    Ce n’est pas un bogue - c’est une fonctionnalité non documentée.

  3. #3
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 925
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 925
    Points : 6 040
    Points
    6 040
    Par défaut
    Merci pour la réponse.

    Cependant, l'exemple fourni n'embarque pas toute la problématique exposée initialement: les panels sont vides.

    J'évoque un panel contenant des composants: Label, Grid. Et lorsque la souris survole 1 de ces composants "contenus", l'évènement OnMouseLeave du panel est déclenché.
    "Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
    -----------------------
    Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
    Usus magister est optimus

  4. #4
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 815
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 815
    Points : 13 531
    Points
    13 531
    Par défaut
    Contrôle le lien de parenté.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure TForm1.Panel1MouseLeave(Sender: TObject);
    begin
      if Panel1.ControlAtPos(Panel1.ScreenToClient(Mouse.CursorPos), TRUE, TRUE, TRUE) = nil then
        Panel1.Hide;
    end;

  5. #5
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 494
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 494
    Points : 3 129
    Points
    3 129
    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
    procedure TForm9.Button2Click(Sender: TObject);
    var
      Pt: TPoint;
    begin
      Pt.X := 0;
      Pt.Y := 0;
      Pt := Panel1.ClientToScreen(Pt);
      Pt.Offset(25, 25);
      SetCursorPos(Pt.X, Pt.Y);
      panel1.Visible := True;
      Form9.OnMouseMove := FormMouseMove;
    end;
     
    procedure TForm9.FormCreate(Sender: TObject);
    begin
      panel1.Visible := False;
      Form9.OnMouseMove := nil;
    end;
     
    procedure TForm9.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    begin
      panel1.Visible := False;
    end;
    J-L aka Papy pour les amis

  6. #6
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 925
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 925
    Points : 6 040
    Points
    6 040
    Par défaut
    merci Andnotor, c'est exactement ça qu'il me fallait.

    merci à Papy qui a anticipé ma question suivante
    "Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
    -----------------------
    Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
    Usus magister est optimus

  7. #7
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 925
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 925
    Points : 6 040
    Points
    6 040
    Par défaut Petit désagrément
    J'ai 1 petite bizarrerie:
    dans le panel, j'ai 1 label et 1 grid. En déplaçant la souris, si je rentre sur le grid par le bas ou par la droite (du grid), le panel se ferme
    je n'ai pas ce problème avec le TLabel.

    [Edit]
    J'ai recouvert le grid par 1 Timage et le problème disparait
    "Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
    -----------------------
    Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
    Usus magister est optimus

  8. #8
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 494
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 494
    Points : 3 129
    Points
    3 129
    Par défaut
    Question : Est-ce que les éléments sur le pabel doivent être clickables ou éditables ?
    Si non, Il suffit de les mettre en enabled := False et plus de problème

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TForm9.Panel1MouseLeave(Sender: TObject);
    begin
      Panel1.Hide;
    end;
    J-L aka Papy pour les amis

  9. #9
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 815
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 815
    Points : 13 531
    Points
    13 531
    Par défaut
    C'est sûr que ControlAtPos ne trouve que les enfants directs du contrôle. Les barres de défilement appartiennent à la grille et une recherche plus en profondeur est nécessaire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure TForm1.Panel1MouseLeave(Sender: TObject);
    begin
      if not Panel1.ContainsControl(FindVCLWindow(Mouse.CursorPos)) and
         (Panel1.ControlAtPos(Panel1.ScreenToClient(Mouse.CursorPos), TRUE, TRUE, TRUE) = nil) then
        Panel1.Hide;
    end;
    Cela dit ça ne résoudra pas tous tes problèmes, un mouvement rapide de la souris depuis la grille jusqu'en dehors du panel ne générera pas forcément de nouveau MouseLeave, si le passage sur le panel n'est pas détecté.

  10. #10
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 494
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 494
    Points : 3 129
    Points
    3 129
    Par défaut
    A défaut, un truc dans ce goût là ...

    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
    implementation
     
    {$R *.dfm}
     
    type
     
      THelperWinControl = class helper for TControl
        procedure SetMouseInMiddle;
      end;
     
    procedure SetMouseInMiddle(Ctrl: TControl);
    begin
      with Ctrl do
        with ClientToScreen(Point(Width div 2, Height div 2)) do
          SetCursorPos(X, Y);
    end;
     
    procedure TForm9.Button1Click(Sender: TObject);
    begin
      Panel1.SetMouseInMiddle;
      Panel1.Show;
    end;
     
    procedure TForm9.FormCreate(Sender: TObject);
    begin
      Panel1.Hide;
    end;
     
    procedure TForm9.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
    begin
      if Panel1.Visible then
        if not PtInRect(Panel1.BoundsRect, TPoint.Create(Panel1.ScreenToClient(Mouse.CursorPos))) then
          Panel1.Hide;
    end;
     
    { THelperWinControl }
     
    procedure THelperWinControl.SetMouseInMiddle;
    begin
      with Self.ClientToScreen(Point(Self.Width div 2, Self.Height div 2)) do
        SetCursorPos(X, Y);
    end;
     
    end.
    J-L aka Papy pour les amis

  11. #11
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 925
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 925
    Points : 6 040
    Points
    6 040
    Par défaut
    Merci pour votre intérêt.

    @Papy : oui, le grid est alimenté dynamiquement et je peux avoir besoin de la scrollbar du grid.

    Par rapport à vos dernières contributions, je me demande si le jeu en vaut la chandelle ?
    Cela dit ça ne résoudra pas tous tes problèmes...
    Du coup, ma solution "dégeu" en deviendrait presque élégante

    Bon, je garde vos idées sous le coude pour future intégration. Merci encore.
    "Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
    -----------------------
    Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
    Usus magister est optimus

  12. #12
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 815
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 815
    Points : 13 531
    Points
    13 531
    Par défaut
    Au plus simple c'est un clic à l'extérieur du panel.

    L'avantage du clic est que ça fonctionnera aussi sur une tablette. En tactile on oublie les mouse leave

  13. #13
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 494
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 494
    Points : 3 129
    Points
    3 129
    Par défaut
    @Andnotor

    Cette discussion me donne une idée pour autre chose mais avant de me pencher dessus, toi qui est plus savant que moi, saurais-tu si une région créée avec CreateRectRgn peut recevoir des messages windows comme le déplacement de la souris par exemple ?
    J-L aka Papy pour les amis

  14. #14
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 494
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 494
    Points : 3 129
    Points
    3 129
    Par défaut
    Citation Envoyé par qi130 Voir le message
    Merci pour votre intérêt.

    @Papy : oui, le grid est alimenté dynamiquement et je peux avoir besoin de la scrollbar du grid.
    Je viens de tester juste comme ça et ça fonctionne très bien. Ce n'est pas si compliqué que ça

    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
     
     
    procedure TForm9.Button1Click(Sender: TObject);
    begin
      with Panel1 do
    begin
        with ClientToScreen(Point(Width div 2, Height div 2)) do
          SetCursorPos(X, Y);  
      Show;
    end;
    end;
     
    procedure TForm9.FormCreate(Sender: TObject);
    begin
      Panel1.Hide;
    end;
     
    procedure TForm9.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    begin
      if Panel1.Visible then
        Panel1.Hide;
    end;
    J-L aka Papy pour les amis

  15. #15
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 815
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 815
    Points : 13 531
    Points
    13 531
    Par défaut
    Citation Envoyé par Papy214 Voir le message
    @Andnotor
    Non ce n'est pas possible. Une région n'est pas un contrôle "fenêtré", pas de WndProc.


    Quant à tes autres exemples, tu pars toujours du principe que la fiche ne contient que ce panel ; un peu simpliste. Il faudrait définir OnMouseMove de tous les composants pour que ça fonctionne. Rédhibitoire pour moi !

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

Discussions similaires

  1. [C#][2.0] Comment afficher/cacher un Panel ?
    Par Eome dans le forum ASP.NET
    Réponses: 5
    Dernier message: 21/07/2006, 16h46
  2. Déplacer un panel avec la souris
    Par Harry dans le forum Delphi
    Réponses: 14
    Dernier message: 05/06/2006, 19h18
  3. Comment agrandir un .swf quand la souris passe dessus
    Par dimitrimm972 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 09/04/2006, 19h14
  4. [C++.net]Déplacer un Panel avec la souris
    Par Dlyan dans le forum MFC
    Réponses: 28
    Dernier message: 03/03/2006, 15h36
  5. Comment fermer une fenêtre quand la souris et clavier sont inactifs ?
    Par Goldenkiller dans le forum Composants VCL
    Réponses: 7
    Dernier message: 06/12/2004, 22h09

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