Comment faire pour afficher un formulaire modal sur le haut de sa forme propriétaire (le propriétaire est mis à fsStayOnTop ou pas), tout comme TOpenDialog n'
Résumé:
Veuillez consulter les commentaires ci-dessous à partir de Craig et de Sertac.
======================================================
Comme indiqué dans le minimisé code, TForm10
est fsStayOnTop
. TForm10.btnTryDlgClick
appel dlgOpen1.Execute
, et la boîte de dialogue affichée est comme prévu. Cependant, quand je l'appelle TForm11.Create(Self).ShowModal
à l'intérieur de TForm10.btnTryFormClick
, la forme est cachée derrière la TForm10. Je me demandais comment comprendre ce comportement, et pourquoi la norme TOpenDialog peut montrer que prévu? Tout commentaire est apprécié!
PS: Une solution de contournement consiste à remplacer la CreateParams procédure de TForm11, et définissez les Paramètres.wndParent à 0. Mais il me semble que la fenêtre de hiérarchie va être brisé à l'aide de cette solution de contournement.
procedure TForm11.CreateParams(var Params: TCreateParams); // override;
begin
inherited;
params.wndParent := 0;
end;
PS: une Autre solution est cité par Remy dans la ci-dessous des pages: setting the modal Form's PopupParent property to be the StayOnTop Form
. Mais dans le suivi des commentaires, Sertac mentionné cette solution de contournement est de briser la fenêtre de hiérarchie.
PS: peut-être pertinent tant de pages:
Les formulaires modaux caché par fsStayOnTop formes
Comment puis-je Garder le FindDialog de Rester sur le Dessus (Delphi)?
Comment faire en sorte qu'un dialogue est toujours à l'avant de la fenêtre principale
La forme est cachée derrière d'autres formes lorsque ShowModal est appelé
Prendre 2 formes en mesure de se chevaucher les uns les autres?
La forme Multiple d'applications Delphi et les boîtes de dialogue
Nouvellement créé modal de la fenêtre perd le focus et devenir inaccessible dans Windows Vista
Delphi - Comment prévenir les Formes/MsgBoxes pour déplacer sous une forme?
Comment permettre à Delphes formes secondaires derrière le formulaire principal
Faux boîte de dialogue modale à l'aide de Spectacle?
Delphi MainFormOnTaskBar Modal windows bug
Source pour Unit10:
unit Unit10;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm10 = class(TForm)
btnTryDlg: TButton;
dlgOpen1: TOpenDialog;
btnTryForm: TButton;
procedure FormCreate(Sender: TObject);
procedure btnTryDlgClick(Sender: TObject);
procedure btnTryFormClick(Sender: TObject);
end;
var
Form10: TForm10;
implementation
{$R *.dfm}
uses
Unit11;
procedure TForm10.FormCreate(Sender: TObject);
begin
FormStyle := fsStayOnTop;
end;
procedure TForm10.btnTryDlgClick(Sender: TObject);
begin
dlgOpen1.Execute;
// dlgOpen1.Execute(Self.Handle);
end;
procedure TForm10.btnTryFormClick(Sender: TObject);
begin
TForm11.Create(Self).ShowModal;
end;
end.
DFM pour Unit10:
object Form10: TForm10
Left = 0
Top = 0
Caption = 'Form10'
ClientHeight = 255
ClientWidth = 414
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
OnCreate = FormCreate
PixelsPerInch = 96
TextHeight = 13
object btnTryDlg: TButton
Left = 32
Top = 24
Width = 153
Height = 201
Caption = 'Try dialog'
TabOrder = 0
OnClick = btnTryDlgClick
end
object btnTryForm: TButton
Left = 224
Top = 24
Width = 153
Height = 201
Caption = 'btnTryForm'
TabOrder = 1
OnClick = btnTryFormClick
end
object dlgOpen1: TOpenDialog
Left = 96
Top = 168
end
end
Source pour Unit11:
unit Unit11;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm11 = class(TForm)
end;
implementation
{$R *.dfm}
end.
DFM pour Unit11:
object Form11: TForm11
Left = 0
Top = 0
Caption = 'Form11'
ClientHeight = 183
ClientWidth = 203
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
end
fsNormal
forme alors qu'il y a un autre fsStayOnTop
formulaire dans l'application. Dans cette question si vous définissez PopupParent de la forme modale à la top de sa forme il sera clairement détenue par la sur-top de sa forme, mais il doit être possédé par la forme qu'elle a été lancée selon la conception de l'application. C'était ce que je voulais dire par la rupture de la hiérarchie.BTW, j'ai copier collé le code, et ne peut pas reproduire le problème, le formulaire modal est au-dessus de Form10 lorsque je clique sur btnTryForm. +1 pour le lien de la collection (recherche)..
Je vous remercie beaucoup pour votre temps et vos commentaires utiles sur
window hierarchy
! Quant à la question en cours, je suis désolé que cela ne peut pas être reproduit. "Il works
sur ma machine..." O_O+1 pour moi l'effort de recherche, trop.
Merci!!!!
OriginalL'auteur SOUser | 2011-03-22
Vous devez vous connecter pour publier un commentaire.
Définir la forme modale du PopupParent propriété, exactement comme Remy suggéré. Qui sera le parent de la boîte de dialogue pour la StayOnTop forme, qui est ce que la boîte de dialogue Exécuter la méthode est déjà en train de faire. Je ne suis pas sûr de l'endroit où Sertac les commentaires sont à venir, mais à l'aide de PopupParent définit la fenêtre de hiérarchie correctement, de sorte que le dialogue sera toujours au-dessus de la StayOnTop forme.
window hierarchy
est conservé correctement ou pas?Si vous voulez une boîte de dialogue apparaisse toujours au-dessus d'un formulaire spécifique alors oui, le PopupParent de la propriété. Qu'est ce que ça existe. Vous pouvez venez de définir
Application.ModalPopupMode
àpmAuto
et Delphi occupons de tout pour vous. Lorsque que le dialogue va être apparenté à la forme active actuellement (généralementApplication.MainForm
), plutôt que deApplication.Handle
, ce qui l'empêche de rester coincé derrière le formulaire principal. Au cas où cela ne fonctionne pas, c'est quand vous avez un fsStayOnTop forme qui n'est pas actif, auquel cas la boîte de dialogue va apparaître derrière elle.Les boîtes de dialogue standard dépendent de la
Application.ModalPopupMode
pour obtenir leur parent. Vous pouvez voir les détails dansDialogs.pas::TCommonDialog.Execute
. C'est une très similaires idée. Les détails pour les autres boîtes de dialogue sont traitées parForms.pas::TCustomForm.CreateParams
.Réponse courte: Ensemble
Application.ModalPopupMode
àpmAuto
et ne vous inquiétez pas à ce sujet. Le seul moment où vous verrez des problèmes est que vous avez une forme normale et un séjour-sur-top de sa forme et ouvrir en même temps et que vous ouvrez une boîte de dialogue alors normal de la boîte de dialogue a le focus. Si cela se produit et la boîte de dialogue devrait apparaître en haut de l'fsStayOnTop forme trop fixéPopupParent
à la fsStayOnTop forme.J'ai mis un commentaire sur la question avec un lien au cas où quelqu'un se demande où les commentaires sont venant de. C'est le même cas dans votre premier commentaire, le formulaire modal est lancé à partir d'une forme normale alors qu'il y a un autre stay-on-top de sa forme.
OriginalL'auteur Zoë Peterson