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 :

Garder l'application au premier plan [FAQ]


Sujet :

Langage Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    118
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2004
    Messages : 118
    Points : 57
    Points
    57
    Par défaut Garder l'application au premier plan
    J'ai fait un test pour garder mon application au premier plan à l'aide de la fonction SetWindowPos...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    // met en avant 
    SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE) 
     
    // mode normal 
    SetWindowPos(Handle, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE)
    Ce code fonctionne bien lorsqu'on a qu'une seul fenêtre!
    Mais comme j'ai plusieurs fenêtre secondaire qui peuvent être ouverte et apparaissent donc devant la fenêtre principal, ça me pose problème... si je défini la position premier-plan dans ma fenêtre principale, les fenêtres secondaires apparaissent derrière la fenêtre principale!

    N'y a t'il pas une fonction qui ai une action sur l'application et pas seulement sur une fenêtre...?

    merci,
    greg

  2. #2
    Membre actif Avatar de declencher
    Inscrit en
    Mai 2003
    Messages
    441
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 441
    Points : 251
    Points
    251
    Par défaut
    bonjour,

    Et si tu switché les mises en avant, mise à normal entre la fenêtre princiâle et les fenêtres secondaires pour chaque affichage ?

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    118
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2004
    Messages : 118
    Points : 57
    Points
    57
    Par défaut
    merci pour ta réponse, apparement ça ne marche pas trop, ou alors je m'y prend mal...

    comment faire et à quel moment faire appel à la fonction setWindowPos?
    lors de l'affichage de la fenêtre?

    merci...

  4. #4
    Membre actif Avatar de declencher
    Inscrit en
    Mai 2003
    Messages
    441
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 441
    Points : 251
    Points
    251
    Par défaut
    Lors de l'action faisant le show ou le create de la fenêtre secondaire, j'aurai tenté de basculer la fenêtre principal en mode normal et la fenêtre fraichement appelé en mode "stay on top".

    Edit : StayOnTop n'est pas une propriété de TForm qui existe déjà ? (Je doute et j'ai pas delphi sous la main).

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    118
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2004
    Messages : 118
    Points : 57
    Points
    57
    Par défaut
    tout d'abord "Stay on top" n'est pas une propriété de TForm...

    la propriété "BringToFront" place la form devant toutes les autres, mais ne maintient pas le programme en avant-plan...

    j'ai essayé ceci lors de l'appel de la fenêtre secondaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    FormSecondaire.show;
    If MBtToujoursVisible.Checked
     then Begin
           SetWindowPos(FormSecondaire.Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE); //en avant plan
           SetWindowPos(FormPrincipale.Handle, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE); //mode normal
           FormSecondaire.BringToFront;
          end
     else Begin
           SetWindowPos(FormSecondaire.Handle, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE); // mode normal
           SetWindowPos(FormPrincipale.Handle, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE); // mode normal
          End;
    FormPrincipale.Enabled:=false;
    mais ça n'a pas l'air de fonctionner...

  6. #6
    Membre éprouvé
    Avatar de neilbgr
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2004
    Messages
    651
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Août 2004
    Messages : 651
    Points : 1 177
    Points
    1 177
    Par défaut
    Citation Envoyé par greg778
    tout d'abord "Stay on top" n'est pas une propriété de TForm...
    Et pourtant, il existe la propriété TForm.FormStyle qui peut etre valorisée à fsStayOnTop
    sur FormStyle

    Ensuite, effectivement, toutes les fenetres qui seront en StayOnTop, subissent les meme regles de Z-order que celles en plan "normal".

    Comme solution à la question je vois :
    Régulièrement faire un BringToFornt avec évidement FormStyle a StayOnTop
    Intercepter un message window qui fait mettre en avant-plan une fenetre déjà stay on top et dans ces cas là faire un bringToFront pour ta propre fenetre.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    118
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2004
    Messages : 118
    Points : 57
    Points
    57
    Par défaut
    autant pour moi neilbgr, je me suis un peu précipiter....

    j'ai donc essayé la propriété TForm.FormStyle...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    FormSecondaire.show;
    If MBtToujoursVisible.Checked
     then Begin
           FormPrincipale.FormStyle:=fsNormal;
           FormSecondaire.FormStyle:=fsStayOnTop;
           FormSecondaire.BringToFront;
          end
     else Begin
           FormPrincipale.FormStyle:=fsNormal;
           FormSecondaire.FormStyle:=fsNormal;
          End;
    FormPrincipale.Enabled:=false;
    mais ça n'a pas l'air de fonctionner tout le temps???
    Lorsque je suis sur ma FormSecondaire, et que je bascule vers un autre programme, parfois seul ma FormSecondaire reste en avant plan, parfois rien ne reste en avant plan...!!!
    de plus lorsque je fais appel à un OpenDialog dans ma fenêtre principale, celle-ci n'est plus en "StayOnTop"??

    N'y a t'il pas moyen de dire à l'application "tu restes toujours et pour toutes les fenêtres au premier plan!!" aahhh si c'était si facile

    merci

  8. #8
    Membre actif Avatar de declencher
    Inscrit en
    Mai 2003
    Messages
    441
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 441
    Points : 251
    Points
    251
    Par défaut
    Ouf je n'avais pas rêvé et j'avais bien vu un StayOnTop :p

    Pour en revenir à la question : je ne vois pas dans ton code la remise en fsStayOnTop de ta FormPrincipal ?

  9. #9
    Membre confirmé

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    258
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 258
    Points : 558
    Points
    558
    Par défaut
    Salut,
    Dans ton code :
    FormSecondaire.show;
    If MBtToujoursVisible.Checked
    then Begin
    FormPrincipale.FormStyle:=fsNormal;
    FormSecondaire.FormStyle:=fsStayOnTop;
    FormSecondaire.BringToFront;
    end
    else Begin
    FormPrincipale.FormStyle:=fsNormal;
    FormSecondaire.FormStyle:=fsNormal;
    End;
    FormPrincipale.Enabled:=false;
    tu dois mettre :

    FormPrincipale.formStyle:=fsStayOnTop

    et

    FormSecondaire.FormStyle:=fsNormal;

    Voilà essaye ceci et tiens nous au courant...

    A plus,

    Christopher

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    118
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2004
    Messages : 118
    Points : 57
    Points
    57
    Par défaut
    le code que j'ai donné est celui lorsque j'appelle la fenêtre secondaire...

    j'ai apparanvant, dans ma forme principale, le choix d'afficher toujours au dessus ou pas grâce au bouton MBtToujoursVisible sur lequel j'ai le code suivant...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    procedure TProjetVprintPersoft.MBtToujoursVisibleClick(Sender: TObject);
     begin
      MBtToujoursVisible.Checked:=not(MBtToujoursVisible.Checked);
      If MBtToujoursVisible.Checked
       then Begin
             SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE); //en avant plan
             StatusBar.Panels[2].Text:='VISIBLE';
            end
       else Begin
             SetWindowPos(Handle, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE); // mode normal
             StatusBar.Panels[2].Text:='';
            end;
     end;
    je suis revenu au fonctionnement avec SetWindowPos car avec le fsStayOnTop, la fenêtre fait un raffraichissement (clignotement)...

    donc mon code lorsque j'appèle la fenêtre secondaire est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    FormSecondaire.show; 
    If MBtToujoursVisible.Checked 
     then Begin 
           SetWindowPos(FormSecondaire.Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE); //en avant plan 
           SetWindowPos(FormPrincipale.Handle, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE); //mode normal 
           FormSecondaire.BringToFront; 
          end 
     else Begin 
           SetWindowPos(FormSecondaire.Handle, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE); // mode normal 
           SetWindowPos(FormPrincipale.Handle, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE); // mode normal 
          End; 
    FormPrincipale.Enabled:=false;
    et lorsque je quitte le fenêtre secondaire je fais (OnClose) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    If MBtToujoursVisible.Checked 
     then Begin 
           SetWindowPos(FormPrincipale.Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE); //en avant plan 
           SetWindowPos(FormSecondaire.Handle, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE); //mode normal 
           FormSecondaire.BringToFront; 
          end 
     else Begin 
           SetWindowPos(FormPrincipale.Handle, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE); // mode normal 
           SetWindowPos(FormSecondaire.Handle, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE); // mode normal 
          End; 
    FormPrincipale.Enabled:=true;
    je ne sais pas si c clair.... en tout cas tant que je reste dans ma fenêtre principale, ça à l'air de fonctionner, c'est après que ça se gâte...

  11. #11
    Membre actif Avatar de declencher
    Inscrit en
    Mai 2003
    Messages
    441
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 441
    Points : 251
    Points
    251
    Par défaut
    ça clignote ? oO
    Et en ajoutant un FormPrincipale.DoubleBuffered := true ?

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    118
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2004
    Messages : 118
    Points : 57
    Points
    57
    Par défaut
    quand je dis ça clignotte, ça le fait une fois, la fenêtre se rafraichit en fait (disparait puis réapparait furtivement, d'où clignottement)

    c'est un détail, mais la fonction SetWindowPos à le même principe que la propriété fsStayOnTop... c'est ce que j'ai trouvé sur d'autres forums et sites.

    Mais rien qui me permette de dire "tout mon prog en avant plan"!!

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

Discussions similaires

  1. Garder mon application en premier plan
    Par fire07 dans le forum Android
    Réponses: 7
    Dernier message: 23/01/2018, 15h20
  2. Garder une application en premier plan
    Par thebarbarius dans le forum Débuter
    Réponses: 2
    Dernier message: 31/07/2011, 12h38
  3. Script VBS - Focus garder la fenêtre en premier plan
    Par Furius dans le forum VBScript
    Réponses: 4
    Dernier message: 12/12/2005, 23h27
  4. Réponses: 1
    Dernier message: 22/11/2005, 11h00
  5. Mettre une application en premier plan
    Par portu dans le forum API, COM et SDKs
    Réponses: 15
    Dernier message: 23/02/2005, 15h39

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