2009-11-05 5 views
3

J'ai écrit un contrôle de grille et je voudrais ajouter le support de la molette de la souris. Je pensais que ce serait aussi simple que de surcharger la méthode virtuelle DoMouseWheel, mais il y a un peu de problème.Comment utiliser DoMouseWheel pour faire défiler une ligne à la fois?

Vous pouvez définir le nombre de lignes à faire défiler à la fois dans le Panneau de configuration et le nombre par défaut est de trois. Et cela prend tout son sens lorsque vous faites défiler un document ou une page Web, mais sur une grille, je pense que l'on s'attend plutôt à faire défiler une ligne à la fois. Mais il semble que le support de la roue de Delphi appellera DoMouseWheel trois fois pour chaque cran que je défile, ce qui signifie que je ne peux que faire défiler chaque troisième ligne de la grille (ou quel que soit ce paramètre global).

Comment faire pour faire défiler une seule ligne à la fois pour chaque tour de la molette de la souris?

Mise à jour: La réponse courte ici est de simplement définir Résultat à Vrai après le défilement - alors il ne défile pas trois fois, mais seulement une fois.

Répondre

2

Il suffit de copier le code de la classe TCustomGrid, qui remplace à la fois DoMouseWheelDown() et DoMouseWheelUp() pour faire défiler exactement une ligne à la fois.

+0

Il n'y avait rien au sujet de la mise en œuvre qui est ressortie. Mais suivant votre conseil, je l'ai regardé de nouveau. Il s'avère simplement retourner True après défilement (je suis revenu hérité) l'a fait appeler seulement la fonction une fois. –

+0

@Cobus: Bien sûr, si vous êtes en train de surcharger une fonctionnalité, vous devez vérifier si l'appel du code hérité est la bonne chose à faire. C'est pourquoi j'ai conseillé de copier la mise en œuvre de la grille VCL - il fait la bonne chose. Je n'ai pas vu * votre * implémentation, et je ne suis pas psychique. – mghie

2

En général, il n'est pas très judicieux de lutter contre les valeurs par défaut du système et/ou les préférences de l'utilisateur. Dans ce cas, vous devez respecter tout ce que le système ou l'utilisateur a décidé de définir dans le temps de défilement. Cela dit, si vous croyez vraiment que l'effet multiscroll est totalement faux et trompeur pour le type de composant que vous voulez piloter, vous pouvez envisager un moyen de vous en débarrasser. Vous pouvez essayer de définir une minuterie et ignorer tous les événements mouseWheel, sauf un, qui se produisent dans un laps de temps donné (de l'ordre de la milliseconde). Une chose que vous devriez faire est de définir une option de configuration dans votre programme, pour permettre à l'utilisateur de désactiver ce comportement.

+0

+1 pour le rappel concernant le respect des paramètres de l'utilisateur. – serialhobbyist

+0

L'utilisateur n'est probablement pas conscient du paramètre. Et s'il en est conscient, il l'a probablement choisi pour bien fonctionner avec l'utilisation principale de la molette de défilement - lire des pages Web. Si vous voyez rouler la roue comme si vous faisiez défiler vers le haut et vers le bas en cliquant sur les flèches de la barre de défilement, alors seriez-vous d'accord qu'une ligne à la fois a plus de sens dans une grille liée aux données? –

+0

dans ce cas, faites-le, mais laissez toujours l'utilisateur la possibilité de l'éteindre. –

0

Dans mon cas, j'ai utilisé le composant JVDBGrid, mais je pense que cela fonctionne aussi pour DbGrid. Vous pouvez remplacer les fonctions suivantes: OnMouseWheelDown et OnMouseWheelUp.

.: par exemple

déclaration de type:

type 
    TMyGrid = class(TJvExDBGrid); 

mise en œuvre

procedure TFExample.JvDBGrid1MouseWheelDown(Sender: TObject; Shift: TShiftState; MousePos: TPoint; var Handled: Boolean); 
begin 

    Handled := TMyGrid(Sender).DataLink.DataSet.MoveBy(1) <> 0; 

end; 

procedure TFExample.JvDBGrid1MouseWheelUp(Sender: TObject; Shift: TShiftState; MousePos: TPoint; var Handled: Boolean); 
begin 

    Handled := TMyGrid(Sender).DataLink.DataSet.MoveBy(-1) <> 0; 

end; 
Questions connexes