J'ai une forme principale et une forme d'état que j'affiche lorsque le travail se passe dans ma demande. Si le travail est terminé, je viens d'appeler Mon problème se produit lorsque je minimise la forme principale tandis que la forme d'attente est visible. Ensuite, les deux formes sont cachées qui est ce que je veux. Toutefois, si le travail finit tandis que la forme principale est minimisée, alors lorsque je le restaure, le formulaire d'état est également restauré, même si sont que ces observations sont-elles correctes? Comment la visibilité de forme est-elle restaurée lorsque l'application se concentre à nouveau? Comment puis-je masquer mon formulaire pendant que l'application est minimisée? P> masquer code> sur le formulaire d'état et le formulaire d'état disparaît. P>
masquer code> a été appelé tandis que minimisé. P>
visible code> semble être
false code> pour le formulaire d'état lorsque l'application est minimisée et que l'appelant
masquer code> semble avoir aucun effet (l'aide dit qu'il est juste définit
visible code> sur
false code>). p>
3 Réponses :
avertissement: em> Je ne suis pas sûr de 100% que l'approche suivante est sûre. Si vous n'avez pas besoin du même objet de formulaire pour être en vie pendant la durée de la vie de l'application (qui Vous ne pouvez pas très probablement pas), vous pourriez alors essayer de désactiver la création automatique du formulaire de popup (projet / options), puis à la créer et à le montrer par p> puis Il par p> de cette façon, le formulaire ne peut pas être restauré avec la forme principale. P> P>
Je ne dirais pas que c'est la seule bonne façon de faire des choses mais assez courantes définitivement. Au moins, c'est la façon dont la plupart des popups de nos projets sont traités.
Merci! Étant donné que cette boîte de dialogue apparaît très souvent (la plupart du temps pour intervalles assez courts), je préférerais créer le formulaire une seule fois.
Peut-être que la fenêtre d'état pourrait être un enfant de votre forme principale? (En plaintal Français: Remplacez la fenêtre d'état code> Form2 code> par un TPanel code> sur votre formulaire principal.)
La forme principale n'est pas la seule forme qui nécessite cette forme. Pourrait être une boîte de dialogue modale qui l'affiche ou une fenêtre d'éditeur non modale.
appels de code Maintenant, voir cette citation de la section Remarques de la documentation de la fonction, P> Si une fenêtre contextuelle est masquée en utilisant
la fonction showwindow, par la suite
appelant showownedpopups avec la fshow
paramètre défini sur true ne cause pas
la fenêtre à afficher p>
BlockQuote> Donc, une solution peut être de masquer le formulaire avant que l'application ne se cache pas, de sorte qu'il ne se montrera pas lors de la restauration. Mais nous devons ensuite savoir si le formulaire d'affichage est en fait caché ou montré lorsque nous restaurons. Cela peut être réalisé en mettant une propriété sur le formulaire d'affichage ou avec une variable globale peut-être. Dans le cas ci-dessous, "WattBeVisible" est une propriété hypothétique qui retournerait vrai si nous voulons afficher des informations: P> visible code> du formulaire d'affichage est en effet faux et appelant
masquer code> ne fait rien lorsque l'application est minimisée, car elle est masquée par l'application dans le cadre du mécanisme de minimisation.
showownedpopups Code>
avec «Faux» en tant que «Bshow» pendant que l'application minimise, puis avec «vrai» comme «bshow» pendant la restauration de la demande. Puisque la fonction affiche toutes les fenêtres cachées par un appel précédent, changeant la visibilité d'une forme
Entre entre n'a aucun effet. P>
type
TForm1 = class(TForm)
..
private
procedure WMSysCommand(var Msg: TWMSysCommand); message WM_SYSCOMMAND;
...
procedure TForm1.WMSysCommand(var Msg: TWMSysCommand);
begin
if (Msg.CmdType = SC_MINIMIZE) and Assigned(Form2) and Form2.Visible then
Form2.Hide;
inherited;
if (Msg.CmdType = SC_RESTORE) and Assigned(Form2) and Form2.ShouldBeVisible then
Form2.Show;
end;
+1 pour l'idée. Une question: seule la forme principale reçoit-elle ces événements? I'um en utilisant ces formes multiples, je voudrais donc intégrer le mécanisme dans la forme d'état elle-même. Semble que ce formulaire ne reçoit pas les événements cependant.
Je viens d'essayer d'attraper les événements sur la forme principale. Malheureusement, SC_RESTORE code> n'est pas déclenché pour ma forme principale lorsque j'apporte la fenêtre sur Windows 7.
@Smasher - Je trouve qu'un peu bizarre, la fenêtre aurait dû être restaurée en réponse à un WM_SYSCOMMAND. Je me demande si la fenêtre reçoit un message tenant une variation sur sc_restore. Souhaitez-vous que le biote et le wparam du message avec $ FFF0 comme expliqué dans la section Remarques de WM_SYSCOMMAND ? L'événement «ONRESTORE» d'un travail «applicatifs»?
Oui, application.onrestore code> fonctionne comme prévu.
SC_MINIMIZE CODE> Ne déclenche pas si vous cliquez sur l'icône de la barre de tâches sous Windows 7 (qui est efficacement minimisée). Voir ma réponse pour la solution qui fonctionne pour moi. Merci pour ton aide!
J'utilise maintenant la solution suivante qui fonctionne pour moi:
Application.Enrestore Code> Restaurer le gestionnaire d'événements J'appelle StatusForm.notifyRestored code>. Le formulaire d'état est explicitement caché s'il ne doit pas être visible. LI>
- Dans mon formulaire de statut, je garde une trace de la visibilité dans un champ booléen
fshouldisplay code>. Ceci est défini dans les méthodes showstatusform code> et hidestatusform code>. Li>
ol>
xxx pré> p>
Puisque vous avez résolu le problème avec un composant applicatifSEvent, je me demande si le composant fonctionnerait sur le formulaire de statut lui-même ..
@Sertatac: Vous avez raison, cela me ferait sauver la partie délégation. Merci, je vais essayer ça.
Remplacer «Wndparent» dans 'Creeparams' pour ce formulaire d'affichage?
+1 sonne comme si vous faites quelque chose de non standard avec la propriété de votre fenêtre
@David: Non, voici comment fonctionne un projet VCL vide. Essayez-le vous-même!
@so Combien de formes y a-t-il et sont-ils modaux?
Aucune forme modale nécessaire pour reproduire cela. Juste la forme principale et le formulaire d'état. Le formulaire de statut a
fsstayontop code> défini. Les commandes de formulaire principal sont désactivées à l'aide de deux messages Windows pendant que le formulaire d'état est visible.
Maintenant, je comprends enfin le problème et j'ai modifié la question de la rendre plus claire.
@David - J'espère que vous avez bien compris, car c'est ce que j'ai essayé de fournir une réponse.