TD : Utilisation du contrôle DAO (3, fin)
Voyons la fin de notre projet PTestDao ...
(Télécharger le début du projet)
Le but de cette troisième et dernière partie du
TD sur le contrôle Data DAO sera de demander à l'utilisateur s'il veut
valider les modifications ou non (s'il y en a) lors de la fermeture du
formulaire. Ceci pourra être réalisé à l'aide de la propriété DataChanged
des contrôles liés et de la fonction MsgBox de Visual basic.
Nous allons donc créer une fonction qui testera
chaque contrôle lié pour regarder si son contenu a été modifié ou non
(propriété DataChanged) par rapport au contenu du champ lié (DataField).
Pour faire une boucle générique (indépendante du contexte et, donc,
réutilisable pour un autre formulaire).
Nous obtiendrons le code source suivant
qu'il convient de saisir dans le module du formulaire (vous pourrez, plus
tard, en faire une fonction publique (dans un module de base .Bas) à
laquelle vous passerez le formulaire et le Nom du DataControl en paramètres) :
|
'-------------------------------------
Private Function IsModif() As Boolean
'-------------------------------------
Dim lctl As Control
IsModif = False
For Each lctl In Me.Controls
If TypeName(lctl)
= "TextBox" Then
If lctl.DataField
<> "" Then
If lctl.DataChanged
Then
IsModif = True
Exit For
End If
End If
End If
Next lctl
End Function
|
Vous remarquerez l'utilisation de la collection
système Controls. C'est elle qui nous permet d'écrire un code générique
facilement paramétrable et transposable. En cas de besoin vous
pouvez consulter notre page de cours sur les
collections système.
Nous testons le type du contrôle à l'aide de la
fonction TypeName pour limiter nos tests aux contrôles de type TextBox
(inutile de tester les Labels ou CommandButtons) qui sont nos
contrôles liés. Ensuite nous testons la valeur de la propriété DataField,
en effet, pour un contrôle lié cette propriété contient le nom du
champ et ne peut donc être vide ! Ce n'est qu'après ces deux
"filtres" que nous tentons de savoir si le contenu du contrôle a
été modifié ou non.
La fonction IsModif nous renverra Vrai (True) si les
données du formulaire ont été modifiées par l'utilisateur. Nous allons donc
l'appeler lors de la demande de fermeture pour savoir quelle conduite
adopter (fermer ou poser la question de la sauvegarde). Pour cela, nous allons
coder la procédure événementielle cmdClose_Click() comme suit :
|
'---------------------------------
Private Sub cmdClose_Click()
'---------------------------------
' si les données n'ont pas été modifiées, on ferme le formulaire
If Not IsModif() Then
Unload Me
Else
' sinon, on demande à l'utilisateur ce qu'il veut faire
If MsgBox("Voulez vous enregistrer les modifications ?", _
vbQuestion + vbYesNo, _
"Fermer le formulaire") = vbYes Then
Unload Me ' Si l'utilisateur a répondu 'oui' il faut sauver,
' le déchargement du formulaire va enregistrer les données
Else
' Si l'utilisateur n'a pas répondu 'oui' il ne faut pas sauver
Me.datCli.UpdateControls
' dans ce cas, on annule les modifications
Unload Me
' avant de fermer le formulaire
End If
End If
End Sub
|
Pour terminer, il faudrait supprimer la croix de fermeture
du formulaire en haut à droite de la fenêtre. Bien sûr, si l'utilisateur se
sert de cette croix pour fermer son formulaire, l'événement click du
bouton cmdClose ne sera pas déclenché. Pour finir, saisissez les
valeurs de propriétés suivantes pour votre objet formulaire.
| Propriété |
Valeur |
| BorderStyle |
Fixed Dialog : Cela empêche le
redimensionnement du formulaire par l'utilisateur (inutile) et fait disparaître
les boutons "Réduire" (propriété MinButton) et
"Agrandir" (propriété MaxButton). |
| ControlBox |
False : fera disparaître l'icône
de dialogue système de la fenêtre (à gauche de la barre de titre)
et la croix de fermeture du formulaire (à droite).
|
Vous obtenez le formulaire suivant (notez l'apparence de la barre de titre) :
Nous verrons, dans un autre TD, comment faire disparaître le
contrôle Data DAO (en le rendant invisible) en réalisant la sélection de la
fiche grâce à un formulaire de liste. Nous avons déjà étudié le code
source nécessaire à la gestion de cette liste dans la
fiche de cours dédiée à la bibliothèque de code DAO
.
Il suffira donc de réunir les deux techniques pour solutionner notre problème.