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 :

[D10.3] Form stay on top comportement changeant


Sujet :

Composants VCL Delphi

  1. #1
    Membre habitué
    Homme Profil pro
    Responsable associatif
    Inscrit en
    Octobre 2005
    Messages
    228
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Responsable associatif

    Informations forums :
    Inscription : Octobre 2005
    Messages : 228
    Points : 162
    Points
    162
    Par défaut [D10.3] Form stay on top comportement changeant
    Bonjour à tous !

    j'ai une form (qui permet de faire des recherches et poser des filtres) qui est appelée à l'appui de la touche enter quand l'utilisateur est dans une grille. Elle est déclarée StayOnTop.
    Depuis la Form principale de l'application, pas de problème elle reste bien OnTop... même si je retourne dans la form appelante
    Mais appelée à partir d'une form secondaire.... elle ne reste pas OnTop.... si je reviens dans la form appelante, elle passe dessous !
    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
       if Key = #13 then
      begin
        with frecherche do
        begin
          getcursorpos(position);
          // enregistre la position de la souris -> positionne la fenêtre de recherche
          champ := TJvDBGrid(Sender).Columns[TJvDBGrid(Sender).Col - 1].FieldName;
          // sur quel champ on est dans la grille
          disp := TJvDBGrid(Sender).Columns[TJvDBGrid(Sender).Col - 1]
            .Title.caption; // nom d'affichage de la colonne
          table := TJvDBGrid(Sender).DataSource.DataSet; // sur quel query ?
          frecherche.FormStyle:=fsstayontop;
          Show; // frecherche est stayontop
        end;
      end;
    je ne vois pas à côté de quoi je passe... une idée ?

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 447
    Points : 24 849
    Points
    24 849
    Par défaut
    La forme seconde est modale ?
    La forme des recherches est instancié à quel moment ? car le HWND_TOPMOST a effet au moment de la création du handle de la fenêtre, ainsi une fenêtre secondaire créée après pourrait supplanterait le Z-Order si elle même est fsStayToTop, j'avoue jouer pas mal sur le BringToFront et SetForegroundWindow car je le fais plus interprocess qu'au sein d'un même programme.
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre habitué
    Homme Profil pro
    Responsable associatif
    Inscrit en
    Octobre 2005
    Messages
    228
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Responsable associatif

    Informations forums :
    Inscription : Octobre 2005
    Messages : 228
    Points : 162
    Points
    162
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    La forme seconde est modale ?
    La forme des recherches est instancié à quel moment ? car le HWND_TOPMOST a effet au moment de la création du handle de la fenêtre, ainsi une fenêtre secondaire créée après pourrait supplanterait le Z-Order si elle même est fsStayToTop, j'avoue jouer pas mal sur le BringToFront et SetForegroundWindow car je le fais plus interprocess qu'au sein d'un même programme.
    oui !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
      Application.Initialize;
      Application.CreateForm(Tfdata, fdata);
      Application.MainFormOnTaskbar := True;
      Application.CreateForm(TForm1, Form1);
      Application.CreateForm(Tfrecherche, frecherche);
      Application.Run;
    Form1 et 2 ne sont pas StayOnTop.
    Form1 appelle frecherche.show --> frecherche est bien StayOnTop
    Form2 est créée par form1 en modale. Form2 appelle frecherche --> elle n'est plus StayOnTop

    C'est quand même bizarre...

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 683
    Points : 13 092
    Points
    13 092
    Par défaut
    Citation Envoyé par zarbouine Voir le message
    C'est quand même bizarre...
    Oui et non

    Oui parce que ce n'est pas le comportement demandé par FormStyle.

    Non si on se place au niveau de la gestion Delphi des fiches.

    Le but premier d'une fiche modale est d'imposer une action de l'utilisateur en restant au premier plan. Pour se faire, Delphi crée une nouvelle pompe à messages dédiée et pour s'assurer que cette fiche soit bien au premier plan va temporairement désactiver StayOnTop des fiches existantes par l'intermédiaire de Application.NormalizeTopMosts (dans les faits la propriété FormStyle n'est pas modifiée, l'API SetWindowPos est directement invoquée en lui passant HWND_NOTOPMOST). A la sortie de ShowModal, les fiches sont restorées dans leur état initial par Application.RestoreTopMosts.

    Résultat, ta fiche de recherche précréée se retrouve modifiée en fiche "normale" et peut se retrouver masquée par une autre.

    Tu as dès lors deux possibilités :
    1. créer frecherche uniquement lorsque tu en as besoin (soit depuis Form1, soit depuis la fiche modale) ;
    2. reforcer HWND_TOPMOST lors de affichage.


    Cela dit, il ne me semble pas logique de pouvoir fermer la fiche modale et que celle de recherche reste visible. La première approche est pour moi la meilleure

  5. #5
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 447
    Points : 24 849
    Points
    24 849
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    créer frecherche uniquement lorsque tu en as besoin (soit depuis Form1, soit depuis la fiche modale) ;

    Cela dit, il ne me semble pas logique de pouvoir fermer la fiche modale et que celle de recherche reste visible. La première approche est pour moi la meilleure
    je dirais même plus bannir CreateForm pour toutes fenêtres secondaires !
    Et la suppression de la variable globale aussi.

    Pour moi une ShowModal c'est toujours en with Create do try ShowModal finally Free end dans une méthode static Execute comme un TDialog.
    Et pour la recherche, j'ai migré une application récemment, idem, une encapsulation du Singleton via des fonctions orientées business plutôt qu'une manipulation de la fenêtre, cela isole le code.

    Question bête, c'est un code de reproduction pour le forum, Form1 et Form2 ont je suppose un vrai nom ?

    Sinon, j'avais bricolé un anti-modal pour une situation similaire où une fenêtre volante affiché avant devait rester accessible malgré un ShowModal d'une autre fenêtre, application multi-screen type vidéo surveillance.
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  6. #6
    Membre habitué
    Homme Profil pro
    Responsable associatif
    Inscrit en
    Octobre 2005
    Messages
    228
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Responsable associatif

    Informations forums :
    Inscription : Octobre 2005
    Messages : 228
    Points : 162
    Points
    162
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Question bête, c'est un code de reproduction pour le forum, Form1 et Form2 ont je suppose un vrai nom ?
    Oui bien sur... pour le reste je ne comprends pas tout (pas encore le niveau) et donc je vais faire au plus simple (la solution proposée par Andnotor) c'est à dire créer la frecherche à la demande...
    En tout cas merci de votre attention/aide, on en apprend toujours en vous lisant...même si souvent ça vole un peu haut pour moi
    Pat

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

Discussions similaires

  1. Form and Reports se comportant bizarrement
    Par MerwanK dans le forum Forms
    Réponses: 2
    Dernier message: 26/06/2015, 10h54
  2. [XL-2007] Mise en forme conditionnelle suivant un objectif changeant?!
    Par micnac dans le forum Excel
    Réponses: 5
    Dernier message: 24/03/2011, 09h36
  3. outil pour figer firefox ou chrome (stay on top)
    Par zenzo dans le forum Autres Logiciels
    Réponses: 2
    Dernier message: 12/11/2009, 22h14
  4. Comment obtenir une fenêtre Stay-On-Top ?
    Par k_boy dans le forum Langage
    Réponses: 3
    Dernier message: 27/12/2007, 15h32
  5. Fenêtre vraiment stay-on-top
    Par pdgnr dans le forum Delphi
    Réponses: 10
    Dernier message: 20/10/2006, 10h13

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