• Aucun résultat trouvé

Le passage de données entre formulaires La communication d’informations entre deu

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.