|
Site |
Cours VB.net |
|
|
|
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.FormEnd 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:
Instancier un formulaire à partir du moule, de la Classe Form2 avec le mot New.
Ouvrir ce formulaire, le faire apparaître, (avec ShowDialog, c’est un formulaire modal)
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
Dans le formulaire formSecondaire créé:
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.
Hors du formulaire formSecondaire, dans la procédure où a été instancié le formulaire:
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
Par contre, hors de la procédure qui a créée le formulaire, formSecondaire n'est pas accessible car on a crée le formulaire dans une procédure: cette instance du formulaire n'est visible que dans cette procédure. Pour rendre un formulaire accessible partout on peut écrire Public formSecondaire As New Form2 dans la zone générale avant les procédures.
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:
On utilise comme valeur de DialogResult les constantes de l'énumération DialogResult:DialogResult.ok .Cancel .No .Yes .Retry .None
Si l'utilisateur clique sur la fermeture du formulaire modal (bouton avec X) cela retourne DialogResult.cancel
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.
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.
|
|
|
|
|