2010-08-23 9 views
3

Je n'ai pas encore trouvé la meilleure solution pour cela. J'ai un dialogue non modal qui peut être ouvert dans des cas illimités par un raccourci clavier dans l'application. Même le dialogue lui-même peut ouvrir une nouvelle instance. Je veux que ces boîtes de dialogue soient toujours devant la fenêtre principale de l'application. J'ai essayé deux ou trois choses.Comment s'assurer qu'une boîte de dialogue est toujours devant la fenêtre principale

  • Définissez FormStyle sur fsStayOntop. Cela fonctionne mais a l'avantage que la boîte de dialogue sera en face de toutes les fenêtres, même les autres applications. Je veux seulement que ce soit devant ma fenêtre principale.
  • Définissez PopupMode sur pmAuto. Cela fonctionne également sauf dans le cas où une boîte de dialogue ouvre une autre boîte de dialogue. Si le premier dialogue est fermé, il ferme automatiquement le second. Ceci est inacceptable.
  • Utilisez les propriétés par défaut pour un formulaire. Dès que la fenêtre principale est cliquée sur les boîtes de dialogue ouvertes est derrière la fenêtre principale.

Toutes les autres suggestions :-)

+1

Je vous ai probablement mal compris, car pour autant que je sache, le comportement que vous désirez est le comportement par défaut. Voir http://privat.rejbrand.se/zorder.exe –

+0

Juste fait un test rapide pour cela et vous avez raison. Je ne peux pas dire pourquoi mon application ne se comporte pas comme ça. Il se peut qu'il y ait une boîte de dialogue Splash et une boîte de dialogue de connexion avant la fenêtre principale. Mais la solution de Sertacs a fonctionné pour moi. –

Répondre

7

De TCustomForm.PopupParent Property;

Si la propriété est définie sur PopupMode pmExplicit et PopupParent est nul, alors le Application.MainForm est implicitement comme PopupParent

.

+0

Merci, un test rapide a confirmé qu'il semble bien fonctionner. Je ne savais pas que pmExplicit fonctionnait de cette façon. –

-1

Vous pouvez regarder l'événement OnHide et immédiatement faire le drapeau visible à TRUE. Cela causera probablement du scintillement.

+0

Il s'agit de l'ordre z des fenêtres visibles. –

2

AFAIK Delphi 2007 prend en charge la fonctionnalité MainFormOnTaskbar. Avec

Application.MainFormOnTaskbar := True; 

dans la source du projet TOUT formulaire d'application (avec fenêtre parent par défaut) est affiché au-dessus de la forme principale.


Si vous ne savez pas quel formulaire est le formulaire principal, allez dans Projet/Options/Formulaires et définissez le formulaire principal correct. Une autre raison probable est que vous mettez à niveau un projet à partir d'une version précédente de Delphi afin que la source du projet ne contienne pas la ligne de code ci-dessus - ajoutez cette ligne manuellement.

+0

Hm, je pense que j'ai essayé celui-là mais je ne me souviens pas pourquoi je n'ai pas aimé ça. Cela pourrait être quelque chose comme si la première fenêtre ouverte est une boîte de dialogue de connexion. Après cela, la fenêtre principale est montrée et utilisée comme d'habitude. Mais l'information est bonne à avoir de toute façon. –

0

Je pense que votre premier effort, fsstayontop, est la meilleure option. Le problème avec l'affichage devant d'autres applications peut être impossible à éviter puisque vous utilisez vraiment la fonction Windows pas quelque chose d'unique à Delphi. Si je me souviens bien, il est possible de régler manuellement l'ordre Z, mais cela est fastidieux et impossible dans la plupart des applications.

Si votre boîte de dialogue n'est pas trop grande pour masquer d'autres applications, elle peut être déplacée et les utilisateurs peuvent toujours accéder aux autres applications sans d'abord interagir avec votre boîte de dialogue. Ne semble pas trop mauvais.

Questions connexes