Ce code est un ensemble de petites procédures utilisant le contrôle MSHFlexGrid sous VB6. Cette grille MSHFlexGrid s'apparente à une grille comme celle que l'on peut voir dans une feuille Excel. Son utilisation n'étant pas si simple, j'ai publié ces quelques bouts de codes en pensant que cela peut être un bon point de départ si vous souhaitez l'utiliser.
Source / Exemple :
MSHFlexGrid : grille de données sous VB6
--> ici la MSHFlexGrid a été nommée Grille ( tout simplement )
1) Fonction à utiliser pour la mise à jour de la grille
' Cette fonction permet de traiter les données plus facilement
Function faIndex(row As Integer, col As Integer) As Long
faIndex = row * Grille.Cols + col
End Function
2) Gestion de l?apparence d?une Grille de 21 lignes et 5 colonnes :
' Largeur de la Grille
Grille.Width = 4120
'? Largeur des colonnes de la Grille ( ici la Grille comporte 5 colonnes )
Grille.ColWidth(0) = 500
Grille.ColWidth(1) = 1400
Grille.ColWidth(2) = 1400
Grille.ColWidth(3) = 500
Grille.ColWidth(4) = 0
' Numéros de lignes de la Grille ( ici la Grille comporte 21 lignes )
For X = 1 To 20
Grille.row = X
Grille.col = 0
Grille.CellAlignment = flexAlignRightTop
Grille.TextArray(faIndex(Grille.row, Grille.col)) = X
Next X
' Indique les titres de la Grille
Grille.row = 0
Grille.col = 0
Grille.CellAlignment = flexAlignCenterTop
Grille.TextArray(faIndex(Grille.row, Grille.col)) = "Ligne"
Grille.row = 0
Grille.col = 1
Grille.CellAlignment = flexAlignCenterTop
Grille.TextArray(faIndex(Grille.row, Grille.col)) = "Champs table"
Grille.row = 0
Grille.col = 2
Grille.CellAlignment = flexAlignCenterTop
Grille.TextArray(faIndex(Grille.row, Grille.col)) = "Variables"
Grille.row = 0
Grille.col = 3
Grille.CellAlignment = flexAlignCenterTop
Grille.TextArray(faIndex(Grille.row, Grille.col)) = "N-S"
' Apparence de départ de la grille
Grille.Enabled = False ' ou True si on veut qu?elle soit active à l'ouverture
' Voir QbColor pour les codes de couleur
Grille.BackColorBkg = QBColor(8) ' 8 = Couleur grise
Grille.BackColorFixed = QBColor(8) ' 8 = Couleur grise
Grille.BackColorSel = QBColor(8) ' 8 = Couleur grise
' Supprime la sélection par colonne ou par ligne
Grille.AllowBigSelection = False
3) Mise à jour des données dans la grille ( à placer sur l'évènement KeyPress ) :
Private Sub Grille_KeyPress(KeyAscii As Integer)
Dim C As Integer, R As Integer
' Désactive le clignotement du contrôle
Grille.Redraw = False
' Repère la cellule active
R = Grille.RowSel
C = Grille.ColSel
' Valide la saisie au clavier
If KeyAscii = 27 Then
Grille.TextArray(faIndex(R, C)) = ""
ElseIf Grille.TextArray(faIndex(R, C)) <> "" And KeyAscii = 8 Then
Grille.TextArray(faIndex(R, C)) = Mid(Grille.TextArray(faIndex(R, C)), 1, Len(Grille.TextArray(faIndex(R, C))) - 1)
ElseIf Grille.TextArray(faIndex(R, C)) <> "" And KeyAscii = 13 Then
Grille.TextArray(faIndex(R, C)) = Grille.TextArray(faIndex(R, C)) & Chr(10) & Chr(KeyAscii)
Else
Grille.TextArray(faIndex(R, C)) = Grille.TextArray(faIndex(R, C)) & Chr(KeyAscii)
End If
' Replace le clignotement du contrôle
Grille.Redraw = True
End Sub
' Une autre méthode... :
Dim strTexte
strTexte = MSFlexGrid1.Text
If KeyAscii = 8 Then
'Touche d?effacement
If Len(strTexte) > 0 Then MSFlexGrid1.Text = Left(strTexte, Len(strTexte) - 1)
ElseIf KeyAscii <> 13 Then
MSFlexGrid1.Text = strTexte & Chr(KeyAscii)
End If
4) Repérer la cellule active dans la grille :
Private Sub Grille_EnterCell()
Dim iRow, iCol As Integer
' Coordonnées de la cellule active
iRow = Grille.row
iCol = Grille.col
' Réinitialise les cellules ( fond blanc )
For X = 1 To 20
For Y = 1 To 4
Grille.row = X
Grille.col = Y
Grille.CellBackColor = QBColor(15) ' Couleur blanche
Next Y
Next X
' Repérage de la cellule active ( fond jaune )
Grille.row = iRow
Grille.col = iCol
Grille.FocusRect = flexFocusHeavy ' Double trait autour de le cellule active
'Grille.FocusRect = flexFocusLight ' Simple trait autour de le cellule active
Grille.CellBackColor = QBColor(14) ' Couleur jaune
End Sub
' Réinitialise les cellules de la grille lorsqu'on passe à un autre contrôle
Private Sub Grille_LostFocus()
' Réinitialise les cellules ( fond blanc )
For X = 1 To 20
For Y = 1 To 4
Grille.row = X
Grille.col = Y
Grille.CellBackColor = QBColor(15) ' Couleur blanche
Next Y
Next X
End Sub
5) N'autoriser la sélection que d'une seule ligne dans une MSFlexgrid :
Private Sub MSFlexGrid1_SelChange()
MSFlexGrid1.RowSel = MSFlexGrid1.Row
End Sub
6) Modifier la largeur des colonnes d'une MSFlexgrid en fonction de la longueur du texte :
Copiez ce code dans un module standard :
Private Type Size
cx As Long
cy As Long
End Type
Private Declare Function GetTextExtentPoint32 Lib "gdi32" Alias "GetTextExtentPoint32A" _
(ByVal hdc As Long, ByVal lpsz As String, _
ByVal cbString As Long, lpSize As Size) As Long
Public Sub ResizeColumns(hdc As Long, flexgrid As MSFlexGrid)
Dim idxRow As Long, idxCol As Long, lngMax As Long
Dim texte As String, taille As Size
With flexgrid
' Parcoure les colonnes
For idxCol = 0 To .Cols - 1
lngMax = 0
' Parcoure les lignes
For idxRow = 0 To .Rows - 1
texte = .TextMatrix(idxRow, idxCol)
' Met la taille du texte de la cellule en pixels dans taille
GetTextExtentPoint32 hdc, texte, Len(texte), taille
' lngMax est la longueur du texte le plus long dans cette colonne
If taille.cx > lngMax Then lngMax = taille.cx
Next
' Met lngMax en twips en ajoutant 10 pixels pour les marges
If lngMax > 0 Then lngMax = (lngMax + 10) * Screen.TwipsPerPixelX
' Applique la largeur de colonne si besoin
If lngMax > .ColWidth(idxCol) Then .ColWidth(idxCol) = lngMax
Next
End With
End Sub
Voici comment appeler la procédure ResizeColumns :
vb ResizeColumns Me.hdc, MSFlexGrid1
La procédure attend un contexte de périphérique en premier paramètre. Le contexte de périphérique est renvoyé par la propriété hdc. Si la form et la MSFlexGrid ont la même police, vous pouvez passer le contexte de périphérique de la form. Sinon vous pouvez ajouter un PictureBox invisible qui aura la même police que celle de la MSFlexgrid et passer sa propriété hdc en premier paramètre.
7) Exporter le contenu d'une msflexgrid dans un fichier :
Cette fonction exporte le contenu de la msflexgrid passée en paramètre dans le fichier strFileName.
Les colonnes sont séparées par le caractère passé dans le troisième paramètre.
Public Function ExportGridToFile(Mygrid As MSFlexGrid, Byval strFileName as string, _
Optional ByVal strSep As String = vbTab) As Boolean
Dim intFreeFile As Integer ' Numéro du fichier
Dim intCol As Integer, intRow As Integer ' Indices de ligne et colonne de W
Dim ligne As String ' La ligne à écrire dans le fichier
' Gestion des éventuelles erreurs
On Error GoTo ExportGridToFile_ERR
' Prend le prochain numéro de fichier
intFreeFile = FreeFile
' Ouvre le fichier en bloquant son accès aux autres applications
Open strFileName For Output Access Write Lock Read Write As #intFreeFile
With Mygrid
' Pour chaque ligne
For intRow = .FixedRows To .Rows - 1
ligne = ""
' Pour chaque colonne
For intCol = .FixedCols To .Cols - 1
' Ajoute la valeur de la cellule
ligne = ligne & .TextMatrix(intRow, intCol) & strSep
Next intCol
' Enlève le séparateur final
If strSep <> "" Then ligne = Left(ligne, Len(ligne) - 1)
Print #intFreeFile, ligne
Next intRow
End With
' Valide le bon fonctionnement de la fonction
ExportGridToFile = True
ExportGridToFile_FIN:
Close #intFreeFile + 1
Exit Function
ExportGridToFile_ERR:
ExportGridToFile = False
Resume ExportGridToFile_FIN
End Function
8) Constantes pour CellAlignment ( propriété de MSHFlexGrid ) :
Constante Valeur Description
--------------------------------------------------------------------------------
flexAlignLeftTop 0 Le contenu de la cellule est aligné à gauche, en haut.
flexAlignLeftCenter 1 Le contenu de la cellule est aligné à gauche, au centre.
Il s?agit de la valeur par défaut pour les chaînes.
flexAlignLeftBottom 2 Le contenu de la cellule est aligné à gauche, en bas.
flexAlignCenterTop 3 Le contenu de la cellule est centré, en haut.
flexAlignCenterCenter 4 Le contenu de la cellule est centré, au centre.
flexAlignCenterBottom 5 Le contenu de la cellule est centré, en bas.
flexAlignRightTop 6 Le contenu de la cellule est aligné à droite, en haut.
flexAlignRightCenter 7 Le contenu de la cellule est aligné à droite, au centre.
Il s?agit de la valeur par défaut pour les chiffres.
flexAlignRightBottom 8 Le contenu de la cellule est aligné à droite, en bas.
flexAlignGeneral 9 Le contenu de la cellule est aligné de manière courante.
Il s?agit de « à gauche, au centre » pour les chaînes et « à droite,
au centre » pour les chiffres.
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.