Intégrer un planning basé sur la classe de gestion d'images clGdiPlus

Date de publication : 01 août 2009

Par Denis Hulo
 

Intégrer dans votre projet Access un planning basé sur la classe de gestion d'images clGdiPlus.
Niveau requis : avancé.
Commentez cet article : 9 commentaires · Donner une note à l'article (5)

               Version PDF (Miroir)   Version hors-ligne (Miroir)

I. Introduction
II. La classe de gestion d'images clGdiPlus
III. La classe clPlanning
III-A. Les propriétés de paramétrage du planning
III-A-1. Row
III-A-2. Col
III-A-3. Rows
III-A-4. Cols
III-A-5. RowsHeight
III-A-6. ColsWidth
III-A-7. BackColor
III-A-8. GridColor
III-A-9. FieldsCols
III-A-10. FieldsColsWidth
III-A-11. FieldsColor
III-B. Les méthodes et propriétés d'initialisation de l'image
III-B-1. RefControleImage
III-B-2. InitImage
III-C. Les méthodes d'initialisation et d'actualisation du planning
III-C-1. Clear
III-C-2. Refresh
III-D. Les méthodes de dessin sur le planning
III-D-1. DrawRect
III-D-2. DrawText
III-D-3. DrawFieldText
III-E. La méthode pour identifier le rectangle à partir des coordonnées (X,Y)
III-E-1. GetRectXY
III-F. Les méthodes de sauvegarde et de restitution de l'image en mémoire
III-F-1. KeepImage
III-F-2. ResetImage
III-G. Comment ajouter une méthode à la classe
IV. Le module moPlanning
V. Le sous-formulaire sfPlanning
V-A. La procédure évènementielle sur chargement.
V-B. La procédure évènementielle sur fermeture
V-C. Le contrôle image imHeader
V-D. Le contrôle image imPlanning
V-D-1. La procédure évènementielle sur souris appuyée
V-D-2. La procédure évènementielle sur double-clic
V-E. Le nombre maximum de lignes du planning
VI. Le formulaire fPlanning
VI-A. Le bouton de commande cmTester
VI-A-1. La procédure évènementielle sur clic
VI-B. Le bouton de commande cmEffacer
VI-B-1. La procédure évènementielle sur clic
VI-C. Le contrôle sous-formulaire sfPlanning
VII. Exemple d'intégration du planning
VIII. Même procédé d'intégration d'un planning basé sur la classe clGdi32
IX. Les bases de données à télécharger
X. Remerciements


I. Introduction

L'objectif de cet article est de décrire la mise en place d'un planning basé sur la classe de gestion d'images clGdiPlus, dans un formulaire Access. Ce type de planning a l'avantage d'être très souple et peut être paramétré en VBA sur 1 semaine, quinze jours, 1 mois etc..., et peut comporter jusqu'à environ 100 lignes. Il pourra servir d'agenda ou de planning selon les besoins et être facilement intégré dans votre projet Access.

Pour ce faire, nous allons présenter par la suite les objets qui devront être ajoutés à votre projet Access. Enfin, pour illustrer cette technique, nous proposerons à la fin de l'article un exemple d'intégration du planning.


II. La classe de gestion d'images clGdiPlus

clGdiPlus est un module de classe VBA pour faciliter l'utilisation de la librairie graphique gdiplus.dll (Celle-ci n'est livrée qu'avec Windows XP, pour les autres versions de Windows vous pouvez la télécharger ici). clGdiPlus permet de gérer des images et de dessiner dans un contrôle image.


Ensuite insérer, pour votre projet, le contenu du fichier dans un module de classe nommé clGdiPlus.


III. La classe clPlanning

La classe clPlanning est basée sur la classe de gestion des images clGdiPlus. Elle permet de dessiner un planning dans un contrôle image : Dessin du quadrillage, des en-têtes de lignes et de colonnes, mais aussi des rectangles définissant les périodes sur le planning.

Intégrer alors le module de classe clPlanning de la base jointe à votre projet.

Vous pouvez bien sûr ajouter de nouvelles propriétés ou de nouvelles méthodes, ou encore modifier les propriétés existantes, si vous souhaitez inclure de nouvelles fonctionnalités à vos plannings. Nous donnerons à ce sujet un exemple simple d'ajout d'une méthode à la fin de cette section.


III-A. Les propriétés de paramétrage du planning

Ces propriétés vont permettre de paramétrer le planning au moment de sa création.


III-A-1. Row

Vous pouvez utiliser la propriété Row pour définir ou connaître la ligne sélectionnée sur le planning. Entier en lecture/écriture.

Exemple :

Le code suivant définit la ligne 3 comme ligne sélectionnée sur le planning.

obPlanning.Row=3

III-A-2. Col

Vous pouvez utiliser la propriété Col pour définir ou connaître la colonne sélectionnée sur le planning. Entier en lecture/écriture.

Exemple :

Le code suivant définit la colonne 3 comme colonne sélectionnée sur le planning.

obPlanning.Col=3

III-A-3. Rows

Vous pouvez utiliser la propriété Rows pour définir ou connaître le nombre de lignes du planning. Entier en lecture/écriture.

Exemple :

Le code suivant définit 30 lignes pour le planning.

obPlanning.Rows=30

III-A-4. Cols

Vous pouvez utiliser la propriété Cols pour définir ou connaître le nombre de colonnes du planning. Entier en lecture/écriture.

Exemple :

Le code suivant définit 7 colonnes pour le planning.

obPlanning.Cols=7

III-A-5. RowsHeight

Vous pouvez utiliser la propriété RowsHeight pour ajuster la hauteur des lignes du planning à des dimensions spécifiques. Entier en lecture/écriture.

Exemple :

Le code suivant ajuste la hauteur des lignes du planning à 25 twips.

obPlanning.RowsHeight=25

III-A-6. ColsWidth

Vous pouvez utiliser la propriété ColsWidth pour ajuster la largeur des colonnes du planning à des dimensions spécifiques. Entier en lecture/écriture.

Exemple :

Le code suivant ajuste la largeur des colonnes du planning à 125 twips.

obPlanning.ColsWidth=125

III-A-7. BackColor

Utiliser la propriété BackColor pour spécifier la couleur de fond du planning. Long en lecture/écriture.

Exemple :

Le code suivant colorie en blanc le fond du planning.

obPlanning.BackColor=vbWhite

III-A-8. GridColor

Vous pouvez utiliser la propriété GridColor pour spécifier la couleur du quadrillage du planning. Long en lecture/écriture.

Exemple :

Le code suivant colorie en noir la grille (les lignes) du planning.

obPlanning.GridColor=vbBlack

III-A-9. FieldsCols

Vous pouvez utiliser la propriété FieldsCols pour définir le nombre de colonnes pour les en-têtes de lignes situés à gauche du planning. Entier en lecture/écriture.

Exemple :

Le code suivant définit 2 colonnes à gauche du planning pour les en-têtes de lignes.

obPlanning.FieldsCols=2

III-A-10. FieldsColsWidth

Utiliser la propriété FieldsColsWidth pour ajuster la largeur des colonnes pour les en-têtes de lignes à des dimensions spécifiques. Entier en lecture/écriture.

Exemple :

Le code suivant ajuste la largeur des colonnes de gauche du planning (en-têtes de lignes) à 100 twips.

obPlanning.FieldsColsWidth=100

III-A-11. FieldsColor

Vous pouvez utiliser la propriété FieldsColor pour spécifier la couleur de fond pour les en-têtes de lignes situés à gauche du planning. Long en lecture/écriture.

Exemple :

Le code suivant colorie en gris les colonnes de gauche (en-têtes de lignes) du planning.

obPlanning.FieldsColor=vbGrey

III-B. Les méthodes et propriétés d'initialisation de l'image

Elles permettent de définir le contrôle sur lequel on va dessiner le planning et de préparer l'image pour qu'elle soit conforme aux dimensions du contrôle.


III-B-1. RefControleImage

Utiliser la propriété RefControleImage pour spécifier le contrôle image sur lequel on va dessiner le planning.

Exemple :

Le code suivant spécifie le contrôle image imPlanning du formulaire courant sur lequel on va dessiner le planning.

obPlanning.RefControleImage = Me.imPlanning

III-B-2. InitImage

Initialise et définit l'image pour qu'elle soit conforme aux dimensions du contrôle image.

Exemple :

Le code suivant initialise et définit l'image du planning pour qu'elle soit conforme aux dimensions du contrôle image imPlanning.

obPlanning.InitImage

III-C. Les méthodes d'initialisation et d'actualisation du planning


III-C-1. Clear

Cette méthode redessine le planning d'origine (quadrillage vide).

Extrait de son code :

Public Sub Clear()
Dim i As Integer, j As Integer
Dim l As Integer, w As Integer, h As Integer
Dim lReturn As Boolean

' Largeur totale des en-têtes de lignes (colonnes de gauche).
l = vFieldsCols * vFieldsColsWidth

' Largeur totale du planning sans les en-têtes de lignes.
w = vCols * vColsWidth

' Hauteur totale du planning sans les en-têtes de colonnes.
h = vRows * vRowsHeight

' Supprime toutes les régions du planning précédemment créées.
lReturn = obGdiP.DeleteAllRegions

' On dessine les rectangles du planning : le rectangle des en-têtes de lignes 
'  gauche du planning) en gris et le rectangle du planning en blanc.

lReturn = obGdiP.DrawRectangle(0, 0, l, h, vFieldsColor, vGridColor, 1)
lReturn = obGdiP.DrawRectangle(l, 0, l + w, h, vBackColor, vGridColor, 1)

' On dessine les lignes horizontales composant le planning.

For i = 1 To vRows
   lReturn = obGdiP.DrawLine(0, i * vRowsHeight, _ 
                             l + w, i * vRowsHeight, vGridColor, 1, False)
Next i

' On dessine les lignes verticales composant le planning.

For i = 1 To vFieldsCols
   lReturn = obGdiP.DrawLine(i * vFieldsColsWidth, 0, _ 
                             i * vFieldsColsWidth, h, vGridColor, 1, False)
Next i

For i = 1 To vCols
   lReturn = obGdiP.DrawLine(l + i * vColsWidth, _ 
                             0, l + i * vColsWidth, h, vGridColor, 1, False)
Next i

' Création des vRows*vCols régions; 
' chaque région portant le nom de ses indices de ligne et de colonne :
' Par exemple la région de ligne 5 et de colonne 3 portera le nom "5_3".

For i = 1 To vRows

For j = 1 To vCols
   lReturn = obGdiP.CreateRegionRect(i & "_" & j, l + (j - 1) * vColsWidth, _ 
             (i - 1) * vRowsHeight, l + j * vColsWidth - 1, i * vRowsHeight - 1)
Next j

Next i

End Sub

III-C-2. Refresh

Cette méthode met à jour le contrôle image en fonction des dernières modifications qui ont été apportées à l'objet associé obHeader ou obPlanning.

Cette procédure doit être appelée après chaque modification de l'objet obPlanning, instance de la classe clPlanning, afin d'actualiser le contrôle associé.

Exemple :

Le code suivant actualise le contrôle image imPlanning du sous-formulaire sfPlanning et redessine donc le planning sur ce contrôle.

obPlanning.refresh

III-D. Les méthodes de dessin sur le planning


III-D-1. DrawRect

Dessine un rectangle délimité par les coordonnées de début (Row1,Col1), correspondant à la région en haut à gauche, et les coordonnées de fin (Row2,Col2), correspondant à la région en bas à droite.

Paramètres :

Paramètre Type Explication
Row1,Col1,Row2,Col2 Integer Coordonnées du rectangle à dessiner sur le planning.
BackColor Long Couleur de remplissage. Mettre -1 pour un rectangle transparent.
PenColor Long Couleur de la ligne.
PenWidth Long Epaisseur de la ligne.

Exemple :

Le code suivant dessine un rectangle avec un fond bleu et une bordure noire sur la 1ère ligne, de la 1ère colonne à la 3ème colonne du planning.

obPlanning.DrawRect 1, 1, 1, 3, vbBlue, vbBlack, 1

III-D-2. DrawText

Cette méthode permet d'écrire du texte dans le rectangle délimité par les coordonnées de début (Row1,Col1), correspondant à la région en haut à gauche, et les coordonnées de fin (Row2,Col2), correspondant à la région en bas à droite.

Paramètre Type Explication
Row1,Col1,Row2,Col2 Integer Coordonnées du rectangle
Text String Texte à écrire. Peut contenir des retours à la ligne (vbCrLf).
TextSize Long Taille du texte en pixels.
AlignHoriz Long Alignement horizontal (0 : Gauche, 1 : Centre, 2 : Droite).
AlignVert Long Alignement vertical (0 : Haut, 1 : Centre, 2 : Bas).

Exemple :

Le code suivant écrit le texte "Dupont" dans le rectangle de coordonnées (1,1,1,3).

obPlanning.DrawText 1, 1, 1, 3, "DUPONT", 12, 0,0 vbBlue

III-D-3. DrawFieldText

Cette méthode permet d'écrire du texte dans le zone de coordonnées (Row,Col) et situé à gauche sur le planning (en-têtes de lignes).

Paramètre Type Explication
Row, Col Integer Coordonnées de la zone situé à gauche sur le planning.
Text String Texte à écrire. Peut contenir des retours à la ligne (vbCrLf).
TextSize Long Taille du texte en pixels.
AlignHoriz Long Alignement horizontal (0 : Gauche, 1 : Centre, 2 : Droite).
AlignVert Long Alignement vertical (0 : Haut, 1 : Centre, 2 : Bas).

Exemple :

Le code suivant écrit le texte "DWC" dans la zone située à gauche du planning et de coordonnées (1: 1ère ligne, 2: 2ème colonne).

obPlanning.DrawFieldText 1, 2, "DWC", 12, 0, 0, vbBlue

III-E. La méthode pour identifier le rectangle à partir des coordonnées (X,Y)


III-E-1. GetRectXY

Identifie le rectangle situé sur un point de coordonnées (X,Y).

Paramètres :

Paramètre Type Explication
X Long Position X du point sur le planning.
Y Long Position Y du point sur le planning.
Row1,Col1,Row2,Col2 Entier Coordonnées du rectangle.

Exemple :

Le code suivant renvoie en paramètres les coordonnées du rectangle situé sur le point de coordonnées (X,Y).

obPlanning.GetRectXY(CLng(X), CLng(Y), Row1, Col1, Row2, Col2) 

III-F. Les méthodes de sauvegarde et de restitution de l'image en mémoire

Ces méthodes sont utiles pour éviter d'avoir à redessiner la totalité du planning, juste avant de tracer le contour du rectangle sélectionné sur souris appuyée.


III-F-1. KeepImage

Cette méthode sauvegarde en mémoire l'image du planning.

Elle doit être appelée après avoir dessiné le planning et avant d'exécuter ResetImage.

Exemple :

Le code suivant copie en mémoire l'image du planning.

obPlanning.KeepImage

III-F-2. ResetImage

Cette méthode restitue l'image du planning sauvegardée en mémoire.

Elle permet de restituer l'image du planning juste avant de dessiner le contour du rectangle sélectionné.

Exemple :

Le code suivant rétablit l'image du planning de la mémoire.

obPlanning.ResetImage

III-G. Comment ajouter une méthode à la classe

Pour ceux qui souhaitent enrichir la classe de nouvelles propriétés ou de nouvelles méthodes pour ajouter des fonctionnalités au planning, je vous propose un exemple simple : ajouter une méthode pour colorier une colonne du planning, afin de prendre en compte les jours fériés.

Pour ce faire, il nous faut appeler la méthode DrawRect pour redessiner les petits rectangles sur la colonne choisie, ligne par ligne, et avec la couleur désirée. Le code devrait donc ressembler à celà :

Public Sub ColorCol(IndCol As Integer, BackColor As Long)
Dim IndRow As Integer ' Indice de ligne.

For IndRow = 1 To Rows
' Dessine à l'intersection entre la ligne IndRow et la colonne IndCol 
' un rectangle de couleur de fond BackColor.
DrawRect IndRow, IndCol, IndRow, IndCol, BackColor, vbBlack, 1

Next IndRow

End Sub
Ajouter le code à la suite des propriétés et méthodes, dans le module de classe clPlanning.


Exemple d'utilisation :

Le code suivant colorie la 16ème colonne du planning en rouge.

obPlanning.ColorCol 16, vbRed

IV. Le module moPlanning

Contient les variables publiques obHeader, obPlanning et dateDebut, ainsi que les procédures et fonctions pour manipuler le planning.

Intégrer ce module de la base jointe à votre projet et y ajouter vos propres procédures et fonctions de gestion du planning.

Extrait du module :

Option Compare Database

'****************************************************************************************
'*                                    PARTIE DECLARATIVE                                *
'****************************************************************************************

'----------------------------------------------------------------------------------------
' Ces 2 variables sont accessibles dans tout le projet.
' Une fois instanciées, elles permettent de paramétrer le planning, puis
' de dessiner par dessus.
'----------------------------------------------------------------------------------------
Public obHeader As clPlanning
Public obPlanning As clPlanning

'----------------------------------------------------------------------------------------
' La date du premier jour du planning correspondant à la 1ère colonne.
' Cette variable est accessible dans tout le projet.
'----------------------------------------------------------------------------------------
Public DateDebut As Date


'****************************************************************************************
'*                                    SUITE DU MODULE                                   *
'****************************************************************************************

'----------------------------------------------------------------------------------------
' Vous pouvez définir vos procédures et fonctions de gestion du planning à la suite.
' ...
'----------------------------------------------------------------------------------------

'----------------------------------------------------------------------------------------
' Exemple de code :
' Fonction de conversion d'un indice de colonne en son jour correpondant sur le planning.
'----------------------------------------------------------------------------------------
Public Function ConversionColonneVersJour(ByVal Colonne As Integer) As Date
ConversionColonneVersJour = (DateDebut + Colonne - 1)
End Function

'----------------------------------------------------------------------------------------
' Autre exemple de code :
' Fonction de conversion d'une date en indice de colonne correpondant sur le planning.
'----------------------------------------------------------------------------------------
Public Function ConversionJourVersColonne(ByVal Jour As Date) As Integer
ConversionJourVersColonne = (Jour - DateDebut + 1)
End Function

V. Le sous-formulaire sfPlanning

Ce sous-formulaire contient, dans l'en-tête du formulaire, le contrôle image imHeader pour afficher les en-têtes de colonnes, et le contrôle image imPlanning dans la section détail, pour afficher le planning et les en-têtes de lignes.


Ajouter ce sous-formulaire présent dans la base jointe à votre projet et paramétrer le planning avec vos propres valeurs.


V-A. La procédure évènementielle sur chargement.

Crée les instances de classes pour les en-têtes de colonnes (obHeader) et pour le planning (obPlanning), puis paramètre le planning et les en-têtes de colonnes avant de dessiner le planning sur les contrôles images du formulaire.

Définissez vous-même les paramètres de votre planning.

Private Sub Form_Load()

' Création des instances de classes pour les en-têtes de colonnes (obHeader)
' et pour le planning (obPlanning).

Set obHeader = New clPlanning
Set obPlanning = New clPlanning

' Spécification du contrôle image imHeader sur lequel on va dessiner les en-têtes de colonnes. 
' Puis, initialisation de l'image et affectation des paramètres pour les en-têtes de colonnes.
     
   With obHeader
      .RefControleImage = Me.imHeader
      .InitImage
      .FieldsCols = 2
      .FieldsColsWidth = 70
      .FieldsColor = -2147483633
      .Rows = 1
      .RowsHeight = 25
      .Cols = 31
      .ColsWidth = 27
      .BackColor = -2147483633
   End With
 
' Spécification du contrôle image imPlanning sur lequel on va dessiner le planning. 
' Puis, initialisation de l'image et affectation des paramètres pour le planning.
   
   With obPlanning
      .RefControleImage = Me.imPlanning
      .InitImage
      .FieldsCols = 2
      .FieldsColsWidth = 70
      .Rows = 40
      .Cols = 31
      .ColsWidth = 27
   End With

' On dessine les en-têtes et le planning sur les contrôles images.

obHeader.Clear
obHeader.Refresh

obPlanning.Clear
obPlanning.Refresh

End Sub

V-B. La procédure évènementielle sur fermeture

Sur fermeture du sous-formulaire on libère les variables publiques obHeader et obPlanning.

Private Sub Form_Close()
' On libère les variables.

Set obHeader = Nothing
Set obPlanning = Nothing

End Sub

V-C. Le contrôle image imHeader

Contrôle sur lequel on va dessiner les en-têtes de colonnes.


V-D. Le contrôle image imPlanning

Contrôle sur lequel on va dessiner le planning proprement dit.


V-D-1. La procédure évènementielle sur souris appuyée

Identifie la ligne et la colonne correspondant à la région sélectionnée sur le planning et dessine un cadre autour de cette région.

Private Sub imPlanning_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
' Indices de lignes et de colonnes pour le rectangle du planning.
Dim Row1 As Integer, Col1 As Integer, Row2 As Integer, Col2 As Integer 

' Identifie les coordonnées du rectangle situé sur le point (X,Y).
obPlanning.GetRectXY CLng(X), CLng(Y), Row1, Col1, Row2, Col2

   If (Row1 > 0) Then ' Si un rectangle existe.
                          
      obPlanning.ResetImage ' Restitue l'image du planning sauvegardée en mémoire.
                          
      ' Dessine un cadre autour du rectangle de coordonnées (Row1,Col1,Row2,Col2).
      obPlanning.DrawRect Row1, Col1, Row2, Col2, -1, vbBlack, 2
      obPlanning.Refresh
      
   End If

End Sub

V-D-2. La procédure évènementielle sur double-clic

On récupère ici les indices de ligne et de colonne sélectionnées sur souris appuyée. L'indice de colonne va nous permettre de connaître, grâce à une fonction de conversion, le jour correspondant sur le planning. Placer ici le code pour ouvrir un formulaire de saisie en fonction de la zone sélectionnée.

Private Sub imPlanning_DblClick(Cancel As Integer)  
    
   ' S'il y a bien une zone sélectionnée sur le planning. 
   If (obPlanning.Row > 0) And (obPlanning.Col > 0) Then
      ' Exemple de code : 
      ' Jour = ConversionColonneVersJour(obPlanning.Col)
      ' DoCmd.OpenForm "F_Saisie"... 
   End If

End Sub

V-E. Le nombre maximum de lignes du planning

Cette valeur est conditionnée par la hauteur maximum de l'image et donc du sous-formulaire sfplanning, soit 22 inches ou 55.873cm.

Comme les paramètres du planning sont donnés en pixels, nous allons donc utiliser cette mesure pour le calcul du nombre maximum de lignes :

Par définition 1 inch = 96 pixels donc la hauteur maximum du sous-formulaire est de 22 inches = 22*96 pixels = 2112 pixels.

Par conséquent, pour une hauteur de ligne de 25 pixels on pourra afficher au maximum 2112/25 = 84,48, soit 84 lignes pleines au maximum, et avec une hauteur de ligne de 20 pixels on pourra afficher sur le planning 2112/20 = 105,6, soit 105 lignes au maximum.

En conclusion, on dispose d'une centaine de lignes au plus pour notre planning, cela nous laisse donc de la marge.


VI. Le formulaire fPlanning

Ce formulaire va servir de test pour dessiner des rectangles horizontaux sur le planning. Il intègre le sous-formulaire sfPlanning, un bouton de commande cmTester pour tester le planning, et un autre cmEffacer pour vider le planning.

Aperçu du formulaire fPlanning.

VI-A. Le bouton de commande cmTester

Ce bouton permet de tester le planning.


VI-A-1. La procédure évènementielle sur clic

Elle met à jour les en-têtes de colonnes et le planning avec quelques données exemples :

Private Sub cmTester_Click()
Dim i As Integer
Dim DateJ As Date
Dim Col1 As Integer, Col2 As Integer ' Indices de colonnes sur le planning.

' Met à jour les en-têtes de colonnes avec les 31 jours du mois de janvier par exemple.

obHeader.DrawFieldText 1, 1, "NCh.", 12, 0, 1
obHeader.DrawFieldText 1, 2, "TCh.", 12, 0, 1

DateDebut = CDate("01/01/2009")
DateJ = DateDebut

For i = 1 To 31
obHeader.DrawText 1, i, 1, i, Day(DateJ), 12, 1, 1, vbBlack, False
DateJ = DateJ + 1
Next i


' Ecrit du texte dans les en-têtes de la ligne 1.

obPlanning.DrawFieldText 1, 1, "001", 12, 0, 1
obPlanning.DrawFieldText 1, 2, "DWC", 12, 0, 1

' Dessine 1 rectangle d'une couleur donnée sur la 1ère ligne du planning.

' Conversion de la date de début en indice de colonne.
Col1 = ConversionJourVersColonne(CDate("01/01/2009"))
' Conversion de la date de fin en indice de colonne.
Col2 = ConversionJourVersColonne(CDate("03/01/2009"))
' Dessine le rectangle correspondant.
obPlanning.DrawRect 1, Col1, 1, Col2, vbMagenta, obPlanning.GridColor, 1
obPlanning.DrawText 1, Col1, 1, Col2, "DUPONT", 12, 1, 1, vbBlack, False


' Ecrit du texte dans les en-têtes de la ligne 2.

obPlanning.DrawFieldText 2, 1, "002", 12, 0, 1
obPlanning.DrawFieldText 2, 2, "BWC", 12, 0, 1

' Dessine 1 rectangle d'une couleur donnée sur la 2ème ligne du planning.

' Conversion de la date de début en indice de colonne.
Col1 = ConversionJourVersColonne(CDate("03/01/2009"))
' Conversion de la date de fin en indice de colonne.
Col2 = ConversionJourVersColonne(CDate("06/01/2009"))
' Dessine le rectangle correspondant.
obPlanning.DrawRect 2, Col1, 2, Col2, vbGreen, obPlanning.GridColor, 1
obPlanning.DrawText 2, Col1, 2, Col2, "DURAND", 12, 1, 1, vbBlack, False


' Raffraichit les contrôles images.

obPlanning.KeepImage

obHeader.Refresh
obPlanning.Refresh

End Sub

VI-B. Le bouton de commande cmEffacer

Ce bouton permet d'effacer le contenu du planning.


VI-B-1. La procédure évènementielle sur clic

Elle efface le contenu des contrôles images et redessine le planning sur ces contrôles :

Private Sub cmEffacer_Click()

' Efface le contenu du planning.

obHeader.Clear
obHeader.Refresh

obPlanning.Clear
obPlanning.Refresh

End Sub

VI-C. Le contrôle sous-formulaire sfPlanning

Ce contrôle sous-formulaire a pour objet source le formulaire sfPlanning, qui contient le contrôle image imHeader, pour afficher les en-têtes de colonnes, et le contrôle image imPlanning, pour afficher le planning et les en-têtes de lignes.


VII. Exemple d'intégration du planning

Intégration d'un planning mensuel dans une application pour la gestion des réservations dans un hôtel :

Aperçu du planning mensuel.

La base de données pour la gestion des réservations est au format Access 2000.


VIII. Même procédé d'intégration d'un planning basé sur la classe clGdi32

L'objectif de cette section est de décrire brièvement la mise en place d'un planning basé sur la classe de gestion d'images clGdi32, dans un formulaire Access. Cette classe facilite l'utilisation de la librairie graphique gdi32.dll (Celle-ci a l'avantage d'être disponible sur tous les systèmes Windows. Si malgré tout elle n'est pas présente sur votre ordinateur ou endommagée, vous pouvez la télécharger ici).

Il vous faut alors ajouter à votre projet, comme pour la méthode précédente, les classes clGdi32 et clPlanning32, le module moPlanning, le sous-formulaire sfPlanning et enfin le formulaire fPlanning, tous présents dans la base jointe.


IX. Les bases de données à télécharger

La base jointe n°1 utilise GdiPlus et est au format Access 2000.

La base jointe n°2 utilise Gdi32 et est au format Access 2000.


X. Remerciements

Je tiens à remercier Arkham46 et toute l'équipe Office pour m'avoir guidé dans la réalisation de cette article, ainsi que jacques_jean pour sa relecture.



               Version PDF (Miroir)   Version hors-ligne (Miroir)

Valid XHTML 1.0 TransitionalValid CSS!

Copyright © 2009 Denis Hulo. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts. Cette page est déposée à la SACD.

Vos questions techniques : forum d'entraide Access - Publiez vos articles, tutoriels et cours
et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones
Nous contacter - Hébergement - Participez - Copyright © 2000-2010 www.developpez.com - Legal informations.