Problème avec MSHFlexGrid et scroll

cs_ambre1 Messages postés 17 Date d'inscription lundi 1 novembre 2004 Statut Membre Dernière intervention 31 août 2008 - 30 août 2008 à 18:34
cs_ambre1 Messages postés 17 Date d'inscription lundi 1 novembre 2004 Statut Membre Dernière intervention 31 août 2008 - 31 août 2008 à 11:49
J' ai une MSHFlexgrid dans un controle utilisateur que j' utilise dans une form. Jusque là tout va bien, sauf que lorsque j' execute mon prog , si je scrolle pour descendre en bas de la grille et que je clique sur une celllule, tout remonte et du coup le click n'est plus sur la cellule voulu.
Je n' ai aucun .toprow dans mon code, et cela se produit avant EnterCell alors que dans LeaveCell j' ai mis tout le code en commentaire ...

Qui aurait une petite idée , ca fait 2 jours entiers que je suis dessus sans resoudre mon problème.

Merci.




AMBRE

21 réponses

PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
30 août 2008 à 19:57
salut,

la molette n'est pas gérée avec la MSFlexGrid, si??

tu n'utilises pas une dll/activex ou une classe pour scroller?
si oui ne pourrait-elle pas être en cause?

<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp  
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
30 août 2008 à 21:09
Bonsoir,

puisque le phénomène ne se produit pas lors du scroll, mais lors du click, j'aimerais dans un premier temps connaître le code éventuel utilisé par chacun des évènement suivants de la MsFlexGrid :


- Click


-DblClick


- MouseDow


-MouseUp
0
cs_ambre1 Messages postés 17 Date d'inscription lundi 1 novembre 2004 Statut Membre Dernière intervention 31 août 2008
30 août 2008 à 21:50
non je n' utilises pas de dll ou activex pour gerer la molette

AMBRE
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
30 août 2008 à 21:55
Bien...
Et ?
(lire plus haut).
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_ambre1 Messages postés 17 Date d'inscription lundi 1 novembre 2004 Statut Membre Dernière intervention 31 août 2008
30 août 2008 à 21:56
Private Sub grille_Click()
With GRILLE
    If infoColonne(ligneSaisissable, .MouseCol) = "True" _
    And .MouseRow >= ligneDonnees _
    And .MouseRow < .Rows Then
               If infoColonne(ligneSaisieDate, .MouseCol) = "True" _
        And .TextMatrix(.MouseRow, dernierIndiceColonne + 1) <> "*" Then
            GRILLE_SaisirDate
        End If
    End If
End With
End Sub

Private Sub GRILLE_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)
Dim LigneCliquee As Integer
Dim ColonneCliquee As Integer
With GRILLE
    ColonneCliquee = .MouseCol
    LigneCliquee = .MouseRow
    Call EnregistrerDerniereSaisie
    If optAdapterAuto.Value = True Then
        .Redraw = False
        adapterToutesColonnes
        .Redraw = True
    End If
   
    If ColonneCliquee <= dernierIndiceColonne And LigneCliquee <= .Rows - 1 Then
        Call deselectionnerLigne
        If LigneCliquee <= 1 And .Rows > 2 Then   ' SUR LA BARRE DE TITRES
                If Button = 1 Then
                    If Shift = vbCtrlMask Then
                            'Touche CTRL maintenue ---> deplacement de colonne
                            .Tag = ""
                            If LigneCliquee > 0 Then Exit Sub
                            .Tag = Str(ColonneCliquee)
                            .Drag 1
                        Else
                            'Touche CTRL non maintenue ---> tri de la colonne
                            If indexDeTri = 0 Then
                                Call trier(ColonneCliquee)
                            End If
                    End If
                End If
                If Button = 2 Then ' Click droit --->Menu contextuel
                    txtColonneGrille.Text = ColonneCliquee
                    Call menuColonnes(ColonneCliquee)
                End If
            Else ' SUR LES DONNEES
                .HighLight = flexHighlightNever
                If Button = 1 And LigneCliquee >= ligneDonnees Then '.MouseRow >= ligneDonnees Then
                    .HighLight = flexHighlightNever
                    If infoColonne(ligneSaisissable, ColonneCliquee) = "True" Then
                            .HighLight = flexHighlightWithFocus
                            .FocusRect = flexFocusLight
                            If chSousTotaux.Value = 1 Then
                                If .TextMatrix(LigneCliquee, dernierIndiceColonne + 1) = "*" Then
                                'on bloque la saisie dans la cellule soustotal
                                    .FocusRect = flexFocusNone
                                End If
                            End If
                            .row = LigneCliquee
                            .col = ColonneCliquee
                        Else
                            .FocusRect = flexFocusNone
                            If infoColonne(ligneFormat, ColonneCliquee) <> "Lien" Then focusGrille
                    End If
                End If
                    If Button = 2 Then ' Click droit --->Menu contextuel
                       If ColonneCliquee = colonnedetri And LigneCliquee >= ligneDonnees _
                       And .ColWidth(ColonneCliquee) > 0 And .RowHeight(LigneCliquee) > 0 _
                       And .TextMatrix(LigneCliquee, dernierIndiceColonne + 1) <> "*" Then
                            deselectionnerLigne
                            If chFusionner.Value = 0 Then
                                    selectionnerLigne (LigneCliquee)
                                Else
                                    selectionnerBloc (LigneCliquee)
                            End If
                            Call menuLignes(LigneCliquee)
                        End If
                    End If
        End If
    End If
   
    If ColonneCliquee > dernierIndiceColonne And LigneCliquee <= .Rows - 1 Then
        If Button = 2 Then
            ' Click droit --->Menu contextuel qd toutes les colonnes sont cachées
            If bIsColonneVisible = False Then
                txtColonneGrille.Text = ColonneCliquee
                Call menuColonnes(ColonneCliquee)
            End If
        End If
    End If
    ' Gestion du focus
    If ColonneCliquee <= dernierIndiceColonne Then
        If .TextMatrix(ligneSaisissable, ColonneCliquee) = "False" Or _
        Trim(.TextMatrix(LigneCliquee, dernierIndiceColonne + 1)) = "*" Then
            If infoColonne(ligneFormat, ColonneCliquee) <> "Lien" Then
                deselectionnerLigne
                focusGrille
            End If
        End If
    End If
    If ColonneCliquee > dernierIndiceColonne Then
        deselectionnerLigne
        If infoColonne(ligneFormat, ColonneCliquee) <> "Lien" Then focusGrille
    End If
End With
End Sub

Private Sub grille_DblClick()
    If chFusionner.Enabled = True Then
        chFusionner.Value = 1 - chFusionner.Value ' inverse la fusion
        Call gestionFusion
    End If
End Sub

pas de procédure mouseup

en esperant que ca va vous aider

AMBRE
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
30 août 2008 à 22:03
Comme in peut le constater, ces évènements décelenchent plusieurs procédures... C'est en leur sein, qu'il va donc te falloir rechercher....
Un truc : inhible les une par une (teste et tu découvriras la fautive).
0
cs_ambre1 Messages postés 17 Date d'inscription lundi 1 novembre 2004 Statut Membre Dernière intervention 31 août 2008
30 août 2008 à 22:12
en fait g tout testé et qd je clique il rentre dabord dans la procedure leavecell ( dans laquelle g mis le code en commentaire) et ensuite il rentrre dans le entercell et là l' ascenceur est deja remonté, en fait cé comme s 'il exécutait quelquechose avant leavecell ou dedans alors qu' il n' y a rien et que leavecell est la premiere procédure exécutée, corrigez moi si je me trompe

AMBRE
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
30 août 2008 à 22:25
Tout celà devient maintenant trop "imbriqué" pour y voir clair...
Une suggestion, alors :
Une msgbox avant chaque avancée "significative" de ton code, affichant un "repère" (genre 1,2,3... etc...) ===>> observation de ce qui se passe dans ta grille ===>> tu isoleras ainsi le "momentum" (par son numéro affiché) que tu cherches ... (celui à partir duquel interviens l'effet indésirable).
Analyse l'instruction qui lui correspond (montre-la nous si tu ne vois pas trop ce qu'elle fait)....
Question : es-tu l'auteur de la source ?
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
30 août 2008 à 22:26
le leavecell correspond à l'ancienne cellule, avant que la nouvelle ne prenne le focus. donc normal

par contre je me souviens d'un contre effet un peu comme toi :

dans un code je scroll par code (avec toprows etc...) avec le mousedown sur un autre composant (image+timer je crois)
à noter qu'il y a le jeu vertical MAIS AUSSI horizontal!

le mousedown supprime la ligne sélectionnée.
si le click est à plus de la moitié (droite donc) de la surface horizontale visible ET que c'est la dernière ligne restante (sans compter le header, on ne peut plus replacer la grid.

un peu compliqué, je la refais :
j'ai eu le même désagrément à l'horizontal. j'ai du tricher en replaçant la grid comme je le voulais, astuce qui ne fonctionnait alors plus si ma grid était vide.
sous entendu que çà peut être un bug de la grid

replacement manuel à tenter donc
++
<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp  
0
cs_ambre1 Messages postés 17 Date d'inscription lundi 1 novembre 2004 Statut Membre Dernière intervention 31 août 2008
30 août 2008 à 22:37
g deja mis des ponts d' arrets sur toutes les fonction et procedures du programme et ca se passe dans un nomansland puisdque cé apres la fin de leavecell dans lequel il n' y a pas de code et avant de rentrer dans entercell et entre deux ya rien

pour le repositionnement g deja essayer le probleme cé que ca saute à l' écran que comme il s' agit de saisir dans les cellules , si on est pas dessus cé genant

il n' a y aucune instruction toprow dans mon code et qd je fais afficher la valeur de toprow dans le debugger, cé a 24 avant de cliquer et ca passe a 15 apres le click

PS: le code est entierement de moi

AMBRE
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
30 août 2008 à 22:44
pour être plus rapide, la flex ne dessine que la partie visible, pas tout....

est-ce que tu as un évènement _Paint?
(désolé pas le temps de bricoler un bout pour tester)

si oui que donne un .setfocus à ce moment?
<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp  
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
30 août 2008 à 22:54
ah je savais bien que je ne perdais pas la boule

si je scrolle pour descendre en bas de la grille et que je clique sur une celllule
qu'appelles-tu "scoller", le mouvement de la roulette?
si oui, chez moi il n'y a aucune réaction
sinon tu parles de mouvement de la souris (curseur) sur la scrollbar, qui déclenche peut-être déjà quelquechose?
0
cs_ambre1 Messages postés 17 Date d'inscription lundi 1 novembre 2004 Statut Membre Dernière intervention 31 août 2008
30 août 2008 à 23:10
pas d' evenement paint
scroll avec la molette de la souris ou deplacer l' asenceur avec la souris peut importe les deux provoquent la meme chose

AMBRE
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
30 août 2008 à 23:37
je viens de tester avec un projet "propre", le click sur une cellule après scroll laisse la sélection correctement.
c'est donc ton code qui modifie quelques chose, et on a que l'embarras du choix :

Private Sub grille_Click()
With GRILLE
    If infoColonne(ligneSaisissable, .MouseCol) = "True" _
    And .MouseRow >= ligneDonnees _
    And .MouseRow < .Rows Then
               If  infoColonne (ligneSaisieDate, .MouseCol) = "True" _
        And .TextMatrix(.MouseRow, dernierIndiceColonne + 1) <> "*" Then
            GRILLE_SaisirDate
        End If
    End If
End With
End Sub

Private Sub GRILLE_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)
Dim LigneCliquee As Integer
Dim ColonneCliquee As Integer
With GRILLE
    ColonneCliquee =  .MouseCol
    LigneCliquee = .MouseRow
    Call  EnregistrerDerniereSaisie
    If optAdapterAuto.Value  = True Then
        .Redraw =  False
         adapterToutesColonnes
        .Redraw  = True
    End If
   
    If ColonneCliquee <=  dernierIndiceColonne And LigneCliquee <= .Rows -
1 Then
        Call  deselectionnerLigne
        If LigneCliquee < = 1 And .Rows
> 2 Then ' SUR LA BARRE DE TITRES
                If Button =  1 Then
                    If Shift = vbCtrlMask Then
                            'Touche CTRL maintenue --->
deplacement de colonne
                            .Tag = ""
                            If LigneCliquee > 0 Then Exit
Sub
                            .Tag = Str(ColonneCliquee)
                            .Drag 1
                        Else
                            'Touche CTRL non maintenue ---> tri
de la colonne
                            If indexDeTri = 0 Then
                                Call  trier (ColonneCliquee)
                            End If
                    End If
                End If
                If Button  = 2 Then '
Click droit --->Menu contextuel
                    txtColonneGrille.Text =
ColonneCliquee
                    Call  menuColonnes (ColonneCliquee)
                End If
            Else ' SUR LES DONNEES
                .HighLight  = flexHighlightNever
                If Button =  1 And LigneCliquee >= ligneDonnees Then
'.MouseRow >= ligneDonnees
Then
                    .HighLight = flexHighlightNever
                    If  infoColonne (ligneSaisissable,
ColonneCliquee) = "True" Then
                            .HighLight =  flexHighlightWithFocus
                            .FocusRect = flexFocusLight
                            If chSousTotaux.Value = 1 Then
                                If .TextMatrix(LigneCliquee,
dernierIndiceColonne + 1)
= "*" Then
                                'on bloque la saisie dans la
cellule soustotal
                                    .FocusRect =
flexFocusNone
                                End If
                            End If
                            .row = LigneCliquee
                            .col = ColonneCliquee
                        Else
                            .FocusRect = flexFocusNone
                            If  infoColonne (ligneFormat,
ColonneCliquee) <> "Lien" Then focusGrille
                    End If
                End If
                    If Button  = 2 Then '
Click droit --->Menu contextuel
                       If ColonneCliquee = colonnedetri
And LigneCliquee >=
ligneDonnees _
                       And .ColWidth(ColonneCliquee) >
0 And .RowHeight(LigneCliquee) > 0
_
                       And .TextMatrix(LigneCliquee,
dernierIndiceColonne + 1)
<> "*" Then
                             deselectionnerLigne
                            If chFusionner.Value = 0 Then
                                    selectionnerLigne
(LigneCliquee)
                                Else
                                    selectionnerBloc
(LigneCliquee)
                            End If
                            Call menuLignes(LigneCliquee)
                        End If
                    End If
        End If
    End If
   
    If ColonneCliquee > dernierIndiceColonne And LigneCliquee <= .Rows -
1 Then
        If Button = 2 Then
            ' Click droit
--->Menu contextuel qd toutes les colonnes sont
cachées
            If bIsColonneVisible = False Then
                txtColonneGrille.Text = ColonneCliquee
                Call  menuColonnes (ColonneCliquee)
            End If
        End If
    End If
    ' Gestion du focus
    If ColonneCliquee < = dernierIndiceColonne Then
        If .TextMatrix(ligneSaisissable, ColonneCliquee) = "False" Or _
        Trim(.TextMatrix(LigneCliquee, dernierIndiceColonne + 1)) = "*" Then
            If  infoColonne (ligneFormat, ColonneCliquee) <> "Lien" Then
                deselectionnerLigne
                focusGrille
            End If
        End If
    End If
    If ColonneCliquee > dernierIndiceColonne Then
        deselectionnerLigne
        If infoColonne(ligneFormat, ColonneCliquee) <> "Lien" Then focusGrille
    End If
End With
End Sub

Private Sub grille_DblClick()
    If chFusionner.Enabled  = True Then
        chFusionner.Value =  1 - chFusionner.Value ' inverse la
fusion
        Call  gestionFusion
    End If
End Sub

les effets secondaires viennent sans le moindre doute de tes appels, donc de ton code (qui nous est inconnu)
++
<hr size ="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp  
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
31 août 2008 à 00:01
J'ai en effet également essayé et suis également arrivé aux mêmes conclusions que toi, PCPT...
Notre ami est seul avec son code .... et seul à pouvoir y aller à tatons, pas à pas...

J'ai eu beau faire et faire et faire encore, je n'ai pas réussi à obtenir le phénomène signalé en n'utilisant que du proprement contrôlé.
0
cs_ambre1 Messages postés 17 Date d'inscription lundi 1 novembre 2004 Statut Membre Dernière intervention 31 août 2008
31 août 2008 à 00:13
AMBRE
0
LIBRE_MAX Messages postés 1402 Date d'inscription mardi 1 mai 2007 Statut Membre Dernière intervention 7 octobre 2012 6
31 août 2008 à 00:28
Bonsoir,
If optAdapterAuto.Value =  True Then
        .Redraw = False
         adapterToutesColonnes
        .Redraw  = True
    End If

le Redraw redessine ta grille..

<hr />

[] Ce qui va sans dire. va mieux en le disant.

<hr />
0
cs_ambre1 Messages postés 17 Date d'inscription lundi 1 novembre 2004 Statut Membre Dernière intervention 31 août 2008
31 août 2008 à 10:39
AMBRE
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
31 août 2008 à 11:18
messages vides?

Q : [doc/faq.aspx#cs_postempty Parfois lorsque je réponds sur
le forum, ma réponse envoyée est vide, comment faire]

<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp  
0
cs_ambre1 Messages postés 17 Date d'inscription lundi 1 novembre 2004 Statut Membre Dernière intervention 31 août 2008
31 août 2008 à 11:44
tres bonne question
AMBRE
0
Rejoignez-nous