Site:  Cours VB.net  
4.2 Ouvrir plusieurs formulaires.

Rappel:Formulaire=fenêtre

Comment à partir d'un formulaire 'Form1' ouvrir un second formulaire à partir de la Classe 'Form2' ?

En VB2003

En VB 2005

Formulaire modal et non modale.

Comment se nomment les formulaires?

Autres

Un formulaire est un objet

Exemple

DialogResult

Bouton par défaut

 

Créer un formulaire en VB 2003:

 

A- Il faut d'abord créer la Classe Form2

Ajoutez un formulaire (Menu Projet, Ajouter un formulaire au projet), nommez le 'Form2' .

On se rend compte que quand on ajoute un formulaire (Form2 par exemple), on crée une nouvelle 'classe':

'Class Form2' qui hérite de System.Windows.Forms.Form , elle hérite donc de toutes les propriétés et méthodes de la Classe Form qui est la classe 'formulaire'.

Public Class Form2

Inherits System.Windows.Forms.Form

End Class

Elle contient du code généré automatiquement par le concepteur Windows Forms et les procédures liées aux évènements.

Dessinez dans Form2 les contrôles nécessaires.

B- Il faut créer ensuite le nouvel Objet formulaire, une instance de Form2:

Pour créer un nouveau formulaire dans le programme, il faut:

 

Dim formSecondaire As New Form2()

formSecondaire.ShowDialog() 

   

En résumé: on a Form1, on dessine Form2:

Pour que le bouton nommé "Créer Form secondaire" ouvre le second formulaire, il faut y mettre le code:

Private ButtonCreerFormSecondaire_Click()

  Dim formSecondaire As New Form2()

  formSecondaire.ShowDialog() 

End Sub

En conclusion:

Le fait d'ajouter un formulaire à un projet crée une Class, (un 'type' de formulaire, un moule) ce qui permet ensuite d'instancier (de créer) un objet formulaire.

 

VB 2003 est tolérant pour le premier formulaire: si on dessine un formulaire et ses contrôles et qu'on lance le programme, il accepte de fonctionner bien qu'on ait pas instancié le formulaire. Par contre, si on crée une seconde classe formulaire, il faut créer une instance de ce formulaire.

Dim formSecondaire As New Form2()

formSecondaire.ShowDialog()     

 

Créer un formulaire en VB 2005:

  Pas besoin d'instancier systématiquement un formulaire:
On peut utiliser  la Class Form2 sans instancier, en utilisant directement le nom de la Classe:
On dessine Form2 (la classe) puis on peut écrire directement:
Private ButtonCreerFormSecondaire_Click()
    Form2.ShowDialog()
End sub
On peut même utiliser les propriétés directement:
 Form2.ForeColor = System.Drawing.Color.Coral
 Form2.BackColor = System.Drawing.Color.Cyan
En fait, comme il n'y a pas d'instance de Form2, VB en crée une.

(Vb 2005, C'est comme en VB6)

On peut aussi faire comme en VB 2003 en instancier le formulaire, mais c'est plus complexe.

 

Formulaire modale ou non modale:

Un formulaire modal est un formulaire qui, une fois ouvert, prend la main, interdit l'usage des autres fenêtres. Pour poursuivre, on ne peut que sortir de ce formulaire.

Exemple typique: une MessageBox est un formulaire modal, les fenêtres d'avertissement dans Windows sont aussi modales.

Pour ouvrir un formulaire modal, il faut utiliser la méthode .ShowDialog

Dim f As New Form2          

f.ShowDialog()

 

ou en VB 2005

form2.ShowDialog()

Noter, et c'est très important, que le code qui suit .showDialog est exécuté après la fermeture de la fenêtre modale.

 

Pour avoir un formulaire non modal faire

Dim f As New Form2     

f.Show()     

 

ou en VB 2005

form2.Show()

 

Dans ce cas le formulaire f s'ouvre, le code qui suit .Show est exécuté immédiatement, et il est possible de passer dans une autre fenêtre de l'application sans fermer f.

Instance multiple: si un bouton1 contient le code:

Private Button1_Click

Dim f As New Form2     

f.Show()     

End Sub

A chaque fois que l'on clique sur le bouton cela ouvre un formulaire: on peut en ouvrir plusieurs. On se retrouve avec X instances de Form2!!

Pour éviter cela:

     -Utiliser ShowDialog

-Mettre Dim f As New Form2  dans la partie déclaration, ainsi il n'y aura qu'une instance de Form2. Le second click déclenche une erreur.

Class Form1

Dim f As New Form2  

 

Private Button1_Click  

    f.Show()     

End Sub

End Class

 

 

Dénomination des formulaires après leur création:

En VB 2003 et 2005 (avec instanciation d'un formulaire)

Une procédure  qui est dans Form1 crée un formulaire par

Private Buttonformsecondaire_Click ()   

    Dim formSecondaire As New Form2

End Sub

Utiliser Me pour désigner le formulaire où on se trouve. (Form2 ou formSecondaire  ne sont pas acceptés)

Exemple:

Me.Text= "Second formulaire" modifie le texte de la barre supérieure du formulaire

Le formulaire formSecondaire pourra être fermé par Me.close() dans le code du bouton Quitter par exemple.

 

Utiliser formSecondaire  pour désigner le formulaire.

Exemple:

Si la fenêtre appelante veut récupérer des informations dans le formulaire formSecondaire (un texte dans txtMessage par exemple), il faudra écrire.

Text=formSecondaire.txtMessage.Text

 

 

Exemple:

Class Form1

 

Sub MaRoutine()

    Dim formSecondaire As New Form2

    Text=formSecondaire.TextBox.Text

End Sub

 

Sub AutreRoutine()

..

End Sub

 

End Class

 

Dans la procédure MaRoutine() le formulaire formSecondaire est visible  et formSecondaire.TextBox est utilisable, pas dans la procédure AutreRoutine(). En résumé: Attention donc, si vous instanciez un formulaire dans une procédure, elle sera visible et accessible uniquement dans cette procédure .

Cela parait évident car un formulaire est un objet comme un autre et sa visibilité obéit aux règles habituelles ( J'ai mis malgré tout un certains temps à le comprendre!!).

Un formulaire est un objet et sa visibilité obéit aux règles habituelles: Il peut être instancié dans une procédure, un module, précédé de 'Public' ,'Private'.. ce qui permet de gérer son accessibilité.

 

En VB 2005, sans instanciation des formulaires:

Par contre en VB 2005, si vous dessinez Form2 et que vous tapez:

Private ButtonCreerFormSecondaire_Click()
    Form2.Show()
End sub
Vous pouvez utiliser dans Form1 les propriétés et contrôles de Form2 directement:
 Form2.ForeColor = System.Drawing.Color.Coral

La Classe Form2 étant public , on a toujours accès au formulaire et aux contrôles.

(Par contre, on n'a pas accès aux procédures évènements qui sont 'Private')

Un exemple:

Dans Form1 Button1 affiche le formulaire Form2 (directement sans instanciation).

Dans la procédure Button2_Click de Form1 on a accès au TextBox qui est dans Form2:

 

Autres remarques sur les formulaires:

Un formulaire est un objet:On peut ajouter à un formulaire des méthodes et des membres:

On a vu que, en fait, il y a création d'une Classe quand on dessine un formulaire, et bien comme dans un module de Classe (on verra cela plus loin), on peut ajouter des propriétés et des méthodes.

Pour ajouter une méthode à un formulaire, il faut créer une Sub Public dans le corps de la fenêtre:

Class Form1

Public Sub Imprime()

    Code d'impression

End Sub

End Class

Si une instance de la fenêtre se nomme F, F.Imprime() exécute la méthode Imprime (donc la sub Imprime())

De même, pour définir un membre d'un formulaire, il faut ajouter une variable 'public'.

Public Utilisateur As String

Permet d'utiliser en dehors du formulaire  F.Utilisateur

 

Exemple plus complet: Afficher un formulaire.

 

Autre problème : comment savoir si un formulaire existe, s’il n’existe pas le créer, s’il existe le rendre visible et lui donner la main :

 

        If f Is Nothing Then    'Si f=rien

            f = New Form2

            f.ShowDialog()

        Else

            If f.Visible = False Then

                f.Visible = True

            End If

            f.Activate()

        End If

 

Autre solution plus complète gérant aussi la taille du formulaire:

Si le formulaire existe et n'a pas été 'disposed'(détruit), le mettre à la taille normale et en avant.

        If Not IsNothing(F) Then
           
'Si on en a pas déjà disposé
            If Not F.IsDisposed Then
                F.WindowState = FormWindowState.Normal  ' Optional
                F.BringToFront()  '  Optional
            Else
                F = New Form3
                F.Show()
            End If
        Else
            F = New Form3
            F.Show()
        End If


(Merci Michel de Montréal)

Récupération d'information par DialogResult.

 

On ouvre un formulaire modal, comment, après sa fermeture, récupérer des informations sur ce qui s'est passé dans ce formulaire modale?

Par exemple, l'utilisateur a t-il cliqué sur le bouton Ok ou le bouton Cancel pour fermer le formulaire modale?

Pour cela on va utiliser une propriété DialogResult des boutons, y mettre une valeur correspondant au bouton, quand l'utilisateur clique sur un bouton, la valeur de la propriété DialogResult du bouton est assignée à la propriété DialogResult du formulaire, on récupère cette valeur à la fermeture du formulaire modal.

Dans le formulaire modal Form2 on met

 ButtonOk.DialogResult= DialogResult.ok

 

 ButtonCancel.DialogResult= DialogResult.Cancel

 

Dans le formulaire qui appelle:

Form2.ShowDialog()

If form2.DialogResult= DialogResult.ok then

    'l'utilisateur a cliqué sur le bouton ok

End if

 

Remarque:

  1. On utilise comme valeur de DialogResult les constantes de l'énumération DialogResult:DialogResult.ok .Cancel .No .Yes  .Retry  .None

  2. Si l'utilisateur clique sur la fermeture du formulaire modal (bouton avec X) cela retourne DialogResult.cancel

  3. on peut aussi utiliser la syntaxe: If form2.ShowDialog(Me) = System.Windows.Forms.DialogResult.OK Then qui permet en une seule ligne d'ouvrir form2 et de tester si l'utilisateur a cliqué sur le bouton ok de form2.

  4. La fermeture du formulaire modal  par le bouton de fermeture ou l'appel de la méthode Close ne détruit pas toujours le formulaire modal, il faut dans ce cas utiliser la méthode Dispose pour le détruire.
     

 

Bouton par défaut.

 

Parfois dans un formulaire, l'utilisateur doit pouvoir, valider (taper sur la touche 'Entrée') pour accepter et quitter rapidement le formulaire (c'est l'équivalent du bouton 'Ok') ou taper 'Echap' pour sortir du formulaire sans accepter (c'est l'équivalent du bouton 'Cancel').

Il suffit pour cela de donner aux propriétés AcceptButton et CancelButton du formulaire,le nom des boutons ok et cancel qui sont sur la feuille.

form1.AcceptButton = buttonOk
form1.CancelButton = buttonCancel

 

Si l'utilisateur tape la touche 'Echap' la procédure buttonCancel_Click est exécutée.