Problème Scrollbar et Mshflexgrid

cs_allfab Messages postés 76 Date d'inscription mercredi 28 avril 2004 Statut Membre Dernière intervention 25 juillet 2005 - 22 juil. 2005 à 10:04
cs_allfab Messages postés 76 Date d'inscription mercredi 28 avril 2004 Statut Membre Dernière intervention 25 juillet 2005 - 26 juil. 2005 à 09:37
Bonjour à tous,

J'écris ce message parce que j'ai un petit problème lorsque je saisis
des données dans une mshflexgrid. J'utilise la méthode de placer une
textbox en lieu et place de la case sélectionnée sur la mshflexgrid.
Cette méthode fonctionne très bien du moment où l'on ne touche pas à la
scrollbar de la mshflexgrid. Le problème est que j'ai besoin de bcp de
ligne....et quand je touche à la scrollbar pour avoir accès au ligne du
bas, la surbrillance pour sélectionner la case désiré ne marche plus et
je n'ai pas accès aux cases.



J'ai ces lignes de codes : Avec Panneau = name de ma mshflexgrid.



Private Const COLOR_FIXED As Long = &H524132

Private Const COLOR_BODY As Long = &H705F50

Private Const COLOR_HIGHLIGHT As Long = &HA78500



Private IndexR As Integer

Private IndexC As Integer

Private oldR As Integer

Private oldC As Integer



Private Enum EVT

EVT_CLICK = 1

EVT_TABPRESS = 2

EVT_RETURNPRESS = 3

EVT_ESCAPEPRESS = 4

End Enum



Private Sub Form_Load()

Dim R As Long



oldC = 0

oldR = 1



'Les propriétés suivantes doivent être desactivées

'afin de gérer manuellement la surbrillance

Panneau.HighLight = flexHighlightNever

Panneau.FocusRect = flexFocusNone

'Panneau.ScrollBars = flexScrollBarNone Je neutralise cette fct car je veux plusieurs lignes



'On fixe le nombres de ligne à 15

Panneau.Rows = 15



'Reglage de la hauteur des lignes

Panneau.RowHeight(0) = 320

For R = 1 To Panneau.Rows - 1

Panneau.RowHeight(R) = 280

Next R



'Taille des colonnes

Panneau.ColWidth(0) = 1500

Panneau.ColWidth(1) = 1500

Panneau.ColWidth(2) = 1500

Panneau.ColWidth(3) = 3000



'Alignement

Panneau.ColAlignmentFixed(0) = flexAlignCenterCenter

Panneau.ColAlignmentFixed(1) = flexAlignCenterCenter

Panneau.ColAlignmentFixed(2) = flexAlignCenterCenter

Panneau.ColAlignmentFixed(3) = flexAlignCenterCenter



'Titre des colonnes

Panneau.TextMatrix(0, 0) = "Arbre"

Panneau.TextMatrix(0, 1) = "Fruit"

Panneau.TextMatrix(0, 2) = "Propriétaire"

Panneau.TextMatrix(0, 3) = "Commentaire"



'La couleur du fond de la forme est identique à celui du panneau

BackColor = Panneau.BackColorBkg



'Petit texte explicatif

Label1.Caption = _


" RETURN - Valider la saisie" & vbCrLf & _


" ESCAPE - Annuler la saisie" & vbCrLf & _


" TAB - Valider et passer à la cellule
suivante"



Charger

End Sub



Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)

Enregistrer

End Sub



Private Sub Form_Resize()

On Error Resume Next



Panneau.Height = Label1.Top - Panneau.Top - 200

Panneau.Width = Me.Width - Panneau.Left

End Sub





Private Sub Panneau_Click()

'La gestion de l'évènement Click passe par la function EvtTextEditor

If IndexR < Panneau.FixedRows Then Exit Sub

If IndexC < Panneau.FixedCols Then Exit Sub



EvtTextEditor EVT_CLICK

End Sub



Private Sub Panneau_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)

'Gestion de la surbrillance

'La cellule active est repérée par le systeme de coordonnees (IndexR,IndexC)

'On supprime la surbrillance de l'ancienne cellule active

'La nouvelle cellule active est mise en surbrillance



IndexR = GetRow(y)

IndexC = GetCol(x)



If IndexR < Panneau.FixedRows Then Exit Sub

If IndexC < Panneau.FixedCols Then Exit Sub



If oldR <> IndexR Or oldC <> IndexC Then

Panneau.Row = oldR

Panneau.Col = oldC

Panneau.CellBackColor = COLOR_BODY



oldR = IndexR

oldC = IndexC



Panneau.Row = oldR

Panneau.Col = oldC

Panneau.CellBackColor = COLOR_HIGHLIGHT

End If

End Sub



Private Sub TextEditor_KeyPress(KeyAscii As Integer)

'La gestion de l'évènement KeyPress passe par la function EvtTextEditor

If KeyAscii = vbKeyReturn Then EvtTextEditor EVT_RETURNPRESS

If KeyAscii = vbKeyEscape Then EvtTextEditor EVT_ESCAPEPRESS

If KeyAscii = vbKeyTab Then EvtTextEditor EVT_TABPRESS

End Sub



Private Function EvtTextEditor(E As EVT)

' Le coeur du programme cette fonction permet de gérer le TextBox TextEditor

' S'il n'est possible de tapper du texte dans une cellule du flexgrid,

' il est en revanche possible de le faire dans un TextBox

' L'astuce est simple surimposer un textBox devant la cellule du Flexgrid

' à saisir.



Static R As Integer

Static C As Integer



Select Case E

Case EVT_CLICK

If TextEditor.Visible Then MAJPanneau R, C

R = IndexR

C = IndexC

displayTextEditor R, C



Case EVT_RETURNPRESS

TextEditor.Visible = False

MAJPanneau R, C



Case EVT_ESCAPEPRESS

TextEditor.Visible = False



Case EVT_TABPRESS

MAJPanneau R, C



If C < Panneau.Cols - 1 Then

C = C + 1

displayTextEditor R, C

ElseIf C = Panneau.Cols - 1 And R < Panneau.Rows - 1 Then

C = 0

R = R + 1

displayTextEditor R, C

End If

End Select

End Function



Private Function MAJPanneau(R As Integer, C As Integer)

'Permet de copier le contenu de TextEditor dans le FlexGrid

Panneau.TextMatrix(R, C) = TextEditor.Text

End Function



Private Function displayTextEditor(R As Integer, C As Integer)

'Permet d'afficher TextEditor au dimension de la cellule active

Panneau.Row = R

Panneau.Col = C



TextEditor.Width = Panneau.CellWidth

TextEditor.Height = Panneau.CellHeight

TextEditor.Left = Panneau.CellLeft + Panneau.Left

TextEditor.Top = Panneau.CellTop + Panneau.Top

TextEditor.Text = Panneau.Text

TextEditor.SelStart = 0

TextEditor.SelLength = Len(TextEditor.Text)

TextEditor.Visible = True

Panneau.ZOrder 1

TextEditor.ZOrder 0

TextEditor.SetFocus

End Function



Public Function GetRow(y As Single)

'Determine la ligne active en fonction de la position de la souris



Dim tmpY



While tmpY < y And GetRow < Panneau.Rows

tmpY = tmpY + Panneau.RowHeight(GetRow)

GetRow = GetRow + 1

Wend



If GetRow > 0 Then GetRow = GetRow - 1

End Function



Public Function GetCol(x As Single)

'Determine la colonne active en fonction de la position de la souris



Dim tmpX



While tmpX < x And GetCol < Panneau.Cols

tmpX = tmpX + Panneau.ColWidth(GetCol)

GetCol = GetCol + 1

Wend



If GetCol > 0 Then GetCol = GetCol - 1

End Function





Si quelqu'un peut m'aider à résoudre mon problème, je lui en serais très reconnaissant.



Merci et bonne journée.

1 réponse

cs_allfab Messages postés 76 Date d'inscription mercredi 28 avril 2004 Statut Membre Dernière intervention 25 juillet 2005
26 juil. 2005 à 09:37
Personne ne peut m'aider ?
0