cs_ambre1
Messages postés17Date d'inscriptionlundi 1 novembre 2004StatutMembreDernière intervention31 août 2008
-
30 août 2008 à 18:34
cs_ambre1
Messages postés17Date d'inscriptionlundi 1 novembre 2004StatutMembreDernière intervention31 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.
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 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 :
cs_ambre1
Messages postés17Date d'inscriptionlundi 1 novembre 2004StatutMembreDernière intervention31 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
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 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).
cs_ambre1
Messages postés17Date d'inscriptionlundi 1 novembre 2004StatutMembreDernière intervention31 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
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 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 ?
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 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
cs_ambre1
Messages postés17Date d'inscriptionlundi 1 novembre 2004StatutMembreDernière intervention31 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
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 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
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 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?
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 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
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 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é.