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
Xichen - question vous référer est différent en ce qu'un formulaire modal est lancé à partir d'un 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