Comment faire MessageDlg centrée sur le propriétaire du formulaire
J'aimerais que MessageDlg centré sur son formulaire parent.
Toutes les suggestions sur la façon d'accomplir ceci dans Delphi 2010?
J'ai trouvé le code ci-dessous ici: http://delphi.about.com/od/formsdialogs/l/aa010304a.htm mais il ne fonctionne pas pour moi. Le pop-up est toujours pas centré sur le propriétaire du formulaire. (Il n'est pas clair pour moi comment la méthode serait effectivement savoir le propriétaire de forme...)
function TForm1.MessageDlg(const Msg: string; DlgType: TMsgDlgType;
Buttons: TMsgDlgButtons; HelpCtx: Integer): Integer;
begin
with CreateMessageDialog(Msg, DlgType, Buttons) do
try
Position := poOwnerFormCenter;
Result := ShowModal
finally
Free
end
end;
- La plus-je utiliser cette solution, plus je suis content! Avec les nombreuses applications de ces jours étant multi-moniteur applications, sauf si vous faites quelque chose comme cela, l'utilisateur peut souvent se tourner vers un autre moniteur pour voir un message pop-up. Cela est particulièrement vrai pour les applications qui ont non modal formes que les utilisateurs peuvent positionner sur d'autres écrans...
Vous devez vous connecter pour publier un commentaire.
Vous pouvez faire
et de l'appeler comme
Cependant, personnellement, je ne pas le faire, parce que la boîte de dialogue affichée par
CreateMessageDialog
n'est pas natif de dialogue de Windows. Comparer le résultat visuel avec le natif de trucs:Au moins dans Windows 7 avec le thème Aero activé, le natif de dialogue ressemble beaucoup mieux. Cependant, il semble, cela ne peut pas être centré sur une forme particulière. Au lieu de cela, le dialogue est centré sur le moniteur en cours. Mais c'est aussi le comportement par défaut dans Windows (essayez le bloc-notes, WordPad, ou de la Peinture), alors pourquoi avez-vous besoin de ce nouveau comportement?
La boîte de dialogue n'a pas un rapport avec l'instance de TForm1. Il ne serait pas difficile de définir la position de la forme manuellement, mais je parie que quelqu'un qui est plus familier avec ce domaine de la VCL savoir comment le faire d'une façon plus propre.
Personnellement je n'ai jamais utiliser la Position de la propriété et de l'utilisation de mon propre code pour la position de tous les formulaires de mon parce que je n'ai jamais été satisfait de la performance de la propriété Position.
Mise à JOUR: Vous pouvez changer le propriétaire de la boîte de dialogue à l'aide de
Self.InsertComponent(Dialog)
. Vous devez stocker votre boîte de dialogue dans une variable locale, disons,Dialog
, pour que cela fonctionne:InsertComponent
n'appelle pasRemoveComponent
en interne, mais D2007 n'.Pourquoi limiter ce désir de boîtes de dialogue de message? Comme David Heffernan commenté:
Avec l'appareil(s), vous pouvez centrer tout dialogue native, comme:
MessageBox
,TFindDialog
,TOpenDialog
,TFontDialog
,TPrinterSetupDialog
, etc... L'unité principale dispose de deux routines, à la fois avec quelques paramètres optionnels:Wherelse vous utilisez
OpenDialog1.Execute
et permettre à Windows de décider où pour afficher la boîte de dialogue, vous pouvez désormais utiliserExecuteCentered(OpenDialog1)
et le dialogue est centré sur l'écran de la forme active:Pour afficher les boîtes de dialogue de message, utilisez
MsgBox
, un wrapper autour deApplication.MessageBox
(qui est un wrapper autour deWindows.MessageBox
). Quelques exemples:MsgBox('Hello world!');
MsgBox('Cancel saving?', MB_YESNO or MB_ICONQUESTION or MB_DEFBUTTON2);
MsgBox('Please try again.', MB_OK, 'Error');
MsgBox('I''m centered in the toolbar.', MB_OK, 'Fun!', Toolbar1.Handle);
Les unités:
Avis juridique: Ces unités sont écrits par moi dans cette néerlandais sujet. Les versions originales sont de Mark van Renswoude, voir NLDMessageBox.
Voici le code que j'utilise actuellement pour afficher un dialogue centré sur la forme active: