IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Tutoriel pour apprendre à améliorer l'ergonomie d'une application Access

Access ne propose pas nativement de pouvoir finaliser une application avec une ergonomie aboutie. À sa décharge, il faut reconnaître que Microsoft a bien amélioré l'environnement Access depuis la version 2007 et notamment avec la mise en place du ruban, ou avec la version 2010, la possibilité de personnaliser ces bons vieux boutons tout gris.
Nous allons voir comment peaufiner l'ergonomie d'une application avec quelques fonctions Access, mais surtout avec l'utilisation d'API.
Bon nombre de ces méthodes sont disponibles dans la FAQ. Nous allons simplement les mettre en application.

1 commentaire Donner une note à l´article (4.5)

Article lu   fois.

L'auteur

Profil Pro

Liens sociaux

Viadeo Twitter Facebook Share on Google+   

I. Introduction

Comment changer le titre de l'application, interdire à l'utilisateur de fermer l'application brutalement en cliquant sur la croix rouge située en haut et à droite de la fenêtre Access, comment changer la couleur d'arrière-plan ou encore comment dérouler une liste simplement en cliquant dans le champ. Au travers de ce tutoriel, nous allons répondre à toutes ces petites astuces qui donnent un aspect professionnel à une application. Certaines de ces méthodes ne fonctionnent pas sur Access 2007 et d'autres sont spécifiques à Office 2010 et, sans doute, valables pour Access 2013 et 2016.

II. Agrandir/Réduire la fenêtre Access

Lors de l'ouverture de l'application, il peut être intéressant de faire en sorte que l'application s'agrandisse toute seule pour occuper l'ensemble de l'écran.

Copier et coller le code suivant dans un module nommé Mod_Windows.

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
'Dimension de la fenêtre Access
Public Enum TypeWindows
    SCMINIMIZE = &HF020&
    SCMAXIMIZE = &HF030&
    SCRESTORE = &HF120&
End Enum

' Déclarations
Const WM_SYSCOMMAND As Long = &H112

Private Declare Function PostMessage Lib "user32.dll" Alias "PostMessageA" ( _
    ByVal hwnd As Long, ByVal MSG As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

Function WindowsDimension(WindowsSCAs TypeWindows) As Boolean

Dim hwnd As Long

hwnd = Application.hWndAccessApp

If hwnd <> 0 Then
    PostMessage hwnd, WM_SYSCOMMAND, WindowsSC, 0
    WindowsDimension = True
Else
    ' Fenêtre pas trouvée
    WindowsDimension = False
End If

End Function

Pour appeler le code :

 
Sélectionnez
Call WindowsDimension(SCMAXIMIZE)

Il pourrait être alors envisager d'appeler ce code à partir d'une macro AutoExec.

III. Désactiver la croix rouge en haut et à droite de la fenêtre Access.

Remarque : cette fonction ne fonctionne que pour Access 2003, 2010 et supérieur.
Pour des raisons qui n'intéressent que le concepteur d'une application, il peut être judicieux d'interdire à l'utilisateur de pouvoir cliquer sur la croix rouge située en haut et à droite de la fenêtre Access. Cela permet alors au concepteur de canaliser l'utilisateur et ainsi prévoir dans le code certaines réactions lors de la fermeture de l'application.

Copier et coller le code suivant dans un module nommé Mod_RedCross.

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
' ***** API pour désactiver la croix rouge en haut et à droite de la fenêtre Access *****

Private Declare Function GetSystemMenu Lib "user32" _ (ByVal hwnd As Long, ByVal bRevert As Long) As Long

Private Declare Function RemoveMenu Lib "user32" _
    (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long

Private Declare Function GetMenuItemCount Lib "user32" (ByVal hMenu As Long) As Long
Private Declare Function DrawMenuBar Lib "user32" (ByVal hwnd As Long) As Long

Private Const MF_BYPOSITION = &H400&
Private Const MF_REMOVE = &H1000&

Private hSysMenu As Long

Public Sub RedCrossLock()
'Désactive la croix rouge en haut et à droite de la fenêtre Access

hSysMenu = GetSystemMenu(Application.hWndAccessApp, False)

Dim oCount As Long
oCount = GetMenuItemCount(hSysMenu)

Call RemoveMenu(hSysMenu, oCount - 1, MF_REMOVE Or MF_BYPOSITION)
DrawMenuBar hSysMenu

End Sub


Public Sub RedCrossActive()
'Réactive la croix rouge en haut et à droite de la fenêtre Access

hSysMenu = GetSystemMenu(Application.hWndAccessApp, True)
DrawMenuBar hSysMenu

End Sub

Pour appeler le code :

Activer la croix rouge :

 
Sélectionnez
Call RedCrossActive

Désactiver la croix rouge :

 
Sélectionnez
Call RedCrossLock

IV. Titre de l'application

Au lieu d'avoir un beau titre Microsoft Access, nous pouvons personnaliser ce titre.
Ce paramètre peut être défini dans les options Access de la base active. Toutefois, dans le cas d'une application qui travaille alternativement sur plusieurs dorsales, il peut être utile de changer ce titre. Nous pourrions alors envisager que ce titre se trouve dans un champ de table pour chaque dorsale. Cependant, ce principe d’accès alternatif à plusieurs bases de données dorsales ne sera pas abordé dans ce tutoriel afin de rester dans le contexte du tutoriel. Cela dit, on peut également imaginer utiliser ce principe à l’ouverture de chaque formulaire.

Pour exécuter ce code, il faut activer la référence : Microsoft DAO 3.x Object Library.

Copier et coller le code suivant dans un module nommé Mod_TitleApplication.

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
Public Sub TitleApplication(Optional strTitle As String = "")
On Error GoTo Err

'Définir le titre l'application
Dim prp As DAO.Property

'Si pas de titre
If strTitle = "" Then
    'On supprime le titre existant
    CurrentDb.Properties.Delete "AppTitle"
Else
    'Création du titre. Cette action déclenche l'erreur 3270
    CurrentDb.Properties("AppTitle") = strTitle
End If

'Rafraîchit la barre de menu
Application.RefreshTitleBar

Fin: Exit Sub

Err:
    If Err.Number = 3270 Then
        'Création du titre
        Set prp = CurrentDb.CreateProperty("AppTitle", dbText, strTitle)
        'Ajout du titre à la propriété
        CurrentDb.Properties.Append prp
        Resume
    End If
End Sub


Exemple pour appeler le code :

 
Sélectionnez
Call TitleApplication("Developpez.com")

V. Couleur d'arrière-plan

Jusqu'à Access 2003, une fonction API permettait de changer la bien triste couleur grise d'arrière-plan d'Access. Cette fonction n'avait plus d'effet sous Access 2007. Depuis Access 2010, une propriété des options Access permet de changer l'arrière-plan en trois couleurs : bleu, gris clair ou noir. Comme les autres options, cela demande un redémarrage de l'application.
Ces valeurs de couleurs sont inscrites dans le registre et peuvent donc être modifiées par un utilisateur qui n'aurait pas accès aux options Access.

La clé de registre est la suivante : HKEY_CURRENT_USER\Software\Microsoft\Office\14.0\Common. La clé Theme est une clé DWORD qui prend respectivement le 1 (bleu), 2 (gris clair) et 3 (noir).

Copier et coller le code suivant dans un module nommé Mod_BackGroundColor.

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
'Couleur d'arrière-plan
Public Enum BackGroundColor
    Blue = 1
    Grey = 2
    Black = 3
End Enum

Public Sub BackGroundColor(regValue As BackGroundColor)
On Error GoTo Err
'Modification d'une clé de registre

Dim WshShell

Dim strReg As String
'Chemin de la clé de registre
strReg = "HKEY_CURRENT_USER\Software\Microsoft\Office\14.0\Common\Theme"

'Modifie le registre pour changer la couleur d'arrière-plan d'Access
Set WshShell = CreateObject("Wscript.Shell")
WshShell.RegWrite strReg, regValue, "REG_DWORD"

Set WshShell = Nothing

MsgBox "Vous devez fermer puis rouvrir l'application pour que la couleur d'arrière-plan soit appliquée."

Fin: Exit Sub

Err:
    MsgBox "Le registre est verrouillé en écriture." & vbCrLf & _
        "Inscription de la clé de registre impossible."
    Resume Fin
End Sub

Pour appeler le code :

La valeur 1 mettra l'arrière-plan en bleu.

 
Sélectionnez
Call BackGroundColor(1)

VI. Icône de formulaire

Une belle icône sur un formulaire améliore très justement le rendu final. Créer un répertoire, nommé Icone, dans le même répertoire que l'application. Placer dedans la ou les icônes. Dans notre exemple, l'icône se nomme Icone1.ico. Cette fonction permet également de mettre une icône dans le menu de l'application en haut et à gauche.

Copier et coller le code suivant dans un module nommé Mod_BackGroundColor.

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
'********************** Api pour l'icône de l'application et des formulaires ********************************************

Public Declare Function LoadImage Lib "user32" Alias _
    "LoadImageA" (ByVal hInst As Long, ByVal lpsz As String, _
        ByVal un1 As Long, ByVal n1 As Long, ByVal n2 As Long, _
            ByVal un2 As Long) As Long

Public Declare Function SendMessage Lib "user32" Alias _
    "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, _
        ByVal wParam As Long, lParam As Any) As Long

Public Const WM_GETICON = &H7F
Public Const WM_SETICON = &H80
Public Const ICON_SMALL = 0
Public Const ICON_BIG = 1 'LoadImage() image types
Public Const IMAGE_BITMAP = 0
Public Const IMAGE_ICON = 1
Public Const IMAGE_CURSOR = 2
Public Const IMAGE_ENHMETAFILE = 3 'LoadImage() flags
Public Const LR_DEFAULTCOLOR = &H0
Public Const LR_MONOCHROME = &H1
Public Const LR_COLOR = &H2
Public Const LR_COPYRETURNORG = &H4
Public Const LR_COPYDELETEORG = &H8
Public Const LR_LOADFROMFILE = &H10
Public Const LR_LOADTRANSPARENT = &H20
Public Const LR_DEFAULTSIZE = &H40
Public Const LR_LOADMAP3DCOLORS = &H1000
Public Const LR_CREATEDIBHeader = &H2000
Public Const LR_COPYFROMRESOURCE = &H4000
Public Const LR_SHARED = &H8000

Function strIcon(str As String) As String
    'Fonction renvoyant le chemin de l'icône
    strIcon = CurrentProject.Path & "\Icone\" & str & ".ico"
End Function

Public Function SetFormIcon(Optional Frm As String, Optional MyIcon As String) As Boolean

'Place une icône dans le menu de l'application ou dans un formulaire

Dim hIcon As Long
Dim hwnd As Long
Dim IconPath As String

IconPath = MyIcon

If Len(Dir(IconPath)) = 0 Then
    SetFormIcon = False
    Exit Function
Else
    If Frm = "" Then
        hwnd = Application.hWndAccessApp
    Else
        hwnd = Forms(Frm).hwnd
    End If
    hIcon = LoadImage(0&, IconPath, IMAGE_ICON, 16, 16, LR_LOADFROMFILE)

    If hIcon <> 0 Then
        Call SendMessage(hwnd, WM_SETICON, 0, ByVal hIcon)
        SetFormIcon = True
    End If
End If

End Function

Pour appeler le code :

Événement : Sur chargement du formulaire

 
Sélectionnez
Call SetFormIcon(Me.Name,strIcon(Icone1))

Au chargement de l'application :

L'appel de cette fonction peut très bien être envisagé à partir d'une macro nommée AutoExec.

 
Sélectionnez
Call SetFormIcon(,strIcon(Icone1))

VII. Déroulement d'une liste

Il n'est pas toujours très pratique de viser la petite flèche d'une liste déroulante pour la dérouler. Il est effectivement plus simple de pouvoir cliquer dans le champ de la liste afin qu'elle se déroule. Quelques lignes de code permettent cela.

Copier et coller le code suivant dans un module nommé Mod_List.

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
Sub DropDownlList(Button As Integer, Ctrl As Control)

'Si clic sur bouton gauche
If Button = 1 Then
    'On déroule la liste
    Ctrl.Dropdown
End If

End Sub

Pour appeler le code :

Événement : Sur souris appuyée du formulaire :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
Private Sub MyListDeroulante_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)

    'Déroule la liste sur clic gauche
    Call DropDownlList(Button, Me.MyListDeroulante)

End Sub

VIII. Limiter une liste

Dans le même ordre d'idée, il est parfois nécessaire que l'utilisateur ne puisse sélectionner que des éléments de la liste. Contrairement à Vb.Net, Access ne verrouille pas la liste déroulante lorsque sa propriété « Limiter à liste » est définie à Oui. Le principe consiste donc à interdire la saisie au clavier. Toutefois, il faut pouvoir laisser l'utilisateur naviguer entre les champs avec les touches de déplacement du clavier et notamment la touche Tab. Également, il peut être nécessaire de laisser la possibilité à l'utilisateur de supprimer la valeur de champ afin qu'il soit vide.

Copier et coller le code suivant dans un module nommé Mod_List.

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
Public Enum TabDel
    TouchTab = 1
    TouchTabDel = 2
End Enum

Sub RestrictedList(KeyCode As Integer, Optional onTouch As TabDel = 2)

If onTouch = 1 Then
    'Si touche appuyée <> de Tab
    If KeyCode <> 9 Then
        KeyCode = 0 'Interdit la saisie au clavier
    End If
Else
    'Si touche appuyée <> de Tab et <> de Suppr(Del)
    If KeyCode <> 9 And KeyCode <> 46 Then
        'Interdit la saisie au clavier
        KeyCode = 0
    End If
End If

End Sub

Pour appeler le code :

Événement : Sur touche appuyée du contrôle liste déroulante :

 
Sélectionnez
Private Sub MyListDeroulante_KeyDown(KeyCode As Integer, Shift As Integer)

    'Liste limitée, la touche Tab peut être utilisée
    Call RestrictedList(KeyCode, 1)

End Sub

Ou :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
Private Sub MyListDeroulante_KeyDown(KeyCode As Integer, Shift As Integer)

    'Liste limitée, les touches Tab et Suppr (Del) peuvent être utilisées
    Call RestrictedList(KeyCode, 2)

End Sub

IX. Ajouter une valeur à une liste

Dans une application, il peut être nécessaire que l'utilisateur puisse enrichir ses propres listes.
Ces listes sont issues de tables.
Nous allons voir comment proposer à un utilisateur d'ajouter une valeur à une liste.
La liste déroulante doit avoir la propriété Limiter à liste définie à Oui.

Événement : Sur absence dans liste de la liste déroulante :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
Private Sub List_AddValueList_NotInList(NewData As String, Response As Integer)
On Error GoTo Err

'Message pour ajouter une valeur à la liste
If MsgBox("Souhaitez-vous ajouter cette nouvelle valeur à la liste ?", _
    vbYesNo + vbQuestion + vbDefaultButton2, "Ajout d'une nouvelle valeur") = vbYes Then
    DoCmd.RunSQL "INSERT INTO Tbl_List ( Tbl_ValList ) SELECT """ & NewData & """;"
    Response = acDataErrAdded
Else
    Response = acDataErrContinue
    Me.List_AddValueList.Undo
    End If

Fin: Exit Sub

Err:
    MsgBox "Erreur : " & Err.Number & vbCrLf & Err.Description
    Resume Fin
End Sub

X. Texte en majuscules

Dans certains cas, la saisie d'un texte doit impérativement être en majuscules.
Par exemple, par convention, et même si aucune règle ne l'impose, les noms de famille sont écrits en majuscules afin de les distinguer des prénoms, ce qui pourrait porter à confusion (ex. : Guy Michel). De plus, le manuel de typographie française élémentaire de Yves PERROUSSEAUX précise, dixit l'Académie française, qu'à partir du moment où une machine le permet, les majuscules doivent avoir leur accentuation. Or, pour pouvoir accentuer des majuscules, il faut connaître un certain nombre de raccourcis clavier. Ce qui est loin d'être le cas pour tout le monde. Cette fonction va donc simplifier la saisie des données par les utilisateurs puisque même si le clavier est en minuscules, les caractères seront convertis en majuscules et ce, avec leur accentuation.

Événement : Sur touche activée du contrôle :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
Private Sub Tbl_TxtMajuscule_KeyPress(KeyAscii As Integer)

    'On convertit chaque caractère frappé en majuscule
    KeyAscii = Asc(UCase(Chr(KeyAscii)))

End Sub

XI. Initiale d'un mot en minuscule

À la suite du sujet précédent, il faut parfois imposer à l'utilisateur de commencer son texte à saisir avec une initiale minuscule.
En effet, après un mot suivi de : le mot doit commencer par une minuscule.
Par défaut, dans une application, il y a une étiquette avec un titre suivi de :.
Ce même titre sera généralement employé dans l'état de l'aperçu avant impression.
La fonction suivante vérifie donc si, lors de la saisie, le curseur est sur le 1er caractère et si c'est le cas, le caractère est converti en minuscule.
Cela dit et malgré cette règle typographique, il peut arriver dans certain cas où un mot doit impérativement commencer par une initiale majuscule.
Dans ce cas, saisir un 1er caractère, puis un second, placer le curseur au début du second caractère, puis effacer le 1er caractère avec la touche Retour.

Événement : Sur touche activée du contrôle :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Private Sub Tbl_InitialeMinuscule_KeyPress(KeyAscii As Integer)

    'Si ce n'est pas un chiffre
    If KeyAscii > 64 Then
        'On vérifie si on se trouve au premier caractère
        If Me.Tbl_InitialeMinuscule.SelStart = 0 Then
            'La 1re lettre est convertie en minuscule
            KeyAscii = Asc(LCase(Chr(KeyAscii)))
        End If
    End If

End Sub

XII. Caractère interdit

Dans certains cas, il est nécessaire d'imposer les caractères de saisie qui peuvent être utilisés.
Cette fonction permet de définir d'une liste de caractères autorisés.

Événement : Sur touche activée du contrôle :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Private Sub Tbl_CaractereLimite_KeyPress(KeyAscii As Integer)

    'N'autorise que les caractères de la liste ainsi que les touches Tab, Suivant, Enter
    If InStr("1234567890abcdefghijklmnopqrstuvwxyz-" & Chr(8) & Chr(9) & Chr(13), Chr$(KeyAscii)) = 0 Then
        MsgBox "Seules les lettres de l'alphabet, " & _
            "les chiffres de 0 à 9 et le caractère spécial « « - » sont autorisés", , "Caractère interdit"
        KeyAscii = 0
    End If

End Sub

XIII. Limiter la longueur d'un texte

Si un champ est défini à 255 caractères dans une table, nous pourrons saisir 255 caractères dans ce même champ de formulaire même s'il ne fait que 2 cm de longueur. Se pose alors le problème de l'aperçu avant impression. En effet, dans ce cas, le texte sera tronqué et le document ne reflétera pas ce que l'on souhaite réellement présenter. Cette fonction permet de limiter la longueur du texte en fonction de la longueur de champ de formulaire.

Copier et coller le code suivant dans un module nommé Mod_LimitTextToControl.
Ne parlant anglais, vous m'excuserez si quelques commentaires ne sont pas traduits.

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
Const LOGPIXELSX = 88
Const LOGPIXELSY = 90
Const TWIPSPERINCH = 1440

Type Size
   cx As Long
   cy As Long
End Type

Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long

Declare Function GetDeviceCaps Lib "gdi32" (ByVal hDC As Long, _
   ByVal nIndex As Long) As Long
   
Declare Function GetFocus Lib "user32" () As Long

Declare Function GetTextExtentPoint Lib "gdi32" Alias _
   "GetTextExtentPointA" (ByVal hDC As Long, ByVal lpsz As String, _
   ByVal cbString As Long, lpSIZE As Size) As Long
   
Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long, _
   ByVal hDC As Long) As Long

Private Sub ConvertPixelsToTwips(X As Long, Y As Long)
   Dim hDC As Long, hwnd As Long, RetVal As Long
   Dim XPIXELSPERINCH As Long, YPIXELSPERINCH As Long

   'Récupère le nombre actuel de pixels par pouces, dépendant de la résolution.
   hDC = GetDC(0)
   XPIXELSPERINCH = GetDeviceCaps(hDC, LOGPIXELSX)
   YPIXELSPERINCH = GetDeviceCaps(hDC, LOGPIXELSY)
   RetVal = ReleaseDC(0, hDC)

   ' Transforme la mesure en twips.
   X = (X / XPIXELSPERINCH) * TWIPSPERINCH
   Y = (Y / YPIXELSPERINCH) * TWIPSPERINCH
End Sub

Sub LimitTextToControlWidth(KeyAscii As Integer)

   Dim AC As Control
   Dim Txt As String
   Dim TxtWidth As Long, SpaceWidth As Long
   Dim hwnd As Long, hDC As Long
   Dim lpSIZE As Size
   Dim RetVal As Long

   ' Sortie si un caractère non imprimable est tapé
   If KeyAscii < 32 Then Exit Sub

   ' Déclare le contrôle actif
   Set AC = Screen.ActiveControl

   ' Sélectionne le contrôle texte
   Txt = AC.Text & ""

   ' Ajoute le caractère tapé dans le texte
   If KeyAscii > 32 Then
      Txt = Left(Txt, AC.SelStart)
      Txt = Txt & Chr$(KeyAscii)
      Txt = Txt & Mid(Txt, AC.SelStart + 1 + AC.SelLength)
   End If

   hwnd = GetFocus()
   hDC = GetDC(hwnd)

   ' Convertit la largeur du texte en Twips.
   RetVal = GetTextExtentPoint(hDC, Txt, Len(Txt), lpSIZE)
   ConvertPixelsToTwips lpSIZE.cx, lpSIZE.cy
   TxtWidth = lpSIZE.cx

   'Convertit la largeur des espaces en Twips
   RetVal = GetTextExtentPoint(hDC, " ", 1, lpSIZE)
   ConvertPixelsToTwips lpSIZE.cx, lpSIZE.cy
   SpaceWidth = lpSIZE.cx

   ' Y a-t-il des espaces à traiter ?
   If AC.SelStart + 1 > Len(Txt) Then
      TxtWidth = TxtWidth + ((AC.SelStart + 1 - Len(Txt)) * SpaceWidth)
   End If
   
   ' Si largeur du texte >= à la largeur du champ
   If (TxtWidth + (SpaceWidth / 2)) >= AC.Width Then
      Beep
      ' Arrêt de la saisie
      KeyAscii = 0
   End If

End Sub

Pour appeler le code :

Événement : Sur touche activée du contrôle :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
Private Sub Tbl_LimitText_KeyPress(KeyAscii As Integer)

    'Limite la saisie à la longueur du champ
    Call LimitTextToControlWidth(KeyAscii)

End Sub

XIV. Changer le curseur de la souris au survol d'un bouton

Access 2010 propose enfin de pouvoir animer les boutons en définissant une forme ou une couleur différente au survol ou non dudit bouton. Cela dit, il manque la possibilité de changer l'aspect du curseur au survol du bouton.

Copier et coller le code suivant dans un module nommé Mod_Cursor.

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
'32512 flèche
'32513 curseur en I
'32514 sablier
'32515 croix
'32516 flèche vers le haut
'32640, 32642, 32643, 32644, 32645, 32646 doubles flèches de redimensionnement
'32648 stationnement interdit
'32650 flèche sablier

Public Const HandCursor = 32649&

Public Declare Function SetCursor Lib "user32" (ByVal hCursor As Long) As Long

Public Declare Function LoadCursor Lib "user32" Alias "LoadCursorA" _
    (ByVal hInstance As Long, ByVal lpCursorName As Long) As Long

Sub BtnHandCursor()

'Curseur Main lorsque la souris arrive sur le bouton
Dim lHandle As Long
lHandle = LoadCursor(0, HandCursor)
If (lHandle > 0) Then SetCursor lHandle

End Sub

Pour appeler le code :

Événement : Sur touche déplacée du bouton :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
Private Sub Btn_Icone_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)

    'Affiche une main au survol du bouton
    Call BtnHandCursor

End Sub

XV. Conclusion

Au travers de toutes ces petites astuces, une application peut avoir son ergonomie nettement améliorée permettant ainsi d'obtenir un résultat de qualité.

XVI. Remerciements

Nous tenons à remercier marsouin_89 pour la rédaction de ce tutoriel, Chrtophe et Gaby277 pour la relecture technique et Claude Leloup pour la correction orthographique.

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2019 marsouin_89. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.