Un menu de fichiers récents
Leçons de programmation Visual Basic
Nous allons voir comment implémenter dans le menu Fichier d'une application la liste des n derniers documents consultés. Pour cela, nous stockerons cette liste dans la base de registres et dans un module spécialisé, nous stockerons les procédures permettant de gérer correctement ce menu.
Caractéristiques :
on pourra paramétrer le nombre de documents récents à afficher dans le menu (de 0 à 9)
une commande permettra de réinitialiser la liste des documents récents
la liste ne contiendra pas de doublons
la liste classera les documents par date de dernière ouvertureMise en oeuvre :
Nous allons programmer un traitement de texte SDI (interface simple document) pour pouvoir appliquer ce module de gestion des fichiers récents simplement. Il sera minimaliste :
Contrôle Nom Note Form frm non redimensionnable RichTextBox rtb de la taille de la feuille Ajoutez un menu Fichier à votre programme que vous nommerez mnuFile à l'aide du créateur de menus (Ctrl+E) avec les sous-menus suivants :
Caption Name ShortCut &Nouveau mnuFileNew Ctrl+N &Ouvrir mnuFileOpen Ctrl+O - mnuFileBar0 mnuFileRecent - mnuFileBar1 &Quitter mnuFileQuit Ctrl+Q
Vous ajouterez aussi un index 0 au menu mnuFileRecent. C'est lui qui nous permettra d'afficher la liste des fichiers récents. Enfin, vous décocherez la propriété Visible des menus mnuFileRecent et mnuFileBar1. L'aspect de votre menu doit alors êttre celui de l'illustratio ci-contre.
Programmation de l'ouverture d'un fichier : nous allons utiliser la procédure suivante :Private Sub mnuFileOpen_Click()
Dim stFile As String
Dim stTitle As String
cd.Filter = "Texte(*.txt)|*.txt|Riche (*.rtf)|*.rtf"
cd.ShowOpen
stFile = cd.FileName
stTitle = cd.FileTitle
rtb.LoadFile stFile
End SubNous placerons les appels de procédure de gestion de fichiers récents à la fin de cette procédure.
Le module de gestion de fichiers :
Ajoutez à votre projet un module que vous nommerez ModuleR. Placez-vous dedans. Placez le code suivant de déclaration de variables :Dim RecentN As String 'nombre de fichiers récents
Dim Recent() As String 'liste dynamique Programmation du stockage de la liste et du chargement : Nous allons stocker dans la sous clé "Recent" les valeurs nécessaires. La valeur "N" contiendra le nombre de fichiers récents à gérer. Les valeurs "1", "2", ... contiendront les chemins des fichers récents stockés, dans l'ordre d'ouverture. Voici donc le code de lecture et d'enregistrement commenté :
Public Sub RReg() 'Lecture
Dim i As Byte
RecentN = Int(GetSetting(App.Title, "Recent", "N", "4"))
'on a une place de trop en (0) mais elle va servir
ReDim Recent(0 To RecentN)
'si recentn = 0 la boucle ne sera pas exécutée
For i = 1 To RecentN
Recent(i) = GetSetting(App.Title, "Recent", Trim(Str(i)), "")
Next i
End SubPublic Sub WReg() 'Enregistrement
Dim i As Byte
SaveSetting App.Title, "Recent", "N", RecentN
For i = 1 To RecentN
SaveSetting App.Title, "Recent", Trim(Str(i)), Recent(i)
Next i
End Sub Gestion du tableau Recent() : c'est ici que les choses se compliquent : il faut une procédure pour la suppression d'une entrée et une pour l'ajout d'une entrée qui fasse les choses suivantes : vérifier qu'elle n'est pas présente, si oui, la ramener en tête, et si non la mettre au début du tableau. Pour simplifier la manipulation, nous allons programmer une procédure qui réorganise le tableau (nom : Arrange) en mettant tous les blancs à la fin. Exemple d'action à gauche, et code commenté à droite :
Avant "Bobby" "" "Moise" "Gérard" ""
Après "Bobby" "Moise" "Gérard" "" "" Public Sub DelRecent(Index As Integer)
Recent(Index) = ""
Arrange
End SubPublic Sub Arrange() 'Arrangement
For i = 1 To UBound(Recent)
'si l'entrée est vide AND c'est pas la dernière
If Trim$(Recent(i)) = "" And i < UBound(Recent) Then
'décalage de toutes les entrées suivantes
For j = i To UBound(Recent) - 1
Recent(j) = Recent(j + 1)
Recent(j + 1) = ""
Next j
End If
Next i
End Sub Programmation de la procédure d'affichage : RefreshMenu(RecentMenu As Variant, BarMenu As Menu). On lui passe en argument le menu qui servira à afficher la liste des fichiers récents ainsi que le menu barre (à masquer s'il n'y a aucun fichier récent) et elle se charge du reste :
Public Sub RefMenu(RecentMenu As Variant, BarMenu As Menu)
Dim i As Byte
Dim o As Byte
'suppression des menus
For i = 1 To RecentMenu.Count - 1
Unload RecentMenu(i)
Next i
BarMenu.Visible = False
RecentMenu(0).Visible = False
If RecentN <= 0 Then Exit Sub
For i = 1 To UBound(Recent)
If Trim(Recent(i)) = "" Then
o = o + 1
Else
Load RecentMenu(i - o)
'Récupération du nom du fichier
RecentMenu(i - o).Caption = Str(i) & " - " & Right$(Recent(i), _
Len(Recent(i)) - InStrRev(Recent(i), "\", -1, vbTextCompare))
'Stockage du chemin complet
RecentMenu(i - o).Tag = Recent(i)
RecentMenu(i - o).Visible = True
End If
Next i
If o < RecentN Then BarMenu.Visible = True
End Sub Programmation de la fonction principale : AddRecent(). Cette fonction se chargera de vérifier la présence du fichier à ajouter et de l'ordre d'affichage de la liste. L'index 0 du tableau Recent() permet d'utiliser ce tableau comme une pile LIFO (Last In First Out). On place l'entrée à zéro puis on décale tout d'un cran et la dernière entrée sort.
Public Sub AddRecent(RPath As String)
Recent(0) = RPath
For i = 1 To UBound(Recent)
If Recent(i) = RPath Then
Recent(i) = ""
End If
Next i
'décalage des entrées
For i = UBound(Recent) To LBound(Recent) + 1 Step -1
Recent(i) = Recent(i - 1)
Next i
'suppression des trous
Arrange
End SubUtilisation du module :
Tout est prêt dans le module, il n'y a plus qu'à l'utiliser correctement dans notre feuille. Voici le code complet de la feuille. J'ai ajouté le code de clic sur le menu mnuFileRecent pour l'ouverture du fichier. En outre, le code d'ouverture a été modifié pour gérer la liste de fichiers récents :Private Sub Form_Load()
ModuleR.RReg
ModuleR.RefMenu mnuFileRecent, mnuFileBar1
End SubPrivate Sub Form_Unload(Cancel As Integer)
ModuleR.WReg
End SubPrivate Sub mnuFileOpen_Click()
On Error Resume Next
Dim stFile As String
Dim stTitle As String
cd.CancelError = True
cd.Filter = "Texte(*.txt)|*.txt|Riche (*.rtf)|*.rtf"
cd.ShowOpen
stFile = cd.FileName
stTitle = cd.FileTitle
'l'utilisateur a sélectionné Annuler
If Err.Number = 32755 Then Exit Sub
rtb.LoadFile stFile
'gestion des fichiers récents
ModuleR.AddRecent stFile
ModuleR.RefMenu mnuFileRecent, mnuFileBar1
End SubPrivate Sub mnuFileQuit_Click()
ModuleR.WReg
End
End SubPrivate Sub mnuFileRecent_Click(Index As Integer)
On Error GoTo fin
rtb.LoadFile mnuFileRecent(Index).Tag
ModuleR.AddRecent mnuFileRecent(Index).Tag
ModuleR.RefMenu mnuFileRecent, mnuFileBar1
Exit Sub
fin:
MsgBox "Erreur : ce fichier est introuvable", vbCritical
ModuleR.DelRecent Index
ModuleR.RefMenu mnuFileRecent, mnuFileBar1
End Sub
C'est terminé. Vous pouvez observer le résultat à gauche.
En exercice, vous pourrez ajouter à votre projet une fenêtre d'options qui permet de paramétrer le nomber de fichiers récents à afficher dans le menu Fichier. Pour cela, urtilisez un contrôle ComboBox en mode DropDown Combo. Au chargement de la feuille, inscrivez dans la propriété Text de ce contrôle le nombre de fichiers à afficher RecentN. à la validation, rafraîchissez RecentN mais aussi la base de registres.