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

Langage Delphi Discussion :

XE7 - popupmenu . comparer sous XE8


Sujet :

Langage Delphi

  1. #1
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 387
    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 387
    Points : 2 999
    Points
    2 999
    Par défaut XE7 - popupmenu . comparer sous XE8
    Bonjour les gens,

    Sous XE7, je pose un TPopupMenu que je veux refermer automatiquement par un déclenchement de timer au bout de 5 secondes.
    Je code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    procedure TFormMain.TimerPopupTimer(Sender: TObject);
    begin
      PopupMenu1.CloseMenu;
      TimerPopup.Enabled := False;
    end;
    A la compilation, impossible de poser un point d'arrêt sur CloseMenu.
    Je regarde dans le doc où je vois:

    Ferme le menu surgissant à l'écran.
    Appelez CloseMenu pour fermer le menu surgissant.
    Mais rien n'y fait. Alors je remonte dans le code Delphi et je trouve dans FMX.Menus:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    procedure TPopupMenu.CloseMenu;
    begin
    end;
    Ceci explique cela ....


    Mais bon, ça ne résout pas mon problème. Comment je le fais disparaître ce fichu popupmenu ???


    Quelqu'un pourrait jeter un coup d’œil sur XE8 pour voir si ça a été modifié ?

  2. #2
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 664
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 664
    Points : 6 967
    Points
    6 967
    Par défaut
    Citation Envoyé par Papy214 Voir le message
    Mais rien n'y fait. Alors je remonte dans le code Delphi et je trouve dans FMX.Menus:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    procedure TPopupMenu.CloseMenu;
    begin
    end;
    Ceci explique cela ....
    Dans XE, j'ai ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TPopupMenu.CloseMenu;
    begin
      Windows.EndMenu;
    end;
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. ___ Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.3.2 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.1 Entreprise
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.4)

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 041
    Points : 40 950
    Points
    40 950
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    c'est le même "code" pour XE8 FMX et le même comportement (c.a.d ne se ferme pas)
    mais j'ai eu la curiosité de faire la même chose en VCL pour le même résultat !

    @Lung dans XE8 VCL il y a ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      Winapi.Windows.EndMenu;
    je me suis alors dit que j'étais une quiche sur les timers et fait un simple sleep(100) même chose, un debug (point d'arrêt sur le sleep) m'a alors fait comprendre que c'est le popup qui prend la main (à la manière d'une forme enfant)
    c'est plutôt ceci qui explique cela, non ?

    Ceci dit je n'ai pas la réponse à ta question
    [Edit] voilà comment j'ai réussi en VCL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure TForm5.Button1Click(Sender: TObject);
    begin
    Timer1.Enabled:=true;
    PopupMenu1.Popup(130,130);
    end;
    
    procedure TForm5.Timer1Timer(Sender: TObject);
    begin
    SendMessage(PopupList.Window, WM_CANCELMODE, 0, 0);
    end;
    problème : je ne pense pas que ce soit multiplateforme donc en FMX

    autre solution : en simulant un clic de souris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    // Toujours VCL , trouvé sur le site Torry
    procedure HidePopupMenu;
    begin
      PostMessage(Handle, WM_LBUTTONDOWN, MK_LBUTTON, 0);
      PostMessage(Handle, WM_LBUTTONUP, MK_LBUTTON, 0);
    end;
    [re-Edit]
    en FMX , multiplateforme je te suggère cette lecture
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  4. #4
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 387
    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 387
    Points : 2 999
    Points
    2 999
    Par défaut
    Merci les amis ... Je vais tester ces différentes pistes mais effectivement, pour les messages sous FMX, ça ne se passe pas comme en VCL.
    Il y a une solution sur le site de François Piette que je vais aussi explorer.



    Sergio Sur un autre truc urgent en début de matinée, je n'avais pas exploré le lien indiqué et je vois que nous avons trouvé la même chose.

  5. #5
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 387
    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 387
    Points : 2 999
    Points
    2 999
    Par défaut autre solution
    Bilan :

    Le code de F.Piette est très intéressant mais je ne vois pas comment il peut résoudre mon problème.

    J'ai finis par créer le menu dynamiquement au moment voulu et le timer fait un popupmenu1.Free et le tour est joué.
    Pas très propre mais ça fonctionne.

    En fait, après test, le code suivant fonctionne (tant que je reste sur Windows évidemment):

    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
     
    type
     
      TPopupMenu = class(FMX.Menus.TPopupMenu)
      public
        procedure CloseMenu;
      end;
     
      TForm3 = class(TForm)
        Button1: TButton;
        PopupMenu1: TPopupMenu;
        MenuItem1: TMenuItem;
        MenuItem2: TMenuItem;
        procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Single);
        procedure Button1Click(Sender: TObject);
      end;
     
    var
      Form3: TForm3;
     
    implementation
     
    {$R *.fmx}
     
    procedure TForm3.Button1Click(Sender: TObject);
    begin
      PopupMenu1.CloseMenu;
    end;
     
    procedure TForm3.FormMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Single);
    begin
      PopupMenu1.Popup(X, Y);
    end;
     
    { TPopupMenu }
     
    procedure TPopupMenu.CloseMenu;
    begin
      Winapi.Windows.EndMenu;
    end;
     
    end.

  6. #6
    Membre émérite
    Avatar de Thierry Laborde
    Homme Profil pro
    N/A
    Inscrit en
    Avril 2002
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : N/A

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 391
    Points : 2 529
    Points
    2 529
    Par défaut
    Bonjour,

    En fait si on regarde la doc pour le CloseMenu :

    http://docwiki.embarcadero.com/Libra...Menu.CloseMenu

    On se rend compte que le CloseMenu est là pour les descendants de TPopupMenu.

    Et la fenêtre Popup prend bien la main comme une fenêtre modale. Voici le code pour fermer la popup :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Screen.PrepareClosePopups(Form3);
    Screen.ClosePopupForms;

  7. #7
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 041
    Points : 40 950
    Points
    40 950
    Billets dans le blog
    62
    Par défaut
    Re,

    La solution de Thierry Laborde est beaucoup plus élégante (et en plus multiplateforme ) que celle que j'allais proposer :

    Avoir une form bidon à ajouter au projet de taille 0x0 et en faire un show; puis un close;
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  8. #8
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 387
    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 387
    Points : 2 999
    Points
    2 999
    Par défaut
    Hello Thierry,

    Génial .... mais je vais compléter par une autre question : Par quel chemin es-tu arrivé à ces 2 lignes de code ?
    Autrement que par tes connaissances bien sûr

    J-Luc !

  9. #9
    Membre émérite
    Avatar de Thierry Laborde
    Homme Profil pro
    N/A
    Inscrit en
    Avril 2002
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : N/A

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 391
    Points : 2 529
    Points
    2 529
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    Re,

    La solution de Thierry Laborde est beaucoup plus élégante (et en plus multiplateforme ) que celle que j'allais proposer :

    Avoir une form bidon à ajouter au projet de taille 0x0 et en faire un show; puis un close;
    En fait cette solution aurait put être envisagé, mais dans ce cas là même pas besoin de créer une form il y un composant TPopup qui existe sur Firemonkey est qui est un conteneur et qui est là pour ça justement.

  10. #10
    Membre émérite
    Avatar de Thierry Laborde
    Homme Profil pro
    N/A
    Inscrit en
    Avril 2002
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : N/A

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 391
    Points : 2 529
    Points
    2 529
    Par défaut
    Citation Envoyé par Papy214 Voir le message
    Hello Thierry,

    Génial .... mais je vais compléter par une autre question : Par quel chemin es-tu arrivé à ces 2 lignes de code ?
    Autrement que par tes connaissances bien sûr

    J-Luc !
    En fait j'ai commencé à chercher sur la doc sur le composant TPopupMenu et c'est là que j'ai vu l'explication du CloseMenu qui n'était pas le bon choix. J'ai ensuite trouvé la méthode Clear sur le TPopupMenu qui semblait bien mais apparement ne fonctionnait pas. Puis ensuite comme la fenêtre Popup apparaissait avec un fonctionnement modal je me suis dit qu'il fallait travailler sur la fenêtre modale ou active ou comme décrit au-dessus sur les messages. j'ai donc commencé à chercher sur l'Objet Application puis ensuite sur l'Objet Screen. C'est comme ça que j'ai trouvé les 2 méthodes. Je reconnais que ce n'est pas très simple à trouver. Le genre de chose intéressant à mettre dans une FAQ Delphi FMX.

  11. #11
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 387
    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 387
    Points : 2 999
    Points
    2 999
    Par défaut
    Effectivement, ça irait bien dans la FAQ .

    En tous cas merci ...

  12. #12
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 041
    Points : 40 950
    Points
    40 950
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    ça irait bien dans la FAQ c'est sur, si il y avait une rubrique FAQ FMX. Je vais demander à Alcatiz de nous en créer une.
    Il y a des trucs que j'ai mis un certain temps à trouver qui pourraient également y trouver leur place.
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  13. #13
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 041
    Points : 40 950
    Points
    40 950
    Billets dans le blog
    62
    Par défaut proposition de FAQ
    La rubrique FMX de la FAQ est crée, reste plus qu'à , voici ma proposition

    Fermer un menu Popup

    Sous FMX un menu popup prend la main comme une fenêtre modale.
    La forme appelante n'a donc pas d'accès direct pour fermer ce menu (en VCL on utilisait ClosePopup)

    Pour fermer les popups d'une forme FMXForm1 on utilisera l'objet Screen (variable globale) et les instructions suivantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Screen.PrepareClosePopups(FMXForm1);
    Screen.ClosePopupForms;
    L'objet Screen nous permet d'obtenir :
    • Les formes et modules de données créés par l'application.
      La forme active et le contrôle actif au sein de cette dernière.
      Le nombre de formes de cette application.
      Une liste des écrans sur lesquels les formes de l'application peuvent apparaitre ainsi que leurs coordonnées et dimensions.


    +un lien vers la documentation wiki http://docwiki.embarcadero.com/Libra....Forms.TScreen

    Qu'en pensez vous ?
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  14. #14
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 387
    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 387
    Points : 2 999
    Points
    2 999
    Par défaut
    Ca décrit bien le cas d'utilisation.

    Après, pour chipoter, j'aurais mis une "puce" au début de chaque ligne décrivant les possibilités de l'objet Screen mais là, c'est mon côté pénible qui ressort

  15. #15
    Membre émérite
    Avatar de Thierry Laborde
    Homme Profil pro
    N/A
    Inscrit en
    Avril 2002
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : N/A

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 391
    Points : 2 529
    Points
    2 529
    Par défaut
    Bonjour,

    Pour le lien sur la documentation j'aurais plutôt mis le lien en Français :

    http://docwiki.embarcadero.com/Libra....Forms.TScreen

  16. #16
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 041
    Points : 40 950
    Points
    40 950
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par Papy214 Voir le message
    Après, pour chipoter, j'aurais mis une "puce" au début de chaque ligne décrivant les possibilités de l'objet Screen mais là, c'est mon côté pénible qui ressort
    non là , c'est moi qui me suis planté je voulais effectivement des puces et me suis mal débrouillé

    Pour le lien sur la documentation j'aurais plutôt mis le lien en Français
    moi aussi, mais impossible de mettre la main dessus au moment de cette rédaction (rapide avant de profiter du WE)

    je prends en compte vos remarques et rédige donc cette FAQ en espérant ainsi amorcer la pompe
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

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

Discussions similaires

  1. macro pour comparer 2 tableaux sous word
    Par mrom34 dans le forum VBA Word
    Réponses: 2
    Dernier message: 12/12/2007, 15h40
  2. Comparer 2 dates sous PL/SQL
    Par 18Marie dans le forum PL/SQL
    Réponses: 17
    Dernier message: 26/03/2007, 18h09
  3. Ouvrir un PopUpMenu sous un bouton
    Par codial dans le forum Delphi
    Réponses: 4
    Dernier message: 04/03/2007, 08h05
  4. Réponses: 4
    Dernier message: 08/09/2006, 09h41
  5. [PopupMenu] Créer dynamiquement un sous menu (submenu)
    Par MiJack dans le forum Composants VCL
    Réponses: 4
    Dernier message: 01/02/2006, 13h41

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