Delphi: qu'est-Ce que l'Application.La poignée?

Qu'est-ce que TApplication.Handle?

  • D'où vient-elle?
  • Pourquoi existe-t-elle?
  • Et le plus important: pourquoi toutes les formes ont comme parent la poignée de la fenêtre?

Delphi aider à dit:

TApplication.Poignée

Permet d'accéder à la poignée de la fenêtre
de la forme principale (fenêtre) de l'
application.

property Handle: HWND;

Description

Utilisation de la Poignée lors de l'appel de l'API Windows
les fonctions qui nécessitent une fenêtre parent
poignée de. Par exemple, une DLL qui
affiche son propre haut-niveau pop-up
windows a besoin d'une fenêtre parent
affichage de ses fenêtres dans le
application. À l'aide de la Poignée de la propriété
fait de telles fenêtres de la partie de la
l'application, de sorte qu'ils sont
réduite, restauré, permis et
désactivé avec l'application.

Si je me concentre sur les mots "le handle de fenêtre de la fenêtre principale de l'application", et je prends ça pour dire le handle de fenêtre de la fenêtre principale de l'application, alors je peux comparer:

  • "le handle de fenêtre de la fenêtre principale de l'application", avec
  • la poignée de la fenêtre de la MainForm de la Application

mais ils ne sont pas les mêmes:

Application.MainForm.Handle: 11473728
Application.Handle: 11079574

Donc, qu'est-ce que Application.Handle?

  • D'où vient-elle?
  • Ce que Windows® poignée de la fenêtre est-il?
  • Si il est Windows® poignée de la fenêtre de la Application's MainForm, alors pourquoi n'ont-ils pas de match?
  • Si c'est pas la poignée de la fenêtre de la Application's MainForm, alors c'est quoi?
  • Le plus important: Pourquoi est-il l'ultime parent propriétaire de chaque forme?
  • Et le plus important: Pourquoi tout se détraque si j'essaie d'avoir un formulaire de unparented propriétaire (j'ai donc apparaître dans la barre des tâches), ou essayez d'utiliser quelque chose comme IProgressDialog?

Vraiment ce que je vous pose est: Quelle est la conception de la justification qui fait Application.Poignée existent? Si je peux comprendre le pourquoi, le comment devrait devenir évident.


Mise à jour la Compréhension par le biais d'un jeu de vingt questions:

En parlant de la solution de faire apparaître une fenêtre dans la barre des tâches en faisant de son propriétaire null, Pierre-Dessous en 2000, a déclaré:

Cela peut entraîner des problèmes avec les formulaires modaux montré à partir de
formes secondaires.

Si l'utilisateur passe à l'écart de l'application tout en un modal
le formulaire est en place, et puis retour à la forme que l'ont montré, le formulaire modal peut
se cacher derrière la forme. Il est possible de traiter avec cela, assurez-vous
le formulaire modal est apparenté [sic; il voulait dire appartenant] à la forme que l'a montré (à l'aide de
params.WndParent comme ci-dessus)

Mais ce n'est pas possible avec la norme
les boîtes de dialogue à partir de la Dialogs unité et exceptions, qui ont besoin de plus d'efforts pour
faire travailler la droite (essentiellement de la manipulation Application.OnActivate,
recherche de formulaires modaux apparenté à Application via GetLastActivePopup
et de l'amener au sommet de l'ordre-Z via SetWindowPos).

  • Pourquoi un formulaire modal fin collé derrière d'autres formes?
  • Ce mécanisme apporte normalement un formulaire modal à l'avant, et pourquoi il n'est pas fonctionnel?
  • Windows® est responsable de l'montrant les fenêtres empilées. Ce qui a mal tourné que Windows® ne donne pas le droit de windows?

Il a également parlé de l'utilisation de la nouvelle version de Windows style étendu que les forces d'une fenêtre apparaîtra sur la barre des tâches (lorsque les règles normales de fabrication de l'onu-la propriété est insuffisant, peu pratique, ou indésirables), par l'ajout de la WS_EX_APPWINDOW style étendu:

procedure TForm2.CreateParams(var Params: TCreateParams); 
begin 
   inherited CreateParams( params ); 

   Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW; 
end; 

Mais ensuite, il met en garde:

Si vous cliquez sur une des formes secondaires bouton de barre des tâches lorsqu'une autre application est
active, ce sera toujours apporter tous les formulaires de demande à l'avant. Si vous
ne voulez pas qu'il y a une option

Qui apporte toutes les formes de l'avant lorsque la forme de la propriétaire est toujours Application.Handle. Est Application faire cela? Pourquoi fait-elle ça? Plutôt que de faire cela, ne devrait-elle pas pas faire cela? Quel est l'inconvénient de pas faire cela; je vois l'inconvénient de faire (système du menu ne fonctionnent pas propertly, bouton de barre des tâches vignettes sont inexactes, Windows® shell ne peut pas minimiser les fenêtres.


Dans un autre post traitant de la Application, Mike Edenfield dit que la fenêtre parent envoie les autres de la fenêtre de leur réduire, agrandir et restaurer des messages:

Cela va ajouter le bouton de barre des tâches pour votre forme, mais il ya quelques autres détails mineurs à
poignée de. De toute évidence, votre formulaire reçoit toujours minimiser/maximiser qui sont envoyés à la société mère
la forme (la forme principale de l'application). Afin d'éviter cela, vous pouvez installer un message
gestionnaire pour WM_SYSCOMMAND en ajoutant une ligne comme:

procedure WMSysCommand(var Msg: TMessage); WM_SYSCOMMAND; 

procedure TParentForm.WMSysCommand(var Msg: TMessage); 
begin 
   if Msg.wParam = SC_MINIMIZE then 
   begin 
      // Send child windows message, don't 
      // send to windows with a taskbar button. 
   end; 
end; 

Noter que ce gestionnaire va dans le PARENT la forme de celui que vous voulez à se comporter indépendamment de l' > le reste de l'application, de manière à éviter de passer sur le minimiser message. Vous pouvez ajouter similaire > code pour SC_MAXIMIZE, SC_RESTORE, etc.

Comment est-ce que réduire/agrandir/restaurer des messages pour mon Windows® windows ne vont pas à ma fenêtre? Est-ce parce que les messages destinés à une fenêtre sont envoyés, par Windows® de la fenêtre du propriétaire? Et dans ce cas, tous les formulaires dans une application Delphi sont la "propriété" par Application? N'est-ce pas dire que la propriétaire null:

procedure TForm2.CreateParams(var Params: TCreateParams);
begin
   inherited;
   Params.WndParent := 0; //NULL
end;

va supprimer Application et c'est la Poignée de la fenêtre d'interférer avec mon formulaire, et Windows devrait une fois de plus envoyer moi ma réduire/agrandir/restaurer les messages?


Peut-être, si nous avons comparé et contrasté maintenant un "normal" d'application Windows fait les choses, avec Borland initialement conçu pour les applications Delphi de faire les choses - à l'égard de ce Application objet et c'est la boucle principale.

  • quelle solution était la Application objet de la résolution?
  • Ce changement a été fait avec les dernières versions de Delphi, de sorte que ces problèmes n'existent pas?
  • Fait le changement dans les versions de Delphi ne pas introduire d'autres problèmes, qui le premier la conception de l'Application essayé tellement dur à résoudre?
  • Comment ceux nouvelles applications continuent à fonctionner sans interférer avec eux?

Évidemment Borland réalisé la faille dans leur conception initiale. Quelle était leur conception initiale, ce problème a été la résolution, ce qui est de la faille, ce qui était le re-design, et comment permet-il de résoudre le problème?

  • Je pense que vous serez intéressé d'en apprendre plus sur ces deux trucs: en glissement annuel.être/élément.asp?i89 en glissement annuel.être/élément.asp?west i87
  • Sanders: j'ai vu ceux-là, ils ne permettent pas de résoudre les problèmes. Aussi, ne jamais, jamais, jamais passer GetDesktopWindow en tant que propriétaire d'une fenêtre, comme ceux-ci, et d'autres postes, sur le sujet suggèrent. Ce faisant utilisées pour Windows risque de gel. C'était un problème tel que Microsoft patché CreateWindow, si quelqu'un en passant GetDesktopWindow que le propriétaire est modifié pour utiliser la valeur NULL à la place. Et si je pouvais éditer ce post sur yoy.com, je le ferais.
  • À Tokyo, L'Application.La poignée est zéro!
  • Le "Propriétaire" d'un Formulaire est quelque chose d'indépendant de les "Parents" d'un Formulaire (Mais peut être le même). Le Propriétaire a à voir avec la façon dont Delphi liens TComponent de base des objets les uns aux autres de sorte qu'ils sont automatiquement libérée lorsque le "Propriétaire" (voir Create(AOwner: TComponent) est libéré. Le "Parent" (ou "WndParent') a à voir avec le visuel relation parent/enfant de contrôles visuels. Alors, pourquoi est-ce que chaque forme Application en tant que Propriétaire, parce que Application.CreateForm(TMyForm, MyForm) crée le formulaire à l'aide de lui-même en tant que propriétaire. Et pour le parent poignée en cours d'Application.Poignée", voir TCustomForm.CreateParams.
InformationsquelleAutor Ian Boyd | 2010-02-05