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 :

Showmodal et StayOnTop : pas si haut !


Sujet :

Langage Delphi

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 42
    Points : 19
    Points
    19
    Par défaut Showmodal et StayOnTop : pas si haut !
    Bonjour,

    J'ai été confronté plusieurs fois à ce problème et avant d'utiliser une nouvelle fois des rustines en tous genre pour le contourner j'aimerais savoir s'il n'existe pas une solution plus efficace et définitive.

    Il est possible en Delphi de passer une fenêtre en StayOnTop en définissant sa propriété FormStyle à fsStayOnTop. Selon les cas, l'effet obtenu est différent :

    1. Si la fenêtre principale de l'application est passée en StayOnTop, elle restera au premier plan même lorsque l'application n'est plus l'application active. Il s'agit donc d'un StayOnTop par rapport aux autres application. Cette fonctionnalité n'est pas celle qui m'intéresse.

    2. Si au sein de l'application une fenêtre autre que la fenêtre principale est passée en StayOnTop, cette fenêtre restera au premier plan de l'application et seulement de l'application, ce qui est exactement le comportement que je recherche.

    3. Dernier cas, et c'est là que je rencontre un problème, si cette fenêtre StayOnTop est créée depuis une fenêtre ShowModal de l'application, celle-ci sera bien affichée en premier plan de l'application mais restera également visible devant toutes les autres applications, quelque soit l'application active !

    (Le fichier joint donne une exemple des comportement 2 et 3)
    J'ai besoin dans mon cas d'appeler des fenêtres StayOnTop depuis une fenêtre modale, sans pour autant que ces fenêtres restent constamment devant les autres applications. En gros, un appel dans la situation 3 qui aurait le comportement 2.

    J'ai fouillé un peu du coté des procédures RestoreTopMosts et NormalizeTopMosts de TApplication en parallèle avec l'utilisation du message windows WM_ACTIVATEAPP (qui signale l'activation ou la désactivation de l'application) mais sans succès. Je me suis également intéressé à ce sujet qui décrit un problème inverse (merci à l'auteur pour la solution proposée) mais qui ne m'apporte pas vraiment de solution, d'autant plus qu'il est totalement exclu d'impliquer des mises à jour de windows.

    Quelqu'un a-t-il déjà été confronté à ce problème ? Avez-vous des solutions/pistes à explorer pour le résoudre ?

    Merci
    Fichiers attachés Fichiers attachés

  2. #2
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    L'appel de StayOnTop Ne sert a rien dans ton cas, pour ce que j'ai compris de ce que tu veux faire.

    L'appel de ShowModal, mettra toujours la fenêtre appelée au dessus de la fenêtre appelante.
    Sinon pour être tranquil, il suffit de hide la fenêtre appelante avant l'appel de l'appellée
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 42
    Points : 19
    Points
    19
    Par défaut
    Je me suis mal exprimé alors ^^

    En gros, ce que j'ai :
    - la fenêtre principale de mon application (appelons la fenêtre A)
    - une fenêtre showmodal non StayOnTop (fenêtre B) appelée par ma fenêtre A
    - des fenêtres StayOnTop (C1, C2, C3...) appelées par la fenêtre B

    Si les fenêtre C1, C2, C3 sont appelées par la fenêtre A il n'y a pas de problème : elles sont au premier plan de l'application, mais ne restent pas devant les autres applications. Mais lorsque je crée les fenêtre C1, C2, C3 depuis la fenêtre B, elles restent au premier plan de l'application ET de toutes les autres applications. Ce qui ne me convient pas, j'aimerais qu'elles restent derrières les autres applications, comme c'est le cas lorsqu'elles sont appelées par les fenêtre A

    L'appel de fenêtres StayOnTop depuis des fenêtres Showmodal semble donc poser problème, et je ne sais pas comment contourner ça.

    Merci pour ta réponse

  4. #4
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    donc, en clair vire le StayOnTop de tes fenêtre C1,C2,C3 et tu auras un comportement normal d'une fenêtre dans une application.
    C'est a dire que l'appel de la fenêtre sera au dessus de l'appelante mais aps des autres applications.

    Le StayOnTop : Lors de la création de la fenêtre, cette derniere est créée au dessus de toutes les autres et ne peut normalement (oui oui, j'ai bien dit normalement ) pas être mise en arrière plan.
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 42
    Points : 19
    Points
    19
    Par défaut
    Le problème étant que les fenêtre C1, C2, C3 doivent être StayOnTop

    Mais uniquement pour l'application dans laquelle elles sont appelées, pas pour toutes les applications... Ce qui marche parfaitement lorsqu'elles sont créées depuis la fenêtre principale de l'application, mais pas depuis une fenêtre modale

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 42
    Points : 19
    Points
    19
    Par défaut
    (à vouloir trop expliquer mon problème j'en ai perdu le plus important je crois )

  7. #7
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Je viens de faire un test

    Form1 appel en Modal Form2 -> la form est devant form1
    Si je bascule d'un appli a une autre Form2 reste devant Form1
    Form2 appel en Modal Form3 -> Même comportement. Form1 est en dessous de Form2 qui est en dessous de Form3

    Toutes mes forms sont en fsNormal.

    Je ne comprend pas ton problème.
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  8. #8
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 770
    Points
    2 770
    Par défaut
    Citation Envoyé par Malatar
    L'appel de StayOnTop Ne sert a rien dans ton cas, pour ce que j'ai compris de ce que tu veux faire.

    L'appel de ShowModal, mettra toujours la fenêtre appelée au dessus de la fenêtre appelante.
    Sinon pour être tranquil, il suffit de hide la fenêtre appelante avant l'appel de l'appellée
    pourqoi pas??
    met tes fenetre c1,c2,c3 en modal sans etre StayOnTop
    sauf bien sur si tu veux continuer un code dans ta form b ,,c'est sa????
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 42
    Points : 19
    Points
    19
    Par défaut
    Tout d'abord, merci pour vos réponses.

    Malatar, il n'y a effectivement pas de soucis du coté des fenêtres modales. Le problème apparait lorsque je mélange des fenêtres modales non StayOnTop et des fenêtre StayOnTop non modales.

    Ce qui m'amène à la question d'Edam :

    sauf bien sur si tu veux continuer un code dans ta form b ,,c'est sa????
    Oui en effet. Pour expliquer rapidement la chose, voila le principe de l'application, en reprenant les mêmes dénominations que précédemment :
    - ma fenêtre A est ma fenêtre principale. Depuis un menu elle appelle une fenêtre B en showmodal, qui est une partie de l'application dédiées à du requêtage sur une base de données.
    - la fenêtre B offre une gestion statistique des résultats des requêtes, en particulier via des graphiques de répartition des résultats.
    - les graphiques peuvent être sortis de la fenêtre B et passés en fenêtres volantes, sans pour autant bloquer l'utilisation de la fenêtre B. Ce sont les fenêtres C1, C2, C3.

    J'ai donc le besoin suivant :
    - A en normal
    - B en Showmodal, appelé par A
    - C1, C2, C3 en StayOnTop pour être toujours visibles, mais non Showmodal. C1, C2, C3 sont appelés par B.

    Or donc... le StayOnTop est très mal géré depuis la fenêtre B. La petite application de test que j'ai fourni en pièce jointe dans le premier message présente le problème :
    - si on crée une fenêtre StayOnTop depuis A, elle est StayOnTop pour l'application et seulement pour l'Application : très bien.
    - si on crée une fenêtre StayOnTop depuis B (ce qui est mon cas), elle est StayOnTop pour l'ensemble des applications windows. Ce qui amène à des comportements bizarres : si je change d'application, mes fenêtres A et B passent bien en arrière plan mais pas les fenêtres C1, C2, C3, qui continuent à encombrer l'écran

    J'espère avoir été plus clair

    Pour l'instant j'ai travaillé sur une gestion du StayOnTop à la main, en me passant du fsStayOnTop. Mais ça fait un peu bricolage, j'aurais préféré utiliser les comportements existants dans Delphi.

    Si vous avez des idées...

    (pardon pour les pavés à répétition )

  10. #10
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 770
    Points
    2 770
    Par défaut
    tu peut nous dire votre bricolage??
    si sa peut vs aidé, tu peut aussi surchargé Application.OnDeactivate
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 42
    Points : 19
    Points
    19
    Par défaut
    Pour le bricolage, j'ai commencé par repasser les fenêtre C1, C2, C3 en non StayOnTop, comme ça plus de problèmes par rapport aux autres applications.

    Le tout est ensuite de les maintenir au premier plan par rapport à B. Pour ça j'ai repéré les messages windows correspondant à des actions susceptibles de faire passer B au premier plan, et à chaque fois que je reçois un de ces messages, j'utilise la fonction SetWindowPos pour ramener mes fenêtre C1, C2, C3 au premier plan sans pour autant leur faire prendre le focus (ce qui aurait été le cas avec des BringToFront).

    Je n'ai pas le code ici, mais je rentrerai un peu plus dans le détail pour passer ce topic en résolu si je ne trouve pas d'autre solution...

  12. #12
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 770
    Points
    2 770
    Par défaut
    tu as essayé mon code???
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 42
    Points : 19
    Points
    19
    Par défaut
    Oups je n'avais pas fait attention ^^

    Je ne pourrai pas avant lundi.

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 42
    Points : 19
    Points
    19
    Par défaut
    Ca a l'air de très bien marcher ! Malgré quelques petits problèmes à l'ouverture du projet en delphi 5

    Je vais voir si je peux éviter de monopolyser les Application.Activate et Application.Deactivate pour ça, mais à priori je vais partir sur cette solution, un peu plus légère que celle que j'avais mis en place pour l'instant.

    Merci beaucoup pour ton aide et le temps passé sur ce problème ! Je donne dès que tout ça sera mis en place la solution que j'aurai finalement utilisée.

    Merci !

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 42
    Points : 19
    Points
    19
    Par défaut
    Finalement je suis resté sur l'utilisation des événements, cette méthode a le mérite de très bien fonctionner.

    Encore merci !

    (je passe ce topic en résolu)

  16. #16
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    39
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 39
    Points : 29
    Points
    29
    Par défaut
    Je sais que la discussion est closes depuis longtemps mais pour ceux qui cherchent je donne ma solution.

    Il suffit de désactiver la form en showmodal (form.enabled:=false) avant d'appeler la form stayontop et de la réactiver à la fin de l'opération.

    A plus

  17. #17
    Membre chevronné

    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Points : 1 765
    Points
    1 765
    Par défaut
    Salut

    Dsl, je n'ai pas lu ce qu'il y a eu plus tot :

    Essaye d'appeler tes fenetres C1, C2, C3 pas en ShowModal, et de mettre la fenetre B en Enabled=False : Quand tu auras C1 d'affiché, tu ne pourras pas retourner sur la fenetre B. Ensuite, remet Enabled de B a true quand tu fermes C1 ...

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

Discussions similaires

  1. ShowModal ne donne pas le focus ?
    Par tintinux dans le forum Composants VCL
    Réponses: 3
    Dernier message: 09/02/2012, 13h54
  2. [Joomla!] Lien de menu sur titre article et pas sur haut de la page
    Par dalmas dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 27/09/2011, 09h32
  3. Pas de haut parleur muet
    Par Speed41 dans le forum Delphi
    Réponses: 4
    Dernier message: 26/03/2007, 13h15
  4. [JScrollPane] qui ne veut pas se mettre en haut a gauche
    Par Cyber@l dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 24/11/2006, 10h41

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