Exercice 10 - La feuille frmChild - saisie du code ♪▲
Le code de la feuille « frmChild » (fenêtre fille)
Attention!
Cette feuille est la clé de voûte du programme, je vous recommande la plus grande attention dans la saisie du code.
Seules les instructions nécessitant du code seront insérées dans cette leçon.
Si vous ne trouvez pas la procédure indiquée, c'est qu'elle n'a pas été déclarée correctement.
Continuez pour retourner plus tard lorsque nous ferons le contrôle de l'application.
En « Object »/« Général » et dans la procédure « déclarations », nous saisissons :
'Enregistrement courant de type Integer, car nous ne gérons pas plus de 32767 enregistrements...
Dim NumEnreg%
'Nombre total d'enregistrements dans le fichier courant (global à ce module)
Dim NbreEnregistremts%
'
Dim DNum%Nous insérons les procédures nécessaires au fonctionnement, nous commençons par les boutons!
À ce niveau les procédures sont déjà en place, il ne nous reste plus qu'à insérer le code.
Private Sub Command3D1_Click( )
'Affiche la feuille de recherche des fichiers sons
End Sub
Private Sub Command3D2_Click( )
'Écoute des fichiers sons
End Sub
Recherche d'un enregistrement dans la base de données
Private Sub Command3D3_Click( )
'Recherche enregistrement et stocker l'enregistrement courant
StockeEnreg% = NumEnreg%
'Demande quelle chaîne rechercher
Titre$ = "Recherche d'un film"
Message$ = "Veuillez donner une partie du titre recherché. "
Message$ = Message$ + "Aucune distinction ne sera faite entre minuscules "
Message$ = Message$ + "et majuscules et la recherche est effectuée "
Message$ = Message$ + "uniquement dans les champs TITRE et DESCRIPTION."
ObjetRecherche$ = InputBox$(Message$, Titre$)
If Trim$(ObjetRecherche$) <> "" Then
'OK activé pour lancer la recherche
ObjetRecherche$ = Trim$(ObjetRecherche$)
'pas encore d'occurrence
Occurrence% = False
For X% = 1 To NbreEnregistremts%
'Lecture enregistrement par enregistrement
GetRecord DNum%, X%, Me
'Affiche progression de recherche
InfoEnreg Me, X%, NbreEnregistremts%
'Regroupe les champs à inspecter
Enreg$ = Trim$(Video.Titre) + Space$(10) + Trim$(Video.Description)
'Comparons
If InStr(LCase$(Enreg$), LCase$(ObjetRecherche$)) > 0 Then
'Trouvé!
Occurrence% = True
EnregTrouve% = X%
Titre$ = "La recherche a abouti"
Message$ = "Le texte recherché <" + ObjetRecherche$ + "> a été trouvé dans l'enregistrement"
Message$ = Message$ + " n° " + Str$(X%) + " et sur lacassette n° "
Message$ = Message$ + Str$(Video.NumCass) + ". Désirez-vous modifier ou afficher le titre du film "
Message$ = Message$ + "Titre du film <" + Trim$(Video.Titre) + "> et terminer la recherche ?"
'Demande de répondre par oui ou par non à la proposition de poursuivre la recherche
a% = MsgBox(Message$, 32 + 4, Titre$)
'Réponse = OUI : nous sortons prématurément
'de la boucle
If a% = 6 Then
'Affiche le résultat de la recherche pour le modifier
Exit For
Else
'Stockage du résultat de la dernière recherche pour l'afficher après la sortie de la fonction de recherche
NumEnreg% = X%
End If
End If
Next X%
If Occurrence% = False Then
'Aucune occurrence :nous affichons l'enregistrement affiché lors de la demande de recherche
NumEnreg% = StockeEnreg%
Else
'Affiche la dernière occurrence
NumEnreg% = EnregTrouve%
End If
'Lecture de l'enregistrement initial ou trouvé
GetRecord DNum%, NumEnreg%, Me
'Affiche progression du travail
InfoEnreg Me, NumEnreg%, NbreEnregistremts%
End If
End Sub
'
Private Sub CtlDelField_Click()
CL$ = Chr$(13) + Chr$(10)
Titre$ = "Effacement des zones textes"
Msg = "Voulez-vous vraiment effacer" + CL$
Msg = Msg + " les zones de textes?"
Reponse% = MsgBox(Msg, 16 + 4, Titre$)
'Quitter le programme
If Reponse% = 7 Then Exit Sub
'retour à l'enregistrement Effacement des zones de texte
CtlTitre.Text = ""
CtlAnnee.Text = "1980"
CtlDuree.Text = "100"
'Nous supposons 1 film par cassette
CtlNumCass.Text = Trim$(Str$(NbreEnregistremts%))
CtlNumFilm.Text = "1"
CtlTypeCassette.Text = "E-180"
CtlDescriptif.Text = ""
CtlFichierSon.Caption = ""
End Sub
'
Private Sub CtlFin_Click()
'Aller jusqu'au dernier enregistrement à condition que n° de l'enregistrement courant soit différent du n° du dernier
If NumEnreg% <> NbreEnregistremts% Then
'Stockage de l'enregistrement courant
PutRecord DNum%, NumEnreg%, Me
'Incrémenter le compteur d'enregistrements
NumEnreg% = NbreEnregistremts%
GetRecord DNum%, NumEnreg%, Me
InfoEnreg Me, NumEnreg%, NbreEnregistremts%
'Correction de barre de défilement Correction du n° d'enregistrement
CtlRoll.Value = NumEnreg%
End If
End Sub
'
Private Sub CtlMoins_Click()
'revenir à l'enregistrement précédent à condition que le n° de l'enregistrement soit > 1
If NumEnreg% > 1 Then
'sauvegarder l'enregistrement courant
PutRecord DNum%, NumEnreg%, Me
'Décérmente le compteur d'enregistrements
NumEnreg% = NumEnreg% - 1
'Lit l'enreg. précédent
GetRecord DNum%, NumEnreg%, Me
InfoEnreg Me, NumEnreg%, NbreEnregistremts%
'Corrige la barre de défilement du n° de l'enregistrement sélectionné
CtlRoll.Value = NumEnreg%
End If
End Sub
'
Private Sub CtlMoins10_Click( )
'Avancer de 10 enregistrements à condition que le n° de l'enreg. soit supérieur à 10
If NumEnreg% > 10 Then
'Sauvegarde de l'enregistrement courant
PutRecord DNum%, NumEnreg%, Me
'Incrémente le compteur d'enregistrements
NumEnreg% = NumEnreg% - 10
GetRecord DNum%, NumEnreg%, Me
InfoEnreg Me, NumEnreg%, NbreEnregistremts%
'Corrige la barre de défilement du n° de l'enregistrement sélectionné
CtlRoll.Value = NumEnreg%
End If
End Sub
'
Private Sub CtlNumCass_KeyPress(KeyAnsi As Integer)
If InStr("0123456789", Chr$(KeyAnsi)) = 0 Then
KeyAnsi = 0
End If
End Sub
'
Private Sub CtlPlus_Click( )
'avancer, ajouter éventuellement de nouveaux enregistrements Le titre est la saisie minimum
If Trim$(CtlTitre.Text) = "" Then
'Message
Msg = "Vous devez saisir un titre de film!"
MsgBox Msg
Exit Sub
End If
If NumEnreg% < NbreEnregistremts% Then
'Sauvegarde de l'enregistrement courant
PutRecord DNum%, NumEnreg%, Me
'Incrémente le compteur d'enregistrements
NumEnreg% = NumEnreg% + 1
'Si pas de nouvel enreg., lire l'ancien
GetRecord DNum%, NumEnreg%, Me
InfoEnreg Me, NumEnreg%, NbreEnregistremts%
'Corrige la barre de défilement du n° de l'enregistrement sélectionné
CtlRoll.Value = NumEnreg%
ElseIf NbreEnregistremts% < 32767 Then
'pas plus de 32767 enregistrements Sauvegarde l'enreg. courant
PutRecord DNum%, NumEnreg%, Me
'Incrémente
NumEnreg% = NumEnreg% + 1
'Nouvel enregistrement : incrémenter le nombre total des enregistrements et initialiser les valeurs
NbreEnregistremts% = NbreEnregistremts% + 1
'Efface les zones de texte
CtlTitre.Text = ""
CtlAnnee.Text = "1980"
CtlDuree.Text = "100"
'Nous supposons qu'il y a 1 film par cassette
CtlNumCass.Text = Trim$(Str$(NbreEnregistremts%))
CtlNumFilm.Text = "1"
CtlTypeCassette.Text = "E-180"
CtlDescriptif.Text = ""
CtlFichierSon.Caption = ""
'Incrémenter également la valeur maxi de la barre de défilement verticale
CtlRoll.Max = CtlRoll.Max + 1
InfoEnreg Me, NumEnreg%, NbreEnregistremts%
End If
End Sub
'
Private Sub CtlPlus10_Click( )
'Avancer de 10 enregistrements à condition qu'ils existent
If NumEnreg% + 10 <= NbreEnregistremts% Then
'Sauvegarde de l'enregistrement courant
PutRecord DNum%, NumEnreg%, Me
'Incrémente le compteur d'enregistrements
NumEnreg% = NumEnreg% + 10
GetRecord DNum%, NumEnreg%, Me
InfoEnreg Me, NumEnreg%, NbreEnregistremts%
'Corrige la barre de défilement de l'enregistrement sélectionné
CtlRoll.Value = NumEnreg%
End If
End Sub
'
Private Sub ctlPos1_Click( )
'Aller au premier enregistrement si le n+ d'enreg. est différent de 1
If NumEnreg% <> 1 Then
'Stocke l'enreg. courant
PutRecord DNum%, NumEnreg%, Me
'Incrémente l'enregistrement
NumEnreg% = 1
GetRecord DNum%, NumEnreg%, Me
InfoEnreg Me, NumEnreg%, NbreEnregistremts%
'Corrige la barre de défilement du numéro d'enregistrement courant
CtlRoll.Value = NumEnreg%
End If
End Sub
'
Private Sub CtlRoll_Change( )
On Error Resume Next
'Stocker l'enregistrement courant
PutRecord DNum%, NumEnreg%, Me
'La barre de défilement verticale permet de se déplacer dans la base de données, mais
'l'ajout de nouveaux enregistrements à l'aide de la barre de défilement n'a pas d'intérêt...
'Valeur mini : enregistrement numéro 1
CtlRoll.Min = 1
'Valeur maxi de la barre de défilement dépend du nombre d'enregistrements
CtlRoll.Max = NbreEnregistremts%
'Modification par un clic sur la barre ou sur les flèches de défilement Calage sur premier enreg.
' If CtlRoll.Value + 5 <= NbreEnregistremts% And CtlRoll.Value - 5 >= 1 Then
CtlRoll.LargeChange = 10
' Else
' CtlRoll.LargeChange = 1
'End If
'Modif par un clic sur flèche de défilement
CtlRoll.SmallChange = 1
NumEnreg% = CtlRoll.Value
GetRecord DNum%, NumEnreg%, Me
InfoEnreg Me, NumEnreg%, NbreEnregistremts%
End Sub
'
Private Sub ctlShowListe_Click( )
On Error Resume Next
'Analyse du contrôle dans procédure Kombo
StockeEnreg% = NumEnreg%
For X% = 1 To NbreEnregistremts%
GetRecord DNum%, X%, Me
frmListe!Liste1.AddItem Str$(X%) + Space$(5) + Trim$(Video.Titre) + " [" + Trim$(Str$(Video.NumCass)) + "]"
Next X%
frmListe.Caption = frmListe.Caption + "[" + Me.Caption + " ]"
frmListe.Show 1
NumEnreg% = StockeEnreg%
GetRecord DNum%, NumEnreg%, Me
End Sub
'
Private Sub CtlStatistiques_Click( )
'Lecture du fichier jusqu'à la fin et analyse Stocker l'enreg. courant. Pour que InfoEnreg fonctionne
'correctement (Variable globale NumEnreg%),
'nous devons utiliser NumEnreg% comme variable compteur, car les enregistrements doivent être traités l'un après l'autre...
'Pointeur souris : sablier
MousePointer = 11
AncNumEnreg% = NumEnreg%
PutRecord DNum%, NumEnreg%, Me
'Valeurs à calculer
For NumEnreg% = 1 To NbreEnregistremts%
'Affiche progression
GetRecord DNum%, NumEnreg%, Me
InfoEnreg Me, NumEnreg%, NbreEnregistremts%
'analyse Durée totale de tous les films
DureeTotale& = DureeTotale& + Video.Duree
'Le premier film (le plus ancien)
If Video.Annee < LePremierFilm% Or LePremierFilm% = 0 Then
LePremierFilm% = Video.Annee
End If
'Le film le plus récent
If Video.Annee > FilmLePlusRecent% Or FilmLePlusRecent% = 0 Then
FilmLePlusRecent% = Video.Annee
End If
'durée la plus courte
If Video.Duree < LePlusCourt% Or LePlusCourt% = 0 Then
LePlusCourt% = Video.Duree
End If
'Durée la plus longue
If Video.Duree > LePlusLong% Or LePlusLong% = 0 Then
LePlusLong% = Video.Duree
End If
'Le plus petit numéro de cassette
If Video.NumCass < MinNumCass% Or MinNumCass% = 0 Then
MinNumCass% = Video.NumCass
End If
'Le plus gros numéro de cassette
If Video.NumCass > MaxNumCass% Or MaxNumCass% = 0 Then
MaxNumCass% = Video.NumCass
End If
Next NumEnreg%
'affecter au format d'affichage la valeur renvoyée
frmStatistique!Resultat1.Caption = Str$(NbreEnregistremts%)
frmStatistique!Resultat2.Caption = Str$(DureeTotale&)
frmStatistique!Resultat3.Caption = Str$(LePlusCourt%)
frmStatistique!Resultat4.Caption = Str$(LePlusLong%)
frmStatistique!Resultat5.Caption = Str$(MinNumCass%)
frmStatistique!Resultat6.Caption = Str$(MaxNumCass%)
frmStatistique!Resultat7.Caption = Str$(LePremierFilm%)
frmStatistique!Resultat8.Caption = Str$(FilmLePlusRecent%)
'Affiche nom du fichier
frmStatistique!TXT_Fichier.Caption = Me.Caption
'Lire l'ancien enregistrement
NumEnreg% = AncNumEnreg%
GetRecord DNum%, NumEnreg%, Me
MousePointer = 1
'Affiche la feuille d'affichage
frmStatistique.Show 1
End Sub
'
Private Sub Form_Load( )
'Quand la première fenêtre fille est ouverte, d'autres boutons sont automatiquement activés
If FenetreMDI% = 1 Then
'La première fois seulement
frmParent!bnCascade.Visible = True
frmParent!bnTile.Visible = True
frmParent!bnHorTile.Visible = True
frmParent!bnIconArrange.Visible = True
frmParent!bnClose.Visible = True
End If
'La liste modifiable doit être initialisée avec les entrées de pays ou de continent les plus importantes
CtlPays.AddItem "Allemagne"
CtlPays.AddItem "France"
CtlPays.AddItem "Italie"
CtlPays.AddItem "Espagne"
CtlPays.AddItem "Australie"
CtlPays.AddItem "USA"
CtlPays.AddItem "Canada"
CtlPays.AddItem "Angleterre"
CtlPays.AddItem "Israël"
CtlPays.AddItem "Danemark"
CtlPays.AddItem "Irlande"
CtlPays.AddItem "Afrique"
CtlPays.AddItem "Asie"
CtlPays.AddItem "Inde"
CtlPays.AddItem "Chine"
CtlPays.AddItem "Japon"
CtlPays.AddItem "Thaïlande"
CtlPays.AddItem "Norvège"
CtlPays.AddItem "Suède"
CtlPays.AddItem "Finlande"
CtlPays.AddItem "Russie"
CtlPays.AddItem "Amérique Latine"
'Entrée implicite : USA
CtlPays.ListIndex = CtlPays.ListCount - 1
End Sub
'
Private Sub mnu_About_Click( )
frmShow.About 1
End Sub
'
Private Sub MNU_ArrangeIcons_Click( )
'Ranger les icônes
frmParent.Arrange 3
End Sub
'
Private Sub MNU_Cascade_Click( )
'Empiler les fenêtres (cascade)
frmParent.Arrange 0
End Sub
'Saisie du code des commandes de menu dans la barre de menus
Private Sub mnu_Close_Click( )
'Fermer la fenêtre fille sélectionnée
Close #DNum%
Unload Me
End Sub
'
Private Sub MNU_CloseAll_Click( )
'Appelle la procédure de fermeture de toutes les fenêtres filles
CloseAll
End Sub
'
Private Sub MNU_DelDatabase_Click( )
'Efface base de données
frmDelFile.Show 1
End Sub
'
Private Sub MNU_DelFields_Click( )
'Efface les champs
CtlDelField_Click
End Sub
'
Private Sub mnu_Exit_Click( )
'Attention nous utilisons le type de données VARIANT aux seules fins d'illustrer son usage
Titre = "Attention!"
Message = "Vous voulez vraiment quitter Video_K7?"
Reponse = MsgBox(Message, 32 + 4, Titre)
If Reponse = 6 Then End
End Sub
'
Private Sub mnu_Fin_Click( )
CtlFin_Click
End Sub
'
Private Sub MNU_Find_Click( )
'Appelle la procédure d'événement
Command3D3_Click
End Sub
'
Private Sub MNU_hArrange_Click( )
'Dispose les fenêtres les unes à côté des autres
frmParent.Arrange 1
End Sub
'
Private Sub mnu_Info_Click( )
Titre$ = "Vidéo_K7 1.00 - Vidéo et Son pour Windows"
M$ = "Ce programme gère vos films vidéo et "
M$ = M$ + "leur associe les fichiers sons de votre choix. "
MsgBox M$, 64, Titre$
End Sub
'
Private Sub MNU_Liste_Click( )
'Lit la liste des boutons existants
ctlShowListe_Click
End Sub
'
Private Sub mnu_MakeFile_Click( )
'Crée une base de données de films vidéo
frmMakeFile.Show 1
End Sub
'
Private Sub MNU_Moins_Click( )
'recule d'un enregistrement
CtlMoins_Click
End Sub
'
Private Sub MNU_Moins10_Click( )
'recule de 10 enregistrements
CtlMoins10_Click
End Sub
'
Private Sub MNU_Open_Click( )
'Affiche un dialogue d'ouverture de fichiers graphiques
frmFileOpen.Show 1
End Sub
'
Private Sub MNU_Plus_Click( )
'avance d'un enregistrement
CtlPlus_Click
End Sub
'
Private Sub MNU_Plus10_Click( )
'avance de 10 enregistrements
CtlPlus10_Click
End Sub
'
Private Sub mnu_Pos1_Click( )
'retour au début du fichier
ctlPos1_Click
End Sub
'
Private Sub MNU_Sound_Click( )
'Ecoute un fichier de son
'Command3D2_Click
End Sub
'
Private Sub MNU_Statistiques_Click( )
'Lit l'analyse statistique des boutons existants
CtlStatistiques_Click
End Sub
'
Private Sub MNU_vArrange_Click( )
'Range les fenêtres les unes en dessous des autres
frmParent.Arrange 2
End SubCodage des contrôles « SPIN » Procédure « SpinDown »
Private Sub Spin1_SpinDown( )
'Année. débute à 1920
Annee% = Val(CtlAnnee.Text)
If Annee% > 1920 Then
'décrémenter
CtlAnnee.Text = Trim$(Str$(Annee% - 1))
End If
End Sub
'
Private Sub Spin2_SpinDown( )
'Durée minimale : 60 minutes
Duree% = Val(CtlDuree.Text)
If Duree% > 60 Then
'Réduire de cinq
CtlDuree.Text = Trim$(Str$(Duree% - 5))
End If
End Sub
'
Private Sub Spin3_SpinDown( )
'Numéro de cassette minimal : 1
NumCass% = Val(CtlNumCass.Text)
If NumCass% > 1 Then
'décrémenter
CtlNumCass.Text = Trim$(Str$(NumCass% - 1))
End If
End Sub
'
Private Sub Spin4_SpinDown( )
'Numéro du film de la cassette valeur mini : 1
NumFilm% = Val(CtlNumFilm.Text)
If NumFilm% > 1 Then
'décrémenter
CtlNumFilm.Text = Trim$(Str$(NumFilm% - 1))
End If
End Sub
'
Private Sub Spin5_SpinDown( )
'Type de cassette
Identificateur$ = Trim$(CtlTypeCassette.Text)
Select Case LCase$(Identificateur$)
Case "e-60"
CtlTypeCassette.Text = "E-60"
Case "e-90"
CtlTypeCassette.Text = "E-60"
Case "e-120"
CtlTypeCassette.Text = "E-90"
Case "e-180"
CtlTypeCassette.Text = "E-120"
Case "e-240"
CtlTypeCassette.Text = "E-180"
Case "e-300"
CtlTypeCassette.Text = "E-240"
Case Else
CtlTypeCassette.Text = "E-120"
End Select
End SubCodage des contrôles « SPIN » Procédure « SpinUp »
Private Sub Spin1_SpinUp( )
'Année : jusqu'à 2020
Annee% = Val(CtlAnnee.Text)
If Annee% < 2020 Then
'incrémenter
CtlAnnee.Text = Trim$(Str$(Annee% + 1))
End If
End Sub
'
Private Sub Spin2_SpinUp( )
'Durée maximale : 240 minutes
Duree% = Val(CtlDuree.Text)
If Duree% < 240 Then
'augmenter de cinq
CtlDuree.Text = Trim$(Str$(Duree% + 5))
End If
End Sub
'
Private Sub Spin3_SpinUp( )
'Numéro de cassette maximal : 1000
NumCass% = Val(CtlNumCass.Text)
If NumCass% < 1000 Then
'incrémenter
CtlNumCass.Text = Trim$(Str$(NumCass% + 1))
End If
End Sub
'
Private Sub Spin4_SpinUp( )
'Numéro du film sur la cassette valeur maxi : 4
NumFilm% = Val(CtlNumFilm.Text)
If NumFilm% < 4 Then
'incrémenter
CtlNumFilm.Text = Trim$(Str$(NumFilm% + 1))
End If
End Sub
'
Private Sub Spin5_SpinUp( )
'Type de cassette
Identificateur$ = Trim$(CtlTypeCassette.Text)
Select Case LCase$(Identificateur$)
Case "e-60"
CtlTypeCassette.Text = "E-90"
Case "e-90"
CtlTypeCassette.Text = "E-120"
Case "e-120"
CtlTypeCassette.Text = "E-180"
Case "e-180"
CtlTypeCassette.Text = "E-240"
Case "e-240"
CtlTypeCassette.Text = "E-300"
Case "e-300"
CtlTypeCassette.Text = "E-300"
Case Else
CtlTypeCassette.Text = "E-120"
End Select
End SubProchain tutoriel▲
Le fichier Tools.bas (fenêtre fille)



