Question

J'ai une application Delphi 7 qui a deux vues d'un document (par ex.une modification HTML WYSIWYG peut avoir une vue WYSIWYG et une vue source - pas ma véritable application).Ils peuvent être ouverts dans des fenêtres séparées ou ancrés dans des onglets de la fenêtre principale.

Si j'ouvre une boîte de dialogue modale à partir de l'un des formulaires distincts, le formulaire principal est mis au premier plan et s'affiche comme la fenêtre sélectionnée dans la barre des tâches de Windows.Supposons que le formulaire principal soit la vue WYSIWYG et que la vue source soit affichée.Vous accédez à un point particulier de la vue source et insérez une balise d’image.Une boîte de dialogue apparaît pour vous permettre de sélectionner et de saisir les propriétés souhaitées pour l'image.Si la vue WYSIWYG et la vue source se chevauchent, la vue WYSIWYG sera placée au premier plan et la vue source sera masquée.Une fois la boîte de dialogue fermée, la vue source revient en vue.

J'ai essayé de définir les propriétés du propriétaire et de ParentWindow sur le formulaire auquel il est lié :

dialog := TDialogForm.Create( parentForm );
dialog.ParentWindow := parentForm.Handle;

Comment puis-je résoudre ce problème ?Que devrais-je essayer d'autre ?

Étant donné que les gens semblent trébucher sur mon exemple, je peux peut-être essayer avec un meilleur exemple :un éditeur de texte qui vous permet d'ouvrir plusieurs fichiers en même temps.Les fichiers que vous avez ouverts se trouvent soit dans des onglets (comme dans l'IDE Delphi), soit dans leur propre fenêtre.Supposons que l'utilisateur affiche la boîte de dialogue de vérification orthographique ou la boîte de dialogue de recherche.Ce qui se passe, c'est que si le fichier est en cours d'édition dans sa propre fenêtre, cette fenêtre est envoyée sous le formulaire principal dans l'ordre z lorsque la boîte de dialogue modale est affichée ;une fois la boîte de dialogue fermée, elle revient à son ordre z d'origine.

Note:Si vous utilisez Delphi 7 et recherchez une solution à ce problème, consultez ma réponse plus bas sur la page pour voir ce que j'ai fini par faire.

Était-ce utile?

La solution

J'utiliserais ce code...(En gros ce que Lars a dit)

dialog := TDialogForm.Create( parentForm );
dialog.PopupParent := parentForm;
dialog.PopupMode   := pmExplicit; 
dialog.ShowModal();

Autres conseils

J'ai finalement fini par trouver le répondre en utilisant Google Groupes.En un mot, toutes les boîtes de dialogue modales doivent être ajoutées aux éléments suivants :


procedure TDialogForm.CreateParams(var Params: TCreateParams);
begin
  inherited;
  Params.Style := Params.Style or WS_POPUP;
  Params.WndParent := (Owner as TWinControl).Handle;
end;

Je suppose que cela fait l'équivalent des réponses de Lars et Marius dans Delphi 7.

La boîte de dialogue est-elle affichée à l'aide de ShowModal ou simplement de Show ?Vous devriez probablement définir la propriété PopupMode correcte de votre boîte de dialogue.pmAuto serait probablement votre meilleur choix.Vérifiez également si vous devez définir la propriété PopupParent.

Tout d'abord, je ne suis pas tout à fait sûr d'avoir bien suivi, vous devrez peut-être fournir quelques détails supplémentaires pour nous aider à comprendre ce qui se passe et quel est le problème.Je suppose que je ne suis pas sûr de comprendre exactement ce que vous essayez d'accomplir et quel est le problème.

Deuxièmement, vous ne devriez pas avoir besoin de définir le parent de la boîte de dialogue puisque c'est essentiellement ce qui se passe avec l'appel à Create (en passant le parent).Les dialogues que vous décrivez semblent avoir besoin d'être un peu "repensés" pour être honnête.Cette boîte de dialogue permettant de saisir les propriétés de l'image est-elle un enfant de la fenêtre source ou de la fenêtre WYSIWYG ?

Je ne suis pas sûr de bien comprendre où vous voulez en venir, mais voici quelques choses que je peux vous suggérer d'essayer...

  1. Ce comportement change entre les différentes versions de Delphi.Je dirais que cela est dû aux obstacles qu'ils ont franchis pour prendre en charge Windows Vista dans Delphi 2007.
  2. Si vous utilisez Delphi 2007, essayez de supprimer la ligne du fichier source du projet qui définit la variable booléenne Application.MainFormOnTaskBar.
  3. Une fois cela supprimé, vous devriez pouvoir utiliser les différentes méthodes BringToFront / SendToBack du formulaire pour obtenir l'ordre Z que vous recherchez.

Je soupçonne que ce que vous avez découvert a été discuté sur ce lienBien sûr, j'ai peut-être complètement raté votre point, alors je m'excuse d'avance !

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top