Apprendre à Ecrire et Dessiner dans les états Access

Ce tutorial a pour but de vous apprendre les différentes méthodes pour écrire et dessiner dans les états Access.

Article lu   fois.

L'auteur

Profil ProSite personnel

Liens sociaux

Viadeo Twitter Facebook Share on Google+   

I. INTRODUCTION

Le but de cet article est de vous expliquer comment écrire et dessiner dans les Etats Access sans utiliser les contrôles classiques (zones de texte, rectangles, etc.).

Cet article sera divisé en deux parties :

  • Initiation sur les propriétés, méthodes et procédures évènementielles pour écrire et dessiner.
  • Présentation d'exemples.

Toutes les méthodes qui seront évoquées ici ne sont applicables qu'aux états. Si vous voulez dessiner sur des formulaires il faudra utiliser des API.
Pour cela, je vous conseille d'aller visiter :

La page personnelle d'Arkham46 : http://arkham46.developpez.com/

Cet article de Cafeine : http://cafeine.developpez.com/access/tutoriel/paint/

Les utilisateurs de VB6 ne seront pas dépaysés, ils reconnaîtront les fonctions utilisées.

Les instructions que nous allons étudier ne s'écrivent qu'en VBA (il n'existe pas d'assistant). Une bonne connaissance de celui-ci est indispensable pour comprendre certains exemples.
De plus l'utilisation de la touche F1 est indispensable en cas du moindre doute.

II. LES INSTRUCTIONS POUR ECRIRE ET DESSINER.

Nous allons dans ce paragraphe énumérer les procédures évènementielles, les méthodes et les propriétés pour écrire et dessiner dans un Etat.

II-A. Les procédures évènementielles dans les états.

Les états comportent comme les formulaires des procédures évènementielles, cependant celles-ci ne permettent pas une interaction avec l'utilisateur, car en effet un état n'est pas interactif contrairement à un formulaire.
Les procédures ne concernent que les différentes phases de l'élaboration d'un Etat (Formatage, Impression) et d'autres procédures comme l'ouverture, etc.

Un état se compose de plusieurs sections

  • L'état en lui-même ou Report
  • La zone de détail où seront affichées la plupart de vos données
  • Les zones d'Entête et de Pied de pages
  • Les zones d'Entête et de Pied d'Etat
  • Les entêtes et pieds de groupes

Dans le tableau suivant vous allez trouver les procédures évènementielles et à quelle section elles peuvent s'appliquer.

Procédure Report Détail Entête et Pied de Pages Entête et Pied d'Etat Entête et Pied de Groupe
Activate X        
Close X        
Deactivate X        
Error X        
NoData X        
Open X        
Page X        
Format   X X X X
Print   X X X X
Retreat   X   X X

II-B. Suite logique des procedures

Vous trouverez ci-dessous la suite logique des procédures évènementielles les plus utilisées.

  1. Report_Open
  2. Report_Activate
  3. ZoneEntêtePage_Format
  4. ZoneEntêtePage_Print
  5. Détail_Format
  6. Détail_Print
  7. ZonePiedPage_Format
  8. ZonePiedPage_Print
  9. Report_Page
  10. Report_Close
  11. Report_Deactivate

II-C. Les Sections

Un Etat est divisée en différentes sections, nous allons expliquer à quoi elles servent, cela permettra de mieux appréhender la construction d'un Etat et de savoir où doivent se positionner les éléments pour écrire et dessiner. Notez que cela est également valable lorsque vous voulez positionner des contrôles (zones de textes, etc.).

II-C-1. Détail

C'est dans cette zone que vous retrouverez le détail de vos enregistrements, visuellement c'est un peu comme si vous aviez copier-coller votre requête dans une feuille.

II-C-2. Entête et Pied de pages

Les données des entêtes et pied de pages concernent toutes les informations qui doivent se trouver sur chacune de vos pages (ex : SIRET, Numéro de pages, etc…). Comme leur nom l'indique, vous avez une zone pour l'entête de la page et une pour le pied de la page, par analogie, cela correspond aux entêtes et pied de pages d'un document Word.

II-C-3. Entête et Pied d'Etat

Contrairement aux zones de pages ci-dessus, ici vous afficherez une information sur l'entête de la première page et une sur le pied de la dernière page de l'Etat.
Utiliser l'Entête pour afficher par exemple le logo d'une société dans une facture, et le pied d'Etat pour un total final.

II-C-4. Entête et Pied de Groupe

Ces deux zones n'existent pas par défaut, elles sont crées automatiquement lorsque vous regroupez des données, par exemple lorsque vous décider d'éditer une liste de personnes et que vous voulez les regrouper par rapport à l'initial de leur Nom. En général on se sert de l'Entête pour indiquer à quoi correspond le groupe et le pied pour faire des totaux, mais les informations à visualiser peuvent être différentes.

II-D. Les évènements

Nous allons uniquement lister les procédures intéressantes pour le sujet de cet article, je vous renvoie sur l'aide Access pour les autres.

II-D-1. Page

Cet évènement se produit lors de la mise en forme de la page avant son impression, c'est sur cet évènement que l'on s'appuiera si on veut effectuer une action d'écriture ou de dessin sur l'ensemble de la page.

Mais attention, tout ce que vous ferez sur cet évènement se fera par-dessus tout ce qui a été fait avant, donc vous risquez de cacher des écritures.

II-D-2. Format

Cet évènement se produit lors de la mise en forme d'une section d'un Etat, chaque section peut avoir un formatage différent, contrairement à l'évènement Page du rapport.

II-D-3. Print

Cet évènement se produit pour préparer l'Etat à l'impression. Il se produit après l'évènement formatage d'une section.

II-D-4. Retreat

Cet évènement se produit lorsque Microsoft Access retourne à une section d'état précédente pendant sa mise en forme (copie de l'aide Access). Cet évènement se produit donc lorsque qu'il y'a des re-calcules sur une section.

II-E. Les coordonnées dans un Etat

Pour pouvoir écrire ou dessiner dans un Etat, il faut d'abord savoir comment fonctionnent les coordonnées dans celui-ci, en effet il faudra positionner les écritures et les dessins.

II-E-1. Origine

L'origine du repère se trouve en haut à gauche, que se soit pour un état ou une section de celui-ci.

La convention veut que l'on nomme les axes comme en mathématiques

  • X pour les coordonnées par rapport à un axe horizontal
  • Y pour les coordonnées par rapport à un axe vertical

Ce qui veut dire que lorsque vous allez sur la droite le chiffre des x augmente, et donc lorsque vous allez vers le bas le chiffre des y augmente (l'axe des y est donc inversé par rapport aux axes en mathématique).

L'origine est propre à la section dans laquelle vous effectuer le code, en effet, si celui-ci se trouve dans l'état (Report), l'origine sera en haut à gauche de la feuille, si vous êtes dans le pied de page, l'origine se trouve en haut et à gauche de cette section.

II-E-2. Unités

On peut utiliser plusieurs unités dans les Etats Access.

L'unité peut être modifiée grâce à la propriété ScaleMode.

Voici les différentes unités possibles :

Paramètre Unité
1 Twips
2 Points
3 Pixels
4 Caractères (horizontal = 120 twips par unité ; vertical = 240 twips par unité
5 Pouces
6 Millimètres
7 Centimètres

Il existe un autre paramètre qui est 0 que nous n'aborderons pas.

Pour information : 1 cm = 567 twips.

Pour connaître la dimension de la section dans laquelle vous effectuez des opérations, vous devez utiliser les propriétés ScaleWidth (largeur), ScaleHeight (la hauteur), ScaleLeft(Limite gauche) et ScaleTop (limite haute).

Pour plus de renseignements sur les différentes unités : http://support.microsoft.com/kb/463203/fr

II-E-3. Les dimensions : ScaleWidth et ScaleHeight

Il existe plusieurs propriétés pour récupérer les dimensions d'un état ou d'une section :

  • ScaleWidth : Indique la largeur de la zone de traçage dans un état ou d'une section.
  • ScaleHeight : Indique la hauteur de la zone de traçage dans un état ou d'une section.

Mais attention, suivant l'endroit où vous placez le code, l'effet ne sera pas le même.

Le code suivant dessine un cadre autour de la page

VBA
Sélectionnez

Private Sub Report_Page()
    Me.Line (0, 0)-(Me.ScaleWidth, Me.ScaleHeight), vbBlack, B
End Sub

Le code suivant dessine un cadre autour de la section entête de page

VBA
Sélectionnez

Private Sub ZoneEntêtePage_Format(Cancel As Integer, FormatCount As Integer)
     Me.Line (0, 0)-(Me.ScaleWidth, Me.ScaleHeight), vbBlack, B
End Sub

Pourtant comme vous le constatez l'instruction de dessin est la même, mais la procédure où vous placez le code a son importance.

II-E-4. ScaleTop et ScaleLeft

Ces deux propriétés permettent de re déterminer l'origine de votre zone de dessin.

Ainsi avec les instructions suivantes :

VBA
Sélectionnez

Me.ScaleTop = -2000
Me.ScaleLeft = -2000

L'origine sera décalée de 2000 unités vers le bas (ScaleTop) et de 2000 unités vers la droite (ScaleLeft).

Ainsi si vous voulez tracer un rectangle dont le point d'origine est (0,0) sur une page.

Dans le cas normal, le rectangle commencera en haut à gauche de la feuille

En utilisant les instructions ci-dessous, celui-ci commencera aux coordonnées (2000,2000) alors que dans l'instruction de dessin on aura (0,0).

II-F. Ecrire

Nous pouvons écrire du texte dans un état, ce chapitre à pour but de vous montrer les différentes méthodes pour écrire.

II-F-1. Print

La méthode Print va permettre d'écrire du texte dans un état (à ne pas confondre avec l'évènement Print).

L'exemple suivant va écrire : Bienvenue sur DVP dans la section entête de page :

VBA
Sélectionnez

Private Sub ZoneEntêtePage_Format(Cancel As Integer, FormatCount As Integer)
     Me.Print "Bienvenue sur DVP"
End Sub

Vous pouvez utiliser plusieurs fois cette méthode pour imprimer différents textes.

Cette méthode peut être agrémentée de deux paramètres, la virgule et le point virgule.

Si vous mettez une virgule la deuxième partie du texte sera décalée vers la droite dans une autre zone d'impression.

VBA
Sélectionnez

Private Sub ZoneEntêtePage_Format(Cancel As Integer, FormatCount As Integer)
     Me.Print "Bienvenue ",
     Me.Print "sur DVP"
End Sub
Image non disponible

Si vous mettez un point virgule la deuxième partie du texte sera accolée à la première.

VBA
Sélectionnez

Private Sub ZoneEntêtePage_Format(Cancel As Integer, FormatCount As Integer)
     Me.Print "Bienvenue ";
     Me.Print "sur DVP"
End Sub.
Image non disponible

Si vous ne mettez rien, la deuxième partie du texte sera décalée vers le bas.

VBA
Sélectionnez

Private Sub ZoneEntêtePage_Format(Cancel As Integer, FormatCount As Integer)
     Me.Print "Bienvenue "
     Me.Print "sur DVP"
End Sub
Image non disponible

II-F-2. Police

Vous pouvez également agrémenter votre texte des attributs classiques d'une police.

VBA
Sélectionnez

Private Sub ZoneEntêtePage_Format(Cancel As Integer, FormatCount As Integer)
     With Me
        .FontName = "Courrier New"         ' nom de la police
        .FontBold = True                   ' si True, la police est en gras
        .FontItalic = True                 ' si True, la police est en italique
        .FontSize = 12                     ' indique la taille de la police
        .FontUnderline = True              ' si True la police est soulignée
        .ForeColor = vbRed                 ' indique la couleur d'écriture de la police
        .Print "Bonjour"
    End With
End Sub

Ce code écrira Bonjour en rouge avec la police Courrier New d'une taille de 12, en gras, en italique et souligné.

Tant que vous ne changez pas les attributs d'une police, les précédents seront pris en compte.

II-F-3. Positionnement : CurrentX, CurrentY

Vous pouvez également positionner votre texte où vous voulez grâce aux propriétés CurrentX pour un positionnement horizontal et CurrentY pour un positionnement vertical.

L'unité employée est celle définie par la propriété ScaleMode.

Le code suivant positionnera le mot Bonjour dans la section entête de page à 1000 twips du bord haut de cette section et à 1000 twips par rapport au bord gauche de celle-ci.

VBA
Sélectionnez

Private Sub ZoneEntêtePage_Format(Cancel As Integer, FormatCount As Integer)
     With Me
        .ScaleMode = 1      'l'unité utilisée est donc le twips
        .CurrentX = 1000
        .CurrentY = 1000
        .Print "Bonjour"
    End With
End Sub

II-F-4. Récupérer la taille du texte : TextWidth et TextHeight

Ces deux méthodes permettent de récupérer la largeur (TextWidth) et la hauteur (TextHeight) d'un texte qui doit être imprimé dans un état.
L'unité de la valeur récupérée est celle qui a été déterminée par la propriété ScaleMode.

Il est important de bien déterminer les attributs de la police avant de récupérer par ces fonctions la largeur et la hauteur de la chaîne à écrire, car celles-ci sont calculées en fonction de ces attributs.

L'exemple suivant va nous permettre de centrer en hauteur et en largeur le mot " Bonjour " dans la section entête de page de notre état, et de réaliser un cadre autour.

VBA
Sélectionnez

Private Sub ZoneEntêtePage_Format(Cancel As Integer, FormatCount As Integer)
    ' centrage d'un texte dans une section
    With Me
        .FontName = "Arial"
        .FontSize = 48
        .FontBold = True
        .CurrentX = (Me.ScaleWidth - Me.TextWidth("Bonjour")) / 2    ' centrage en X
        .CurrentY = (Me.ScaleHeight - Me.TextHeight("Bonjour")) / 2  ' centrage en Y
    End With
    Me.Print "Bonjour"
    ' réalisation d'un cadre
    Me.Line (0, 0)-(Me.ScaleWidth, Me.ScaleHeight), vbBlack, B
End Sub

Et voilà un beau titre parfaitement centré sur votre page, sans aucun calcul ou de manipulation d'un contrôle dans l'état en mode conception.

II-G. Dessiner

Avant d'apprendre à dessiner, nous allons déterminer comment nous allons dessiner (largeur de trait, type de trait, remplissage, couleurs).

II-G-1. Largeur des traits : DrawWidth

Cette propriété va permettre de déterminer la largeur des traits des dessins (pour le dessin de lignes, de cercles, et de points).
L'unité de cette propriété est le pixel, il faudra donc faire une conversion pour utiliser une autre unité.

II-G-2. Type de traits : DrawStyle

Cette propriété va permettre de déterminer le type de ligne, elle s'appliquera uniquement aux méthodes permettant de dessiner des lignes (Line) et des cercles (Circle).

Les paramètres sont :

  • 0 - (Valeur par défaut) Ligne pleine, intérieur transparent
  • 1 - Tiret, intérieur transparent
  • 2 - Point, intérieur transparent
  • 3 - Tiret-point, intérieur transparent
  • 4 - Tiret-point-point, intérieur transparent
  • 5 - Trait invisible, intérieur transparent
  • 6 - Trait invisible, intérieur plein

Le code ci-dessous va vous permettre de visualiser sur un état les différents types de traits.

VBA
Sélectionnez

Private Sub Report_Page()
    ' ======================================================================================
    ' Procedure     : Module :Report_rpt_DrawStyle // Procédure : Report_Page
    ' DateTime      : 30/10/2007 19:34
    ' Auteur        : Starec - Philippe JOCHMANS - http://starec.developpez.com
    ' Description   : Ce code va permettre de visualiser les différents
    '                 type de lignes (DrawStyle)
    '=======================================================================================
    
    ' déclaration
    Dim i As Byte
    
    ' affichage des lignes
    Me.CurrentY = 0
    For i = 0 To 6
        Me.DrawStyle = i
        Me.Line (0, Me.CurrentY)-(Me.ScaleWidth, Me.CurrentY)
        Me.CurrentY = Me.CurrentY + 500
    Next i
End Sub
Image non disponible

II-G-3. Remplissage : Fillstyle

Cette propriété va vous permettre de déterminer le type de remplissage, elle s'appliquera uniquement aux méthodes permettant de dessiner des lignes (Line) et des cercles (Circle).

  • 0 - Opaque
  • 1 - (Valeur par défaut) Transparent
  • 2 - Trait horizontal
  • 3 - Trait vertical
  • 4 - Diagonale montante
  • 5 - Diagonale descendante
  • 6 - Croix
  • 7- Diagonales croisées

Le code ci-dessous va vous permettre de visualiser sur un état les différents types de remplissage.

VBA
Sélectionnez

Private Sub Report_Page()
    ' ======================================================================================
    ' Procedure     : Module :Report_rpt_FillStyle // Procédure : Report_Page
    ' DateTime      : 31/10/2007 05:33
    ' Auteur        : Starec - Philippe JOCHMANS - http://starec.developpez.com
    ' Description   : Ce code va vous permettre de visualiser les différentes types de
    '                 remplissage
    '=======================================================================================
    
    ' déclaration
    Dim i As Byte
    
    ' dessin
    Me.CurrentY = 1000
    For i = 0 To 3
        Me.FillStyle = i
        Me.Circle (1000, Me.CurrentY), 500, vbBlack
        Me.CurrentY = Me.CurrentY + 1500
    Next i
    Me.CurrentY = 1000
    For i = 4 To 7
        Me.FillStyle = i
        Me.Circle (4000, Me.CurrentY), 500, vbBlack
        Me.CurrentY = Me.CurrentY + 1500
    Next i
End Sub
Image non disponible

II-G-4. Les couleurs : FillColor

Cette propriété va vous permettre de déterminer la couleur de remplissage, elle s'appliquera uniquement aux méthodes permettant de dessiner des lignes (Line) et des cercles (Circle).

La valeur de cette couleur sera un entier de type Long ou une constante de couleur (VbWhite, VbRes, etc.) ou bien un code RGB.

Nous allons reprendre le code précédent et changer la couleur de la trame.

VBA
Sélectionnez

Private Sub Report_Page()
    ' ======================================================================================
    ' Procedure     : Module :Report_rpt_FillColor // Procédure : Report_Page
    ' DateTime      : 31/10/2007 05:33
    ' Auteur        : Starec - Philippe JOCHMANS - http://starec.developpez.com
    ' Description   : Ce code va vous permettre de visualiser la couleur de remplissage
    '=======================================================================================
    
    ' déclaration
    Dim i As Byte
    
    ' dessin
    Me.CurrentY = 1000
    Me.FillColor = vbRed
    For i = 0 To 3
        Me.FillStyle = i
        Me.Circle (1000, Me.CurrentY), 500, vbYellow
        Me.CurrentY = Me.CurrentY + 1500
    Next i
    Me.CurrentY = 1000
    Me.FillColor = vbGreen
    For i = 4 To 7
        Me.FillStyle = i
        Me.Circle (4000, Me.CurrentY), 500, vbBlue
        Me.CurrentY = Me.CurrentY + 1500
    Next i
End Sub
Image non disponible

II-G-5. Le mode de dessin : DrawMode

Ce concept est un peu difficile à appréhender, en fait il s'agit de connaître l'interaction entre les éléments qui composent un dessin, comment se superposent les différents éléments.

Voici la liste des paramètres, mais pour mieux appréhender graphiquement ce qui se passe, nous allons faire un exemple pour chaque.

Pour cela nous allons utiliser le code suivant : Celui-ci crée 2 cercles (un rouge et un bleu), et écrit un texte en noir. Ce qui nous permettra de voir comment agit la méthode DrawMode

VBA
Sélectionnez

Private Sub Report_Page()
    ' ======================================================================================
    ' Procedure     : Module :Report_rpt_DrawMode // Procédure : Report_Page
    ' DateTime      : 31/10/2007 05:55
    ' Auteur        : Starec - Philippe JOCHMANS - http://starec.developpez.com
    ' Description   : Exemple d'utilisation de DrawMode
    '=======================================================================================
    
   ' dessin
   With Me
        .CurrentY = 1000
        .FillStyle = 0
        .DrawMode = 1 ' le parametre qui sera changé
        .FontSize = 12
        .ForeColor = vbBlack
    End With
    Me.Print "Utilisation de DrawMode (10) avec des graphiques"
    Me.FillColor = vbRed
    Me.Circle (2000, Me.CurrentY), 900, vbBlack
    Me.FillColor = vbBlue
    Me.Circle (2500, Me.CurrentY), 900, vbBlack
    Me.CurrentY = Me.CurrentY + 1500
    
End Sub

1 - Crayon noir.

Image non disponible

2 - Inverse du paramètre 15 (NotMergePen).

Image non disponible

3 - Combinaison des couleurs communes à l'arrière-plan et à l'inversion du crayon (MaskNotPen).

Image non disponible

4 - Inverse du paramètre 13 (NotCopyPen).

Image non disponible

5 - Combinaison des couleurs communes au crayon et à l'inverse de l'affichage (MaskPenNot).

Image non disponible

6 - Inverse de la couleur de l'affichage (Invert).

Image non disponible

7 - Combinaison des couleurs du crayon et de la couleur de l'affichage, à l'exclusion des couleurs communes aux deux (XorPen).

Image non disponible

8 - Inverse du paramètre 9 (NotMaskPen).

Image non disponible

9 - Combinaison des couleurs communes au crayon et à l'affichage (MaskPen).

Image non disponible

10 - Inverse du paramètre 7 (NotXorPen).

Image non disponible

11 - Aucun effet - la sortie reste inchangée. En fait, ce paramètre désactive le dessin (Nop).

Image non disponible

12 - Combinaison de la couleur de l'affichage et de l'inverse de la couleur du crayon (MergeNotPen).

Image non disponible

13 - (Valeur par défaut) Couleur spécifiée par la propriété ForeColor (CopyPen).

Image non disponible

14 - Combinaison de la couleur du crayon et de l'inverse de la couleur de l'affichage (MergePenNot).

Image non disponible

15 - Combinaison de la couleur du crayon et de la couleur de l'affichage (MergePen).

Image non disponible

16 - Crayon blanc

Image non disponible

Malgré les exemples, cette propriété est loin d'être parlante. Son utilisation est très marginale.

Vous ne pouvez pas déterminer des modes de dessin différents dans une section d'un état, par contre vous pouvez tout à fait mettre un mode de dessin différent d'une section à l'autre.

II-G-6. Line

Cette méthode va permettre de dessiner une ligne, un rectangle vide ou un rectangle plein.

Syntaxe :

Line [Step] (xD, yD) [Step] - (xF, yF), [couleur], [B][F]

  • Step : ce mot va préciser si les coordonnées qui suivent sont à prendre par rapport à l'origine de la section (coordonnées absolues) ou par rapport à la position actuelle du curseur (coordonnées relatives).
  • xD : Coordonnée horizontale du point de départ du tracé .
  • yD : Coordonnée verticale du point de départ du tracé.
  • xF : Coordonnée horizontale du point d'arrivée du tracé.
  • yF : Coordonnée verticale du point d'arrivée du tracé.
  • Couleur : Couleur du tracé de type entier long. Vous pouvez utiliser une couleur définie à l'aide de la fonction RGB(), un entier long ou bien une constance VB (vbBlack, vbRed, etc..).
  • B : Indique que vous allez tracer un rectangle, sans cette lettre, vous allez tracer une ligne dont le début sera en xD et yD et la fin en xF et yF (cela correspond donc à la diagonale de ce rectangle).
  • F : Indique si le rectangle est rempli de la couleur définie en paramètre. Cette propriété n'est pas à utilisée en case de l'utilisation de FillStyle et FillColor

Pour dessiner un rectangle avec un bord d'une couleur différente vous pouvez :

  • Créer un rectangle plein avec la couleur en paramètre, et un rectangle vide (sans le paramètre F) avec une autre couleur en paramètre.
  • Utiliser les propriétés FillColor et FillStyle.

Voici quelques exemples, il s'agit d'une copie d'écran d'un état qui a été entièrement créé par du code VBA.

Image non disponible

Vous noterez que dans les deux dernières instructions il n'y a pas de coordonnées de départ, c'est donc la position du curseur à la fin de la ligne précédente qui est prise en compte.

II-G-7. Circle

Cette méthode va vous permettre de dessiner un cercle ou une ellipse.

Syntaxe :

Circle [Step] (x, y), rayon, [couleur, début, fin, aspect]

  • Step : Cela indique que les coordonnées du centre du cercle (x,y) seront relatives par rapport à la position du curseur.
  • x : Coordonnées horizontale du centre du cercle ou de l'ellipse (Obligatoire).
  • y : Coordonnées verticale du centre du cercle ou de l'ellipse (Obligatoire).
  • Rayon : Rayon du cercle ou de l'ellipse (Obligatoire).
  • Couleur : Couleur de tracé du cercle ou de l'ellipse. Vous pouvez utiliser une couleur définie à l'aide de la fonction RGB(), un entier long ou bien une constance VB (vbBlack, vbRed, etc..) (Facultatif).
  • Début : Il s'agit du point de départ du cercle. Cette valeur est un nombre réel simple, allant de -2 PI Radians à 2 PI Radians (Facultatif en cas de cercle entier).
  • Fin : Il s'agit du point de fin du cercle. Cette valeur est un nombre réel simple, allant de -2 PI Radians à 2 PI Radians (Facultatif en cas de cercle entier).
  • Aspect : Il s'agit du rapport entre largeur/hauteur qui permet de déterminer la forme de l'ellipse.

Voici un exemple de code :

VBA
Sélectionnez

Private Sub ZoneEntêtePage_Format(Cancel As Integer, FormatCount As Integer)
    ' Dessin d'un cadre entourant la zone entête de page
    Me.Line (0, 0)-(Me.ScaleWidth, Me.ScaleHeight), vbBlack, B
    ' dessin d'un cercle dont le haut, le bas, la gauche, la droite touchent le cadre
    Me.Circle (Me.ScaleWidth / 2, Me.ScaleHeight / 2), Me.ScaleWidth / 2, vbBlack, , , Me.ScaleHeight / Me.ScaleWidth
End Sub
Image non disponible

Voici un autre exemple, ce code dessine le très connu PacMan :

VBA
Sélectionnez

Private Sub ZoneEntêtePage_Format(Cancel As Integer, FormatCount As Integer)
    ' Pacman
    Const Pi = 3.14159265359
    ' le fond jaune
    Me.FillColor = vbYellow
    Me.FillStyle = 0
    ' la bouche blanche
    Me.Circle (1000, 1000), 500, vbWhite
    Me.FillColor = vbWhite
    Me.FillStyle = 0
    Me.Circle (1000, 1000), 500, vbWhite, -(2 * Pi - Pi / 5), -Pi / 5
    ' l'oeil
    Me.Circle (1100, 700), 50, vbWhite
End Sub
Image non disponible

II-G-8. PSet

Cette méthode va tracer un point à un endroit précis d'un état.

Syntaxe :

Pset [Step](x,y),[couleur]

  • Step : Cela indique que les coordonnées du point (x,y) seront relatives par rapport à la position du curseur.
  • X : Position du point sur l'axe horizontal (Obligatoire).
  • Y : Position du point sur l'axe vertical (Obligatoire).
  • Couleur : Couleur du point

Exemple de code :

VBA
Sélectionnez

Private Sub Report_Page()
    ' sinusoide
    Me.DrawWidth = 20
    Dim i As Integer
    For i = 0 To 5000 Step 1
        PSet (i, 5000 + (Sin(i * 3.14) * 1000)), vbBlack
    Next i
End Sub
Image non disponible

III. EXEMPLES

Cette partie a pour but de vous montrer différents types d'utilisations possibles de méthodes de dessin et d'écriture dans les états Access.

III-A. Rectangles au coin arrondi.

Les rectangles et zones de texte des états Access ont des coins à angles droits. Ce que nous allons voir ici c'est comment réaliser un rectangle avec des coins arrondis.

III-A-1. Le rectangle simple

En fait un rectangle aux coins arrondis est composé de 4 droites et de 4 quarts de cercles.

Le code suivant va vous permettre de créer un rectangle arrondi sur l'entête d'un état, dont le rayon sera de 200 twips, et en plus on va mettre un titre à l'intérieur en le centrant.

VBA
Sélectionnez

Private Sub ZoneEntêtePage_Format(Cancel As Integer, FormatCount As Integer)
    ' ======================================================================================
    ' Procedure     : Module :Report_rpt_RoundRectangle // Procédure : ZoneEntêtePage_Format
    ' DateTime      : 01/11/2007 08:54
    ' Auteur        : Starec - Philippe JOCHMANS - http://starec.developpez.com
    ' Description   : Nous allons dessiner un rectangle au coin arrondi sur l'entête de la page
    '                 celui-ci aura un rayon de 200 twips dans les coins
    '                 Avec un texte centrer
    '=======================================================================================
    
    ' variables
    Dim strTexte As String
    
    ' constantes
    Const Pi = 3.14159265359
    
    ' détermination de l'unité
    Me.ScaleMode = 1 ' nous sommes en twips
    ' dessin du quart de cercle en haut à gauche
    Me.Circle (200, 200), 200, vbBlack, Pi / 2, Pi
    ' dessin du bord haut
    Me.Line (200, 0)-(Me.ScaleWidth - 200, 0), vbBlack
    ' dessin du quart de cercle en haut à droite
    Me.Circle (Me.ScaleWidth - 200, 200), 200, vbBlack, 0, Pi / 2
    ' dessin du bord droit
    Me.Line (Me.ScaleWidth, 200)-(Me.ScaleWidth, Me.ScaleHeight - 200), vbBlack
    ' dessin du quart de cercle en bas à droite
    Me.Circle (Me.ScaleWidth - 200, Me.ScaleHeight - 200), 200, vbBlack, Pi + Pi / 2, 0
    ' dessin du bord bas
    Me.Line (200, Me.ScaleHeight)-(Me.ScaleWidth - 200, Me.ScaleHeight), vbBlack
    ' dessin du quart de cercle en bas à gauche
    Me.Circle (200, Me.ScaleHeight - 200), 200, vbBlack, Pi, Pi + Pi / 2
    ' dessin du bord gauche
    Me.Line (0, 200)-(0, Me.ScaleHeight - 200), vbBlack
    
    ' affichage du texte
    With Me
        .FontName = "TAHOMA"
        .FontSize = 24
        .FontBold = True
    End With
    strTexte = "Bienvenue sur Developpez.com"
    ' coordonnées du texte
    With Me
        .CurrentX = (Me.ScaleWidth - Me.TextWidth(strTexte)) / 2
        .CurrentY = (Me.ScaleHeight - Me.TextHeight(strTexte)) / 2
    End With
    Me.Print strTexte
End Sub

Voilà le résultat :

Image non disponible

III-A-2. Le rectangle générique

Maintenant nous allons créer une routine qui nous permettra d'entourer une zone de plusieurs zones de texte ou d'étiquettes d'un rectangle dont nous pourrons gérer un à un les coins.

Voici la procédure que nous allons utiliser :

VBA
Sélectionnez

Public Sub RoundRectangle(rpt As Report, ctrlDebut As Control, ctrlFin As Control, _
                          blnHautGauche As Boolean, blnHautDroit As Boolean, _
                          blnBasGauche As Boolean, blnBasDroit As Boolean, _
                          lngRayon As Long, lngDecalage As Long, lngColorTrait As Long)
    ' ======================================================================================
    ' Procedure     : Module :Routiones // Procédure : RoundRectangle
    ' DateTime      : 01/11/2007 18:11
    ' Auteur        : Starec - Philippe JOCHMANS - http://starec.developpez.com
    ' Description   : Cette procédure va permettre de réaliser un groupe de rectangles avec
    '                 pleins d'options
    '                 rpt : nom de l'état
    '                 ctrlDebut : nom du contrôle le plus en haut à gauche
    '                 ctrlFin : nom du contrôle le plus en haut à droite
    '                 blnBasHautGauche : si true, l'angle est arrondi et ainsi de suite pour les autres
    '                 lngRayon : rayon de l'arrondi
    '                 lngDecalage : décalage du cadre par rapport au ctrl de début et de fin
    '                 lngColorTrait : Couleur du trait
    '=======================================================================================
    
    ' ===== constante =====
    Const PI = 3.14159265359
    
    ' ===== déclaration des variables =====
    Dim lngTop As Long ' position top du rectangle
    Dim lngLeft As Long ' position left du rectangle
    Dim lngWidth As Long ' largeur du rectangle
    Dim lngHeight As Long ' hauteur du rectangle
    
    
    ' ===== affectation =====
    lngTop = ctrlDebut.Top - lngDecalage
    lngLeft = ctrlDebut.Left - lngDecalage
    lngWidth = ctrlFin.Left + ctrlFin.Width - ctrlDebut.Left + (lngDecalage * 2)
    lngHeight = ctrlFin.Top + ctrlFin.Height - ctrlDebut.Top + (lngDecalage * 2)
    
    ' ==== dessin des angles ====
    If blnHautGauche Then ' si le haut gauche est arrondi
        rpt.Circle (lngLeft + lngRayon, lngTop + lngRayon), lngRayon, lngColorTrait, PI / 2, PI
    Else
        rpt.Line (lngLeft, lngTop)-(lngLeft + lngRayon, lngTop), lngColorTrait
        rpt.Line (lngLeft, lngTop)-(lngLeft, lngTop + lngRayon), lngColorTrait
    End If
    If blnHautDroit Then ' si le haut droit est arrondi
        rpt.Circle (lngLeft + lngWidth - lngRayon, lngTop + lngRayon), lngRayon, lngColorTrait, 0, PI / 2
    Else
        rpt.Line (lngLeft + lngWidth - lngRayon, lngTop)-(lngLeft + lngWidth, lngTop), lngColorTrait
        rpt.Line (lngLeft + lngWidth, lngTop)-(lngLeft + lngWidth, lngTop + lngRayon), lngColorTrait
    End If
    If blnBasDroit Then ' si le bas droit est arrondi
        rpt.Circle (lngLeft + lngWidth - lngRayon, lngTop + lngHeight - lngRayon), lngRayon, lngColorTrait, PI + PI / 2, 0
    Else
        rpt.Line (lngLeft + lngWidth, lngTop + lngHeight - lngRayon)-(lngLeft + lngWidth, lngTop + lngHeight), lngColorTrait
        rpt.Line (lngLeft + lngWidth, lngTop + lngHeight)-(lngLeft + lngWidth - lngRayon, lngTop + lngHeight), lngColorTrait
    End If
    If blnBasGauche Then ' si le bas gauche est arrondi
        rpt.Circle (lngLeft + lngRayon, lngTop + lngHeight - lngRayon), lngRayon, lngColorTrait, PI, PI + PI / 2
    Else
        rpt.Line (lngLeft, lngTop + lngHeight - lngRayon)-(lngLeft, lngTop + lngHeight), lngColorTrait
        rpt.Line (lngLeft, lngTop + lngHeight)-(lngLeft + lngRayon, lngTop + lngHeight), lngColorTrait
    End If
        
    ' ==== dessin des cotés =====
    ' coté haut
    rpt.Line (lngLeft + lngRayon, lngTop)-(lngLeft + lngWidth - lngRayon, lngTop), lngColorTrait
    ' coté droit
    rpt.Line (lngLeft + lngWidth, lngTop + lngRayon)-(lngLeft + lngWidth, lngTop + lngHeight - lngRayon), lngColorTrait
    ' coté bas
    rpt.Line (lngLeft + lngRayon, lngTop + lngHeight)-(lngLeft + lngWidth - lngRayon, lngTop + lngHeight), lngColorTrait
    ' coté gauche
    rpt.Line (lngLeft, lngTop + lngRayon)-(lngLeft, lngTop + lngHeight - lngRayon), lngColorTrait
End Sub

Nous allons prendre pour exemple un relevé de note d'un élève, ce relevé comporte une entête pour les colonnes, mais malheureusement celle-ci est droite et triste.

Image non disponible

Nous allons rendre ce cadre plus agréable :

D'abord nous recentrons le texte qui se trouve dans l'étiquette " Matière ", et nous supprimons les traits des étiquettes.

Dans la zone adéquate nous allons utiliser le code ci-dessous :

VBA
Sélectionnez

Private Sub ZoneEntêtePage_Format(Cancel As Integer, FormatCount As Integer)
    ' on entoure les entêtes des colonnes par un grand carré avec des angles arrondis
    Call RoundRectangle(Me, Me.lblMatière, Me.lblRemarque, True, True, False, False, 100, 50, vbBlack)
End Sub

On obtient :

Image non disponible

Mais il nous manque la séparation entre les colonnes, on va donc ajouter les lignes suivantes dans la même procédure.

VBA
Sélectionnez

' on remet les traits des colonnes, il faut penser à inclure le décalage de la routine RoundRectangle
    Me.Line (Me.lblMinClasse.Left, Me.lblMinClasse.Top - 50)- _
            (Me.lblMinClasse.Left, Me.lblMinClasse.Top + lblMinClasse.Height + 50), vbBlack
    Me.Line (Me.lblMoyenneClasse.Left, Me.lblMoyenneClasse.Top - 50)- _
            (Me.lblMoyenneClasse.Left, Me.lblMoyenneClasse.Top + lblMoyenneClasse.Height + 50), vbBlack
    Me.Line (Me.lblMaxClasse.Left, Me.lblMaxClasse.Top - 50)- _
            (Me.lblMaxClasse.Left, Me.lblMaxClasse.Top + lblMaxClasse.Height + 50), vbBlack
    Me.Line (Me.lblMoyenneEleve.Left, Me.lblMoyenneEleve.Top - 50)- _
            (Me.lblMoyenneEleve.Left, Me.lblMoyenneEleve.Top + lblMoyenneEleve.Height + 50), vbBlack
    Me.Line (Me.lblRemarque.Left, Me.lblRemarque.Top - 50)- _
            (Me.lblRemarque.Left, Me.lblRemarque.Top + lblRemarque.Height + 50), vbBlack

Ce qui va nous donner :

Image non disponible

Cela pour vous montrer que l'on peut combiner les cercles, les traits

III-B. Mettre en évidence une donnée.

Pour mettre en évidence des données, il y a plusieurs moyens, le plus connu est la mise en forme conditionnelle, dont voici un excellent article de Christophe Warin : http://warin.developpez.com/access/mfc/.

III-B-1. En le mettant en surbrillance

Le code suivant va vous permettre de mettre en surbrillance, les notes d'un élève inférieures à 10.

VBA
Sélectionnez

Private Sub Détail_Format(Cancel As Integer, FormatCount As Integer)
    ' ==== surbrillance =====
    If Me.sngMoyEleve.Value < 10 Then ' on teste la valeur dans le champ sngMoyEleve
        ' la note est infèrieure à 10
        ' on met la police du texte en blanc
        Me.sngMoyEleve.ForeColor = vbWhite
        ' on dessine un cadre noir sur la zone de texte sngMoyEleve avec les mêmes dimensions
        Me.Line (Me.sngMoyEleve.Left, Me.sngMoyEleve.Top)- _
               (Me.sngMoyEleve.Left + Me.sngMoyEleve.Width, Me.sngMoyEleve.Top + Me.sngMoyEleve.Height), vbBlack, BF
    Else
        ' on met la police du texte en noir
        Me.sngMoyEleve.ForeColor = vbBlack
    End If
End Sub
Image non disponible

Vous pouvez réaliser la même chose en jouant sur la propriété backcolor de la zone de texte

III-B-2. En l'entourant d'une ellipse

La mise en forme conditionnelle vous permet de changer les couleurs d'une zone de texte à mettre en évidence.

Cependant, tout le monde ne dispose pas d'imprimantes couleurs, avec cet exemple vous pourrez voir que l'on peut mettre en évidence les données autrement.

Le code suivant va entourer la donnée à mettre en évidence d'une Ellipse.

VBA
Sélectionnez

Private Sub Détail_Format(Cancel As Integer, FormatCount As Integer)
    ' ===== Ellipse =====
    If Me.sngMoyEleve.Value < 10 Then
        Me.Circle (Me.sngMoyEleve.Left + Me.sngMoyEleve.Width / 2, Me.sngMoyEleve.Height / 2), _
                   Me.sngMoyEleve.Width / 2, vbBlack, , , Me.sngMoyEleve.Height / Me.sngMoyEleve.Width
    End If
End Sub
Image non disponible

III-C. Dégradés

Nous avons vu dans la partie cours de cet article comment remplir un carré ou un cercle avec une couleur. Hors il est aussi possible de faire des dégradés.

Le code ci-dessous a été optimisé par Arkham46 que je remercie.

VBA
Sélectionnez

Public Sub Degrade(rpt As Report, lngLeft As Long, lngTop As Long, _
                   lngWidth As Long, lngHeight As Long, bytQteDegrade As Byte)
    ' ======================================================================================
    ' Procedure     : Module :Routiones // Procédure : degrade
    ' DateTime      : 03/11/2007 07:14
    ' Auteur        : Starec - Philippe JOCHMANS - http://starec.developpei.com
    ' Description   : Cette procédure va vous permettre de réaliser un dégradé
    '=======================================================================================
     
    ' ===== déclaration des variables =====
    Dim j As Long, k As Long
        
    ' ===== réalisation du dégradé =====
    For j = 0 To lngHeight
        k = (j / lngHeight) * bytQteDegrade
        rpt.Line (lngLeft, lngTop + j)-(lngLeft + lngWidth, lngTop + j), RGB(250, 200, k)
    Next j
End Sub

Voici comment l'utiliser :

VBA
Sélectionnez

Private Sub Report_Page()
    Call Degrade(Me, 500, 200, 2000, 2000, 255)
End Sub

Et visuellement :

Image non disponible

III-D. La carte de France

Vous trouverez dans la page personnelle d'Arkham46 : http://arkham46.developpez.com/ une base exemple.

Cette base comporte une table Tdepartement qui reprend des coordonnées pour dessiner le territoire Français.

Nous allons utiliser ce code pour dessiner une carte de France.

Le code dessinera la carte de la France, et une routine permettra de mettre un point rouge dans un département.

VBA
Sélectionnez

Private Sub Report_Page()
    ' ======================================================================================
    ' Procedure     : Module :Report_rpt_Carte // Procédure : Report_Page
    ' DateTime      : 05/11/2007 19:35
    ' Auteur        : Starec - Philippe JOCHMANS - http://starec.developpez.com
    ' Description   : Dessin de la carte de France.
    '                 Vous trouverez la table pour le dessin de la carte sur la base
    '                 exemple du site d'Arkham46 : http://arkham46.developpez.com/
    '=======================================================================================

    ' ===== dessin de la carte de France =====
    Dim rst As DAO.Recordset
    Dim strSQL As String
    Dim tabDpt() As String
    Dim i As Integer
    Dim lngPremPointX As Long 'stockage du premier point
    Dim lngPremPointY As Long
    
    ' ===== affectation =====
    strSQL = "SELECT nom, points FROM Tdepartement WHERE points Is Not Null;"
    Set rst = CurrentDb.OpenRecordset(strSQL)
    
    ' ===== dessin de la France =====
    Me.DrawWidth = 20
    While Not rst.EOF
        ' on réparti les points dans un tableau
        tabDpt = Split(rst("points"), ",")
        ' on stocke les premiers points pour boucler les départements
        lngPremPointX = tabDpt(0)
        lngPremPointY = tabDpt(1)
        For i = 0 To UBound(tabDpt()) - 1 Step 2
            Me.Line (15 * tabDpt(i), 15 * tabDpt(i + 1))-(15 * tabDpt(i + 2), 15 * tabDpt(i + 3)), vbBlack
            If i = UBound(tabDpt()) - 3 Then
                Exit For
            End If
        Next i
        ' on ferme le département
        Me.Line (15 * tabDpt(i + 2), 15 * tabDpt(i + 3))-(15 * lngPremPointX, 15 * lngPremPointY), vbBlack
       rst.MoveNext
    Wend
    
    rst.Close
    Set rst = Nothing
    
    ' ===== on dessine le cercle ====
    Call SelectDpt(Me, "calvados")
End Sub

La routine pour le département :

VBA
Sélectionnez

Public Sub SelectDpt(rpt As Report, strDpt As String)
    ' ======================================================================================
    ' Procedure     : Module :Report_rpt_Carte // Procédure : SelectDpt
    ' DateTime      : 03/11/2007 08:57
    ' Auteur        : Starec - Philippe JOCHMANS - http://starec.developpez.com
    ' Description   : Cette routine va permettre de dessiner un rond rouge dans
    '                 le centre du département
    '=======================================================================================
    
    ' ===== déclaration ====
    Dim rst As DAO.Recordset
    Dim strSQL As String
    Dim tabCentre() As String
    Dim sngMaxX As Single
    Dim sngMinX As Single
    Dim sngMaxY As Single
    Dim sngMinY As Single
    Dim i As Integer
    
    ' ===== affectation =====
    strSQL = "SELECT nom, points FROM Tdepartement WHERE points Is Not Null and nom ='" & strDpt & "';"
    Set rst = CurrentDb.OpenRecordset(strSQL)
    
    ' ==== détermination des coordonnées =====
    While Not rst.EOF
        tabCentre() = Split(rst("points"), ",")
        ' on cherche le max et le min des points x
        sngMaxX = 0
        sngMinX = tabCentre(0)
        For i = 0 To UBound(tabCentre()) Step 2
            ' le max
            If tabCentre(i) > sngMaxX Then
                sngMaxX = tabCentre(i)
            End If
            ' le min
            If tabCentre(i) < sngMinX Then
                sngMinX = tabCentre(i)
            End If
        Next i
        
        ' on cherche le max et le min des points y
        sngMaxY = 0
        sngMinY = tabCentre(0)
        For i = 1 To UBound(tabCentre()) Step 2
            ' le max
            If tabCentre(i) > sngMaxY Then
                sngMaxY = tabCentre(i)
            End If
            ' le min
            If tabCentre(i) < sngMinY Then
                sngMinY = tabCentre(i)
            End If
        Next i
        rst.MoveNext
    Wend
        
    rst.Close
    Set rst = Nothing
    
    ' ==== dessin du cercle =====
    rpt.FillColor = vbRed
    rpt.FillStyle = 0
    rpt.Circle (15 * sngMinX + ((15 * sngMaxX - 15 * sngMinX) / 2), 15 * sngMinY + ((15 * sngMaxY - 15 * sngMinY) / 2)), 100
    
End Sub

Et voici le résultat :

Image non disponible

III-E. Les champs auto extensibles

Dans les états les zones de texte ont une propriété intéressante, permettre que les champs soient auto extensibles (CanGrow).

Cependant, cette propriété a des inconvénients. L'image suivante vous montre un défaut d'affichage de l'utilisation de celle-ci.

Tous les champs ont la propriété auto extensible à oui, et les zones de texte sont entourées d'un cadre.

Image non disponible

Comme on le voit, graphiquement cela est horrible.

Le code suivant va permettre de résoudre ce problème.

VBA
Sélectionnez

Private Sub Détail_Print(Cancel As Integer, PrintCount As Integer)
    ' ======================================================================================
    ' Procedure     : Module :Report_rpt_ClasseNormal // Procédure : Détail_Print
    ' DateTime      : 06/11/2007 05:17
    ' Auteur        : Starec - Philippe JOCHMANS - http://starec.developpez.com
    ' Description   : Sur l'évènement Print de la zone détail, nous allons refaire le cadrage
    '                 des zones de texte
    '=======================================================================================
    
    ' ===== déclaration =====
    Dim oCtrl As Control
    
    ' ===== on enlève le cadre de tous les contrôles =====
    For Each oCtrl In Me.Section(acDetail).Controls  ' on parcours toutes les zones de texte de la section
        If TypeOf oCtrl Is TextBox Then              ' on teste si ce sont des textbox
            oCtrl.BorderStyle = 0                    ' on rend la bordure invisible
            oCtrl.BackStyle = 0                      ' on rend le fond transparent
            ' on dessine un cadre autour du contrôle
            Me.Line (oCtrl.Left, oCtrl.Top)- _
                    (oCtrl.Left + oCtrl.Width, Me.strRemarque.Height), vbBlack, B
        End If
    Next oCtrl
End Sub

Comme on le voit dans ce code, on entoure chaque zone de texte d'un cadre dont la hauteur sera celle de la zone strRemarque qui s'étendra automatiquement.

Le résultat est le suivant :

Image non disponible

IV. CONCLUSION

Les méthodes pour écrire ou dessiner dans les états Access permettent essentiellement d'améliorer votre mise en page.
Cependant, des exemples comme la réalisation de la carte de France vous montrent que l'on peut éditer des dessins qui ne sont pas des gadgets.

Vous pouvez imaginer de visualiser un stock avec ses emplacements.

V. REMERCIEMENTS

Je tiens à remercier Dolphy35 et Lou Pitchoun pour leurs corrections.

Je remercie aussi Arkahm46 pour sa superbe table qui m'a permis de vous montrer comment dessiner la carte de France.

Et enfin toute l'équipe de developpez.com pour ce remarquable site.

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

Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à l'obtention préalable de l'autorisation de l'auteur.