fenêtres est chose courante. Les techniques qui permettent cette communication sont multiples. Afin d’en illustrer quelques unes, voici une hypothétique application de gestion d’un signalétique complexe de personnes comportant notamment les quatre formulaires suivants :
FBase, dont le titre est Gestion des personnes, est une fenêtre de sélection d’une personne. C’est par elle aussi que se commande l’encodage d’une nouvelle personne.
FAffiche, dont le titre est Affichage, est la fenêtre de consultation de l’ensemble des informations concernant la personne sélectionnée dans FBase. Dans cet exemple, la seule information affichable est le nom de la personne.
FVerifie, dont le titre est Vérification – correction, est la fenêtre de modification des informations concernant la personne sélectionnée dans FBase. Dans cet exemple, la seule information modifiable est le nom de la personne.
FEncode, dont le titre est Encodage, est la fenêtre d’encodage des informations concernant une nouvelle personne. Dans cet exemple, la seule information à encoder est le nom de la personne.
L’affichage du signalétique complet pour consultation se commande par le bouton Affichage de FBase. L’affichage du signalétique complet pour édition se commande par le bouton Vérification. Dans un cas comme dans l’autre, il
faut qu’une personne soit sélectionnée dans la ListBox MesPersonnes.
Voici le code de FBase qui provoque l’ouverture des fenêtres concernées en leur passant l’information nécessaire, à savoir le nom de la personne dans cet exemple.
Private Selection As Integer ' Seule variable de la classe FBase, pour mémoriser l'indice d'une sélection
Une procédure privée a été créée pour l’affichage d’un message en cas de tentative d’affichage ou d’édition alors qu’il n’y a pas de sélection. Cette procédure peut donc être appelée par BAffiche_Click et par BVerification_Click. Le libellé du bouton concerné lui est passé en paramètre de sorte à rendre le message plus précis.
Private Sub MessageErreur(ByVal TexteDuBouton As String)
MessageBox.Show("Une personne doit être sélectionnée pour utiliser " & TexteDuBouton) End Sub
Pour l’affichage, la méthode choisie pour la communication de l’information à FAffiche consiste profiter de la portée par défaut de tout objet déposé sur un formulaire, qui est Friend, pour affecter directement la TextBox d’affichage
TUnePers.
Private Sub BAffiche_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BAffiche.Click If MesPersonnes.SelectedItems.Count = 1 Then ' Seulement si une sélection existe
Dim Fs As New FAffiche
Fs.TUnePers.Text = MesPersonnes.SelectedItem ' Affecter la sélection à la TextBox
Fs.Owner = Me ' Passer le nom du Form appelant
Fs.ShowDialog() Else
MessageErreur(BAffiche.Text) ' Passer le libellé du bouton au message
End If End Sub
Pour l’édition, la méthode choisie pour la communication de l’information à FVerifie consiste à utiliser une propriété
Entree créée à cette fin dans cette classe. Cette façon de faire est conforme au contrôle d’accès préconisé en POO : on accède aux propriétés d’une classe par les méthodes qu’elle expose pour cela.
Private Sub BVerification_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles BVerification.Click If MesPersonnes.SelectedItems.Count = 1 Then
Dim Fs As New FVerifie
Selection = MesPersonnes.SelectedIndex ' Mémoriser l'indice tant qu’on a le focus
Fs.Entree = MesPersonnes.SelectedItem ' Affecter à une propriété du form
Fs.Owner = Me ' Passer le nom du Form appelant
Fs.ShowDialog() Else
MessageErreur(BVerification.Text) ' Passer le libellé du bouton au message
End If End Sub
Dans cette application, le nom du formulaire appelant doit être passé aux formulaires instanciés. C’est la propriété
Owner, au nom symbolique, qui est utilisée à cet effet mais la propriété Tag aurait tout aussi bien fait l’affaire.
Quand un formulaire est la propriété d'un autre, il est réduit et fermé en même temps que son formulaire propriétaire. Par exemple, si Form2 appartient à Form1, la fermeture ou la réduction de Form1 entraîne celle de Form2. En outre, un formulaire détenu par un autre formulaire n'est jamais affiché derrière son propriétaire.
Si ces caractéristiques de la relation de propriété ne conviennent pas, il est toujours possible de créer une propriété dans le formulaire secondaire pour lui transmettre le nom de l’appelant. Il suffit d’affecter ensuite cette propriété de la même façon que n’importe quelle autre valeur.
Voici le code complet de FAffiche :
Public Class FAffiche
Dim Fp As FBase ' Référence à un Form de type FBase
Private Sub FAffiche_Activated(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Activated Fp = Me.Owner ' Désignation du formulaire appelant à Fp
BOK.Select() End Sub
Private Sub BOK_Click(ByVal sender As Object, ByVal e As System.EventArgs)
Handles BOK.Click Fp.LDernierAffiche.Text = Me.TUnePers.Text ' Accès direct à un objet de FBase
Me.Close() End Sub
End Class
L’application conserve dans l’étiquette LDernierAffiche le dernier affichage réalisé par FAffiche. Pour l’exemple, c’est de la classe FAffiche qu’est affecté ce Label. La méthode choisie pour la communication de l’information à FBase est la même que celle utilisée par FBase pour transmettre le texte à FAffiche, c'est-à-dire l’affectation directe d’un objet du formulaire destinataire.
Voici maintenant le code complet de FVerifie :
Public Class FVerifie
Private Fp As FBase ' Référence à un Form de type FBase
Private Modifiee As Boolean ' A passer à MiseAJour de Fp
Private Sub FVerifie_Load(ByVal sender As Object, ByVal e As System.EventArgs)
Handles MyBase.Load Fp = Me.Owner ' Désignation du formulaire appelant à Fp
Modifiee = False End Sub
Private Sub TUnePers_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles TUnePers.TextChanged Modifiee = True ' L’événement TextChanged indique
End Sub ' s’il y a modification
Private Sub BCorrecte_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BCorrecte.Click If Me.TUnePers.Text <> String.Empty Then ' Ne pas envoyer une chaîne vide
Fp.MiseAJour(Modifiee, TUnePers.Text) ' Accès à une méthode Friend de Fp
End If Me.Close() End Sub
Private Sub BIncorrecte_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles BIncorrecte.Click Fp.Supprime() ' Accès à une autre méthode Friend de Fp
Me.Close() End Sub
Private Sub BAnnule_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BAnnule.Click Me.Close()
Public WriteOnly Property Entree() As String ' Méthode d’accès à une propriété ' locale
Set(ByVal Valeur As String)
TUnePers.Text = Valeur ' Stockage de la valeur affectée
End Set ' à cette propriété dans FBase
End Property
End Class
Plusieurs tâches sont disponibles dans FVerifie. Il reçoit les informations signalétiques par sa méthode Entree et les affiche dans les zones appropriées. L’utilisateur peut alors déclarer les informations correctes. Si elles ont été modifiées, elles sont remplacées dans FBase. C’est pourquoi la valeur de la variable Modifiee est passée à la méthode MiseAJour de FBase.
Les informations peuvent aussi être simplement déclarées incorrectes et dans ce cas elles sont supprimées dans FBase par sa méthode Supprime.
L’utilisateur peut aussi n’avoir à rien dire des informations qui lui sont soumises et annuler la vérification. Voici le code des méthodes MiseAJour et Supprime de FBase :
Friend Sub MiseAJour(ByVal ValeurChangee As Boolean, ByVal Personne As String)
If ValeurChangee Then
Me.MesPersonnes.Items.Insert(Selection, Personne) ' et remplacement par la bonne
Supprime() ' Suppression de la ligne erronée
End if End Sub
Friend Sub Supprime()
Me.MesPersonnes.Items.RemoveAt(Selection) ' Suppression de la ligne erronée
End Sub
Il reste à examiner les liens existant entre FBase et FEncode. Voici le code concerné dans FBase. La méthode
Encodage est déclarée Friend pour pouvoir être utilisée dans FEncode.
Private Sub BEncodage_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BEncodage.Click Dim Fs As New FEncode
Fs.Owner = Me ' Passer le nom du Form appelant
Fs.ShowDialog()
If Not Fs.Abandonne Then
Encodage(Fs.NomEncode()) ' Appeler la méthode locale Encodage
End If ' pour le stockage de la propriété
End Sub ' renvoyée par la méthode NomEncode
' de Fs.
Friend Sub Encodage(ByVal Personne As String) Me.MesPersonnes.Items.Add(Personne)
End Sub
L’affichage modal de FEncode est indispensable ici car le formulaire secondaire doit rester actif jusqu'à la fin du traitement et ne pas permettre à FBase de continuer ses traitements. S’il n’est pas modal, FBase reçoit la propriété
NomEncode dès l’ouverture de FEncode alors que rien n'a encore été encodé. Cela entraîne l’ajout d’une ligne vide. Indépendamment de la propriété retournée par FEncode, cette dernière utilise
la méthode Encodage de FBase pour enregistrer des encodages successifs, sans retour à FBase.
Voici le code complet de FEncode :
Public Class FEncode
Private Annule As Boolean ' Pour ne pas enregistrer sur une annulation
Private Modifiee As Boolean ' Pour ne pas ajouter une valeur déjà
Private Sub FEncode_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load Fp = Me.Owner TUnePers.Clear() Modifiee = False End Sub
Private Sub FEncode_Activated(ByVal sender As Object, ByVal e As System.EventArgs)
Handles MyBase.Activated TUnePers.Select()
End Sub
Private Sub TUnePers_TextChanged(ByVal sender As Object, ByVal e As
System.EventArgs) Handles TUnePers.TextChanged Modifiee = True ' L’événement TextChanged indique
End Sub ' s’il y a modification
Private Sub BOK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles BOK.Click Annule = Not Modifiee ' A la sortie, si la valeur est déjà
Me.Close() ' enregistrée, Annule reçoit True et cette
End Sub ' méthode devient équivalente à BAnnule_Click
Private Sub BAnnule_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles BAnnule.Click Annule = True
Me.Close() End Sub
Private Sub BAjout_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles BAjout.Click If Me.TUnePers.Text <> String.Empty Then
Fp.Encodage(Me.TUnePers.Text) ' Accès à la méthode Encodage de Fp
TUnePers.Clear()
Modifiee = False ' Réinitialise Modifiee après enregistrement
End If
TUnePers.Select() End Sub
Public ReadOnly Property NomEncode() As String Get
Return TUnePers.Text ' Réponse à la demande d’accès à NomEncode
End Get ' par Fp
End Property
Public ReadOnly Property Abandonne() As Boolean Get
Return Annule End Get
End Property End Class
La réponse à l’événement Click du bouton BOK rend le focus à la fenêtre appelante FBase. Cette dernière continue alors son traitement et prend possession de la valeur demandée par Fs.NomEncode dans BEncodage_Click.
Entre le moment où FEncode reçoit le focus et le moment où FBase le récupère, la procédure BAjout_Click de
FEncode a ajouté toutes les valeurs d’une même session d’encodage dans la ListBox MesPersonnes de FBase. Bien que FBase n’ait pas le focus, sa ListBox est effectivement mise à jour au fur et à mesure des encodages.
Si le formulaire d’encodage ne doit pas permettre l’encodage de plusieurs personnes en une même session, le code peut être écrit autrement.
Dans FBase, la procédure d’appel de FEncode est la suivante :
Private Sub BEncodage_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BEncodage.Click Dim Fs As New FEncode
Fs.ShowDialog()
If Not Fs.Abandonne Then
Encodage(Fs.NomEncode()) ' Réponse fournie par la propriété NomEncode de Fs
End If End Sub
Aucune méthode et aucun objet de FBase n’est directement utilisé dans FEncode qui n’a ainsi pas besoin de connaître l’appelant.
Public Class FEncode
Private Annule As Boolean
Private Sub FEncode_Activated(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Activated TUnePers.Clear()
TUnePers.Select() End Sub
Private Sub BOK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles BOK.Click If TUnePers.Text = String.Empty Then
Annule = True Else Annule = False End If Me.Close() End Sub
Public ReadOnly Property NomEncode() As String Get
Return TUnePers.Text End Get
End Property
Public ReadOnly Property Abandonne() As Boolean Get
Return Annule End Get
End Property
Private Sub BAnnule_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BAnnule.Click Annule = True
Me.Close() End Sub
End Class
Le cas de l’exemple ci-dessus, où le formulaire d’encodage doit fournir une seule chaîne de caractères par session d’encodage, rappelle un outil de saisie qui existait dans les versions antérieures de VB : l’InputBox. Cet outil est encore disponible dans la librairie MicroSoft.VisualBasic.Interaction mais ne s’utilise plus de la même manière que son ancêtre. La réalisation d’une InputBox ressemblant autant que possible à l’ancienne permet d’aborder une autre forme de communication entre formulaires.