70 votes

Quelle est la différence entre Application.Run() et Form.ShowDialog() ?

Dans mon application, je veux d'abord afficher un formulaire de connexion, puis le formulaire principal si la connexion est réussie. Actuellement, je procède de la manière suivante :

var A = new LoginForm();
if ( A.ShowDialog() == DialogResult.OK )
    Application.Run(new MainForm());

Mais ensuite j'ai commencé à me demander - quel est le but de la Application.Run() ? Pourquoi ne pas simplement faire (new MainForm()).ShowDialog() également ? Quelle est la différence ? Et quelle serait la meilleure façon d'obtenir ce que je veux ?

66voto

adrianbanks Points 36858

Application.Run(Form) lance une boucle de messages sur le fil d'exécution actuel et affiche le formulaire spécifié. La boucle de messages permet au formulaire de recevoir des messages Windows (par exemple, des pressions sur les touches, des clics de souris, des invalidations de peinture) pour lui permettre d'apparaître réactif et d'avoir une interaction avec l'utilisateur. Lorsque vous appelez ShowDialog() sur un Form il fait en fait une chose similaire et crée une boucle de message modale pour le formulaire sur lequel ShowDialog a été appelé.

Il n'y a pas beaucoup de différence entre les deux appels. Application.Run ajoute un traitement supplémentaire des événements qui vous permet de faire le ménage dans les ressources lorsque le formulaire principal est fermé (cf. Application.ThreadExit ).

La façon recommandée de démarrer les applications WinForms est d'utiliser la méthode suivante Application.Run mais je pense qu'il s'agit plus d'une convention que d'une règle. La principale raison d'utiliser Application.Run c'est si vous voulez ouvrir plusieurs formulaires non modaux. Vous pouvez le faire en utilisant :

new Form().Show();
new Form().Show();
Application.Run();

Vous ne pourriez pas y parvenir en utilisant le ShowDialog() car l'un des formulaires devrait être modal.


Pour ce qui est de votre question, à savoir comment afficher un formulaire de connexion puis le formulaire principal si la connexion est réussie, je pense que ce que vous avez est parfait :

if (new LoginForm().ShowDialog() == DialogResult.OK)
{
    Application.Run(new MainForm());
}

L'alternative est de faire la plomberie vous-même et d'ouvrir une instance de MainForm dans l'événement de clôture de la LoginForm si la connexion a réussi.

5voto

BFree Points 46421

De MSDN :

Cette méthode ajoute un gestionnaire d'événement au le paramètre mainForm pour l'événement Closed pour l'événement Closed. Le gestionnaire d'événement appelle ExitThread pour nettoyer l'application l'application.

http://msdn.microsoft.com/en-us/library/ms157902.aspx

5voto

John Points 21

D'après mes tests, j'ai remarqué cette différence principale :

Lorsque Application.Run est utilisé, le bouton de fermeture du formulaire (X rouge) renvoie DialogResult.None ; cependant, lorsque ShowDialog est utilisé, le bouton de fermeture produit DialogResult.Cancel.

Cela a-t-il une importance pour vous ? Dans mon code, je testais DialogResult.Cancel pour déterminer le code de sortie de mon application. Ce test a été interrompu lorsque le X rouge a été utilisé pour fermer le formulaire. Je teste maintenant DialogResult.OK pour indiquer une sortie réussie.

        return myForm.DialogResult == DialogResult.OK ? 0 : 1;

2voto

Chad Stewart Points 168

Une différence essentielle est que ShowDialog est généralement une boîte de dialogue modale. Si vous vouliez créer un jeu d'outils convivial, vous ne voudriez pas qu'il soit composé de boîtes de dialogue modales.

De plus, Application.Run() accepte plus qu'un simple formulaire. Elle possède quelques surcharges.

Quant à votre application, je ne pense pas que cela ait beaucoup d'importance. Application.Run a un sens pour moi car il indique le début de votre application réelle.

2voto

Uwe Keim Points 15221

El documentation de la surcharge

public static void Run(
    ApplicationContext context );

propose un exemple soigné avec une approche différente qui implique également deux formulaires.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X