Vous êtes sur la page 1sur 29

Apprendre à Ecrire et Dessiner

dans les états Access

Par Philippe JOCHMANS

Date de publication : 1 novembre 2007

Dernière mise à jour : 7 novembre 2007

Ce tutorial a pour but de vous apprendre les différentes méthodes pour écrire et dessiner
dans les états Access.
Apprendre à Ecrire et Dessiner dans les états Access par Philippe JOCHMANS

I - INTRODUCTION..................................................................................................................................................... 3
II - LES INSTRUCTIONS POUR ECRIRE ET DESSINER......................................................................................... 3
II-A - Les procédures évènementielles dans les états...........................................................................................3
II-B - Suite logique des procedures....................................................................................................................... 4
II-C - Les Sections................................................................................................................................................. 4
II-C-1 - Détail.....................................................................................................................................................4
II-C-2 - Entête et Pied de pages...................................................................................................................... 4
II-C-3 - Entête et Pied d'Etat............................................................................................................................ 4
II-C-4 - Entête et Pied de Groupe.................................................................................................................... 5
II-D - Les évènements............................................................................................................................................5
II-D-1 - Page..................................................................................................................................................... 5
II-D-2 - Format.................................................................................................................................................. 5
II-D-3 - Print...................................................................................................................................................... 5
II-D-4 - Retreat.................................................................................................................................................. 5
II-E - Les coordonnées dans un Etat.....................................................................................................................5
II-E-1 - Origine.................................................................................................................................................. 5
II-E-2 - Unités....................................................................................................................................................6
II-E-3 - Les dimensions : ScaleWidth et ScaleHeight.......................................................................................6
II-E-4 - ScaleTop et ScaleLeft...........................................................................................................................7
II-F - Ecrire............................................................................................................................................................. 7
II-F-1 - Print.......................................................................................................................................................7
II-F-2 - Police.................................................................................................................................................... 8
II-F-3 - Positionnement : CurrentX, CurrentY................................................................................................... 8
II-F-4 - Récupérer la taille du texte : TextWidth et TextHeight......................................................................... 9
II-G - Dessiner........................................................................................................................................................ 9
II-G-1 - Largeur des traits : DrawWidth............................................................................................................ 9
II-G-2 - Type de traits : DrawStyle..................................................................................................................10
II-G-3 - Remplissage : Fillstyle........................................................................................................................10
II-G-4 - Les couleurs : FillColor...................................................................................................................... 11
II-G-5 - Le mode de dessin : DrawMode........................................................................................................12
II-G-6 - Line.....................................................................................................................................................15
II-G-7 - Circle.................................................................................................................................................. 17
II-G-8 - PSet....................................................................................................................................................18
III - EXEMPLES......................................................................................................................................................... 18
III-A - Rectangles au coin arrondi........................................................................................................................ 19
III-A-1 - Le rectangle simple........................................................................................................................... 19
III-A-2 - Le rectangle générique......................................................................................................................20
III-B - Mettre en évidence une donnée................................................................................................................ 22
III-B-1 - En le mettant en surbrillance............................................................................................................ 22
III-B-2 - En l'entourant d'une ellipse............................................................................................................... 23
III-C - Dégradés....................................................................................................................................................23
III-D - La carte de France.................................................................................................................................... 24
III-E - Les champs auto extensibles.................................................................................................................... 27
IV - CONCLUSION.................................................................................................................................................... 28
V - REMERCIEMENTS..............................................................................................................................................28

-2-
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.
http://starec.developpez.com//tuto/ecriredessineretats/
Apprendre à Ecrire et Dessiner dans les états Access par Philippe JOCHMANS

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.

-3-
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.
http://starec.developpez.com//tuto/ecriredessineretats/
Apprendre à Ecrire et Dessiner dans les états Access par Philippe JOCHMANS

Procédure Report Détail Entête et Entête et Entête et


Pied de Pied d'Etat Pied de
Pages 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.

-4-
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.
http://starec.developpez.com//tuto/ecriredessineretats/
Apprendre à Ecrire et Dessiner dans les états Access par Philippe JOCHMANS

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).

-5-
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.
http://starec.developpez.com//tuto/ecriredessineretats/
Apprendre à Ecrire et Dessiner dans les états Access par Philippe JOCHMANS

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
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
Private Sub ZoneEntêtePage_Format(Cancel As Integer, FormatCount As Integer)

-6-
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.
http://starec.developpez.com//tuto/ecriredessineretats/
Apprendre à Ecrire et Dessiner dans les états Access par Philippe JOCHMANS

VBA
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
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
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
Private Sub ZoneEntêtePage_Format(Cancel As Integer, FormatCount As Integer)
Me.Print "Bienvenue ",
Me.Print "sur DVP"

-7-
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.
http://starec.developpez.com//tuto/ecriredessineretats/
Apprendre à Ecrire et Dessiner dans les états Access par Philippe JOCHMANS

VBA
End Sub

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

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

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

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

II-F-2 - Police

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

VBA
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.

-8-
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.
http://starec.developpez.com//tuto/ecriredessineretats/
Apprendre à Ecrire et Dessiner dans les états Access par Philippe JOCHMANS

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
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
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é.

-9-
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.
http://starec.developpez.com//tuto/ecriredessineretats/
Apprendre à Ecrire et Dessiner dans les états Access par Philippe JOCHMANS

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
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

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

- 10 -
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.
http://starec.developpez.com//tuto/ecriredessineretats/
Apprendre à Ecrire et Dessiner dans les états Access par Philippe JOCHMANS

• 7- Diagonales croisées

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

VBA
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

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
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

- 11 -
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.
http://starec.developpez.com//tuto/ecriredessineretats/
Apprendre à Ecrire et Dessiner dans les états Access par Philippe JOCHMANS

VBA
' 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

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
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

- 12 -
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.
http://starec.developpez.com//tuto/ecriredessineretats/
Apprendre à Ecrire et Dessiner dans les états Access par Philippe JOCHMANS

VBA
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.

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

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

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

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

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

- 13 -
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.
http://starec.developpez.com//tuto/ecriredessineretats/
Apprendre à Ecrire et Dessiner dans les états Access par Philippe JOCHMANS

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

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

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

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

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

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

- 14 -
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.
http://starec.developpez.com//tuto/ecriredessineretats/
Apprendre à Ecrire et Dessiner dans les états Access par Philippe JOCHMANS

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

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

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

16 - Crayon blanc

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 :

- 15 -
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.
http://starec.developpez.com//tuto/ecriredessineretats/
Apprendre à Ecrire et Dessiner dans les états Access par Philippe JOCHMANS

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.

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.

- 16 -
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.
http://starec.developpez.com//tuto/ecriredessineretats/
Apprendre à Ecrire et Dessiner dans les états Access par Philippe JOCHMANS

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
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

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

VBA
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

- 17 -
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.
http://starec.developpez.com//tuto/ecriredessineretats/
Apprendre à Ecrire et Dessiner dans les états Access par Philippe JOCHMANS

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
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

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.

- 18 -
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.
http://starec.developpez.com//tuto/ecriredessineretats/
Apprendre à Ecrire et Dessiner dans les états Access par Philippe JOCHMANS

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
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 :

- 19 -
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.
http://starec.developpez.com//tuto/ecriredessineretats/
Apprendre à Ecrire et Dessiner dans les états Access par Philippe JOCHMANS

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
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

- 20 -
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.
http://starec.developpez.com//tuto/ecriredessineretats/
Apprendre à Ecrire et Dessiner dans les états Access par Philippe JOCHMANS

VBA
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.

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
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 :

- 21 -
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.
http://starec.developpez.com//tuto/ecriredessineretats/
Apprendre à Ecrire et Dessiner dans les états Access par Philippe JOCHMANS

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

VBA
' 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 :

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
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

- 22 -
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.
http://starec.developpez.com//tuto/ecriredessineretats/
Apprendre à Ecrire et Dessiner dans les états Access par Philippe JOCHMANS

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
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

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.

- 23 -
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.
http://starec.developpez.com//tuto/ecriredessineretats/
Apprendre à Ecrire et Dessiner dans les états Access par Philippe JOCHMANS

VBA
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
Private Sub Report_Page()
Call Degrade(Me, 500, 200, 2000, 2000, 255)
End Sub

Et visuellement :

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
Private Sub Report_Page()
' ======================================================================================
' Procedure : Module :Report_rpt_Carte // Procédure : Report_Page
' DateTime : 05/11/2007 19:35

- 24 -
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.
http://starec.developpez.com//tuto/ecriredessineretats/
Apprendre à Ecrire et Dessiner dans les états Access par Philippe JOCHMANS

VBA
' 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
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

- 25 -
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.
http://starec.developpez.com//tuto/ecriredessineretats/
Apprendre à Ecrire et Dessiner dans les états Access par Philippe JOCHMANS

VBA
' ===== 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 :

- 26 -
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.
http://starec.developpez.com//tuto/ecriredessineretats/
Apprendre à Ecrire et Dessiner dans les états Access par Philippe JOCHMANS

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.

- 27 -
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.
http://starec.developpez.com//tuto/ecriredessineretats/
Apprendre à Ecrire et Dessiner dans les états Access par Philippe JOCHMANS

Comme on le voit, graphiquement cela est horrible.

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

VBA
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 :

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.

- 28 -
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.
http://starec.developpez.com//tuto/ecriredessineretats/
Apprendre à Ecrire et Dessiner dans les états Access par Philippe JOCHMANS

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.

- 29 -
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.
http://starec.developpez.com//tuto/ecriredessineretats/

Vous aimerez peut-être aussi