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 :

Fermeture d'un Menu Popup


Sujet :

Delphi

  1. #1
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 345
    Points : 3 123
    Points
    3 123
    Par défaut Fermeture d'un Menu Popup
    Bonjour,

    j'ai une application réduite dans le Systray et dont la fenêtre principale est cachée au départ.

    Sur l’icône du Systray, j'affiche un memu Popup par :

    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
    procedure TF_Princ.IconResponse(var Msg: TMessage);
    //   Réponse de la souris sur l’icône du Systray
    var
      pt: TPoint;
    begin
      case Msg.lParam of
        WM_LBUTTONDOWN:
          begin
            ShowForm;
          end;
        WM_RBUTTONDOWN:
          begin
            GetCursorPos(pt);
            PopMenu1.Popup(pt.x-5, pt.y - 18);
          end;
      end;
    end;
    Le bouton gauche affiche la fenêtre principale et le popup se referme.
    Le bouton droit ouvre le Popup et les menus fonctionnent bien.

    Mais lorsque j'ouvre le popup, sans choisir de menu, et que je clique en dehors du Popup, il ne se referme pas
    (sans doute parce que la fenêtre principale qui contient le Popup est cachée ?)

    Comment faire pour le refermer par un clic hors du popup ?

    Merci pour vos idées ...

    A+
    Charly

  2. #2
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    661
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 661
    Points : 3 630
    Points
    3 630
    Billets dans le blog
    2
    Par défaut
    Bonsoir,

    Quelle version de Delphi utilises tu ? Je ne sais plus à partir de quelle version il est apparu (je crois que c'était avec Delphi 2010), mais il y a un composant fourni en standard : le TTrayIcon.
    J'ai fait un essai rapide avec un menu popup et celui ci se ferme bien automatiquement lorsqu'on clique en dehors du menu.
    Mon site - Mes tutoriels - GitHub - N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  3. #3
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 345
    Points : 3 123
    Points
    3 123
    Par défaut
    Bonjour,
    Merci gbegreg , mais je suis sous D7 et je ne dispose pas de ce composant. Je me suis inspiré de plusieurs codes trouvés sur internet.

    Si je créé une application classique avec une fenêtre visible et un Menu Popup, le menu Popup se ferme bien si je clique bouton gauche en dehors du menu. Je pense qu'ici cela vient du fait que ma fenêtre est invisible.

    Je sais fermer le popup avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
       PostMessage(Handle, WM_LBUTTONDOWN, MK_LBUTTON, 0);
       PostMessage(Handle, WM_LBUTTONUP, MK_LBUTTON, 0);
    Mais il faudrait que mon application intercepte les messages du clic souris dans l'écran (sauf dans le Popup) afin d'y loger ce code et ensuite laisser passer le message aux autres applications.

    A+
    Charly

  4. #4
    Membre expérimenté
    Avatar de retwas
    Homme Profil pro
    Développeur Java/Delphi
    Inscrit en
    Mars 2010
    Messages
    698
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Java/Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 698
    Points : 1 608
    Points
    1 608
    Billets dans le blog
    4
    Par défaut
    J'ai eu le même besoin il y a pas longtemps, quand le popup ou la form s'affiche, un timer se met en marche et le OnTimer va regarder si la souris est en dehors, si oui je ferme le popup.

    J'ai pas le code sous la main mais je le poste demain si tu as toujours le problème

  5. #5
    Membre émérite

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 388
    Points : 2 999
    Points
    2 999
    Par défaut
    http://torry.net/quicksearchd.php?St...icon&Title=Yes

    CoolTrayIcon fonctionnait très bien à l'époque

  6. #6
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 345
    Points : 3 123
    Points
    3 123
    Par défaut
    @Retwas : merci je teste dès que tu auras posté ton code

    @Papy214 : merci également, mais c'est un composant tiers. J'aimerais mieux éviter : un composant doit être installé sur chaque PC de développement, et à chaque réinstall de Delphi, il faut le faire aussi. J'essaye de m'en tenir à la VCL et à quelques composants indispensables ... Peut être ai-je tort ? (et le tort tue ). Je vais quand même éplucher ce composant.

    A+
    Charly

  7. #7
    Membre émérite

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 388
    Points : 2 999
    Points
    2 999
    Par défaut
    merci également, mais c'est un composant tiers. J'aimerais mieux éviter
    La philosophie de Delphi est quand même un peu la réutilisation de choses existantes.
    Réinventer la roue, c'est bien mais ça prend du temps.
    Mais bon, c'est un choix comme un autre

  8. #8
    Membre expérimenté
    Avatar de retwas
    Homme Profil pro
    Développeur Java/Delphi
    Inscrit en
    Mars 2010
    Messages
    698
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Java/Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 698
    Points : 1 608
    Points
    1 608
    Billets dans le blog
    4
    Par défaut
    Alors voici le code, je met en route le timer lors de l'affichage et dans l’événement OnTimer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if not IsSourisOnPopUp then
    begin
       Timer.Enabled := False;
       Hide; // je cache ma fenêtre
    end;
    et la code de la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    function TFormTrayMenu.IsSourisOnPopUp: boolean;
    var
       PosCursor : TPoint;
    begin
       GetCursorPos(PosCursor);
     
       // je laisse une marge de 20px pour pas qu'il se ferme quand la souris est juste à côté
       Result :=
            ((PosCursor.X >= Self.Left) and
             (PosCursor.X <= Self.Left + Width + 20) and
             (PosCursor.Y >= Self.Top) and
             (PosCursor.Y <= Self.Top + Height + 20)); 
    end;

  9. #9
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 345
    Points : 3 123
    Points
    3 123
    Par défaut
    Merci Retwas,
    mais cela ne fonctionne pas chez moi, car Self.top et Self.Left me renvoient la position de la fenêtre principale réduite dans la barre de tâche et non la position du popup.

    J'ai opté pour le composant RxTrayIcon qui fonctionne bien.

    A+
    Charly

  10. #10
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    661
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 661
    Points : 3 630
    Points
    3 630
    Billets dans le blog
    2
    Par défaut
    Bonsoir,

    Je n'ai plus Delphi 7.
    N'y aurait il pas été possible de faire ton propre événement en cas de désactivation de l'application (application.OnDeactivate) dans lequel tu fermerais le popup ?
    Mon site - Mes tutoriels - GitHub - N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  11. #11
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 345
    Points : 3 123
    Points
    3 123
    Par défaut
    Ok, merci, je vais tester

  12. #12
    Membre expérimenté
    Avatar de retwas
    Homme Profil pro
    Développeur Java/Delphi
    Inscrit en
    Mars 2010
    Messages
    698
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Java/Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 698
    Points : 1 608
    Points
    1 608
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par Charly910 Voir le message
    Merci Retwas,
    mais cela ne fonctionne pas chez moi, car Self.top et Self.Left me renvoient la position de la fenêtre principale réduite dans la barre de tâche et non la position du popup.
    Dans mon cas j'ouvre une Form à la place d'un Popup, d'où le Self mais en remplacent par la position du PopupMenu cela doit fonctionner

  13. #13
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 345
    Points : 3 123
    Points
    3 123
    Par défaut
    Bonjour,
    oui, mais un popup n'a pas de propriété width, ni height (cela dépend de la largeur des libellés des menus et de leur nombre, car j'en ajoute dynamiquement)

    je pense me rabattre sur le RxTrayIcon (comme disait Papy214, inutile de réinventer la roue ...)

    Merci
    A+
    Charly

Discussions similaires

  1. [SWT]Menu popup sur Table swt
    Par didjac dans le forum SWT/JFace
    Réponses: 1
    Dernier message: 11/12/2005, 21h38
  2. encore des menu popup
    Par meli0207 dans le forum MFC
    Réponses: 8
    Dernier message: 03/06/2005, 15h57
  3. menu popup
    Par meli0207 dans le forum MFC
    Réponses: 2
    Dernier message: 03/06/2005, 10h44
  4. menu popup sur une zone de text
    Par jesus144 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 26/05/2005, 23h15
  5. Comment créer un menu popup style XP ?
    Par chaours dans le forum Composants VCL
    Réponses: 4
    Dernier message: 29/09/2003, 09h38

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