8
votes

Masquer la forme lorsque l'application est minimisée

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 masquer sur le formulaire d'état et le formulaire d'état disparaît.

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 masquer a été appelé tandis que minimisé.

visible semble être false pour le formulaire d'état lorsque l'application est minimisée et que l'appelant masquer semble avoir aucun effet (l'aide dit qu'il est juste définit visible sur false ).

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?


7 commentaires

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 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.


3 Réponses :


2
votes

avertissement: 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 xxx

puis Il par xxx

de cette façon, le formulaire ne peut pas être restauré avec la forme principale.


4 commentaires

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 Form2 par un TPanel 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.



4
votes

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.

appels de code 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>

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>

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;


4 commentaires

+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 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 fonctionne comme prévu. SC_MINIMIZE 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!



3
votes

J'utilise maintenant la solution suivante qui fonctionne pour moi:

  1. Dans Application.Enrestore Restaurer le gestionnaire d'événements J'appelle StatusForm.notifyRestored . Le formulaire d'état est explicitement caché s'il ne doit pas être visible.
  2. Dans mon formulaire de statut, je garde une trace de la visibilité dans un champ booléen fshouldisplay . Ceci est défini dans les méthodes showstatusform et hidestatusform .
    xxx

2 commentaires

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.