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 laApplication
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
'sMainForm
, alors pourquoi n'ont-ils pas de match? - Si c'est pas la poignée de la fenêtre de la
Application
'sMainForm
, alors c'est quoi? - Le plus important: Pourquoi est-il l'ultime
parentpropriétaire de chaque forme? - Et le plus important: Pourquoi tout se détraque si j'essaie d'avoir un formulaire de
unparentedproprié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 laDialogs
unité et exceptions, qui ont besoin de plus d'efforts pour
faire travailler la droite (essentiellement de la manipulationApplication.OnActivate
,
recherche de formulaires modaux apparenté à Application viaGetLastActivePopup
et de l'amener au sommet de l'ordre-Z viaSetWindowPos
).
- 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 formeApplication
en tant que Propriétaire, parce queApplication.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", voirTCustomForm.CreateParams
.
Vous devez vous connecter pour publier un commentaire.
Le motif de la fenêtre de l'application a un peu d'une histoire sordide. Lors de l'élaboration de Delphi 1, nous savions que nous voulions utiliser "SDI" (windows, éparpillés sur le bureau) de l'interface utilisateur modèle pour l'IDE. Nous savions aussi que Windows sucé (et encore) à ce modèle. Toutefois, nous avons également remarqué que Visual Basic à l'époque employé ce modèle et il semble bien fonctionner. Après un examen approfondi, nous avons constaté que VB utilisé un "caché" parking de la fenêtre qui a été utilisé comme le "propriétaire" (Windows brouille la notion de parent et le propriétaire à la fois, mais la distinction est similaire à VCL) pour toutes les autres fenêtres visibles.
C'est comment nous avons résolu le "problème", où les fenêtres contenant le menu principal a été que rarement concentré pour le traitement de Alt-F pour le menu Fichier ne serait tout simplement pas de travail. En utilisant ce parking central de la fenêtre en tant qu'intermédiaire, nous pourrions plus facilement garder une trace de et de router les messages vers windows approprié.
Cet arrangement a également résolu un autre problème où normalement plusieurs fenêtres de haut niveau ont été entièrement indépendant. En faisant de la poignée de l'application de la "propriétaire" de toutes ces fenêtres, ils se comportent tous de concert. Par exemple, vous avez peut-être remarqué que lorsque vous sélectionnez tout des fenêtres de l'application, tous les fenêtres de l'application déplacer vers l'avant et de conserver leurs z-ordre les uns par rapport aux autres. Cela permettrait également de faire la demande, réduire et restaurer comme un regroupement fonctionnel.
Qui est une conséquence de l'utilisation de ce modèle. Nous pourrait ont fait manuellement tout ce travail pour garder les choses en ordre, mais la philosophie de conception a été de ne pas ré-inventer Windows, mais d'en tirer parti où l'on pouvait. C'est aussi pourquoi un TButton ou un TEdit est vraiment un Windows "Utilisateur" BOUTON et la fenêtre de modification de la classe et de style, respectivement.
Que Windows évolué, que "SDI" modèle a commencé à tomber en disgrâce. En fait, Windows lui-même a commencé à devenir de "hostile" à ce type de demande. À partir de Windows Vista et de continuer à 7, le shell de l'utilisateur ne semble pas bien fonctionner avec une application à l'aide d'un parking fenêtre. Donc, nous avons décidé de mélanger les choses autour de la VCL pour éliminer le parking de la fenêtre et déplacer sa fonction dans le formulaire principal. Ce qui s'est présenté plusieurs "poule et de l'œuf" problèmes de laquelle nous avons besoin d'avoir le parking de la fenêtre disponible assez tôt dans l'initialisation de l'application, de sorte que les autres windows peut "fixer", mais la forme elle-même ne peut pas être construit assez rapidement. TApplication doit sauter à travers quelques cerceaux pour obtenir que cela fonctionne, et il y a eu quelques subtiles cas limites qui ont causé de problème, mais la plupart des problèmes ont été résolus. Toutefois, pour toute application que vous aller de l'avant, il restera en utilisant l'ancien parking de la fenêtre du modèle.
Toutes les applications VCL ont "caché" de haut niveau de la fenêtre d'Application. Il est créé automatiquement au démarrage de l'application. Entre autres choses, il est le principal gestionnaire de message windows pour VCL - par conséquent, l'Application.ProcessMessages.
Avoir les applications de haut niveau de la fenêtre cachée est la cause des choses étranges, en particulier le système incomplet menu qui s'affiche dans la barre des tâches, incorrect de l'ongle du pouce dans windows Vista. Plus tard, des versions de Delphi corriger cela.
Cependant, pas toutes les vitres doivent l'avoir en tant que parent, Windows seulement tendance à travailler mieux si il est.
Cependant, toute forme créée avec l'Application.CreateForm, pour l'avoir en tant que parent, et il va également être la propriété de l'objet Application. Comme ils sont détenus, ils seront libérés une fois que l'Application est libéré. Cela arrive derrière les scènes dans les Formes.DoneApplication
Application.Handle
que celui de leur parent.Application.CreateForm
dans le fichier de projet deviendra le MainForm, aussi loin que l'objet application est en cause, et que la forme est attribué àApplication.MainForm
. À quoi faites-vous allusion quand vous dites que votre "formulaire par défaut"?De la recherche à la source, dans les formes.pas (Delphi 2009), il apparaît qu'ils créer un "maître" de la fenêtre dans win32 applications à interface graphique pour autoriser les appels à
Il semble que les messages transmis à la
Application.Handle
sont transmis de manière appropriée à laMainForm
, si elle existe. Cela permettrait à l'application pour répondre à minimiser, etc si la fenêtre principale n'a pas été créé. En modifiant la source du projet, vous pouvez créer une application delphi sans une fenêtre principale.Dans ce cas, le
TApplication
méthodes fonctionnent toujours, même si vous n'avez pas créé une fenêtre principale. Ne sais pas si je suis à saisir toutes les fins, mais je n'ai pas le temps de passer par toutes les TApplication de code.Par vos questions:
D'où vient-elle? C'est le handle d'une fenêtre créée en
TApplication.Create
Ce handle windows est-il? une fausse fenêtre que chaque gui delphi application requiert dans le cadre de la TApplication abstraction
Est-il le handle windows de l'application principale forme Pas
Si ce n'est pas la poignée de l'application de la mainform puis c'est quoi? Voir ci-dessus
le plus important: pourquoi est-il la société mère ultime de chaque forme? en supposant que vous avez raison que c'est la société mère ultime, je suppose qu'il en est ainsi parce qu'il est facile de trouver toutes les formes dans votre application (énumérer les enfants de ce "maître" de la forme).
et le plus important: pourquoi tout se détraque si j'essaie d'avoir un formulaire de unparented je pense que, le caché "maître" de la forme est d'obtenir le système de messages qu'il devrait transmettre à ses enfants et/ou de la mainform, mais ne peut pas trouver le unparented forme.
De toute façon, c'est mon prendre sur elle. Vous pouvez probablement vous en apprendrez plus en regardant la TApplication de la déclaration et le code dans
forms.pas
. La ligne de fond de ce que je vois, c'est qu'il est une abstraction pratique.Cordialement,
Ne