Bonjour,
Comment détecter si la ScrollBar notamment verticale a été activée ? J'ai essayé avec OnClick mais cela ne détecte que sur le LV lui-même.
Bonjour,
Comment détecter si la ScrollBar notamment verticale a été activée ? J'ai essayé avec OnClick mais cela ne détecte que sur le LV lui-même.
Bonjour,
Par activée vous voulez dire : "la scrollbar est utilisée via son curseur" ou simplement "la scrollbar est visible" ?
La Scrollbar est actionnée clic sur flèche haut ou clic flèche bas ou clic sur la barre de défilement,
donc mouvement de la LV (hors clavier touches bas / haut).
Bonjour,
il me semble qu'il y a une propriété TopIndex ?
Si oui, tu pourrais peut être tester si sa valeur a changé ?
A+
Charly
Vous pouvez essayer ce code pour détecter que le scrollbar vertical a été actionné .
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41 unit Unit2; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ComCtrls; type TForm2 = class(TForm) LV: TListView; procedure FormCreate(Sender: TObject); private FOldProc:TWndMethod; procedure NewWinProc(var Mag: TMessage); public { Déclarations publiques } end; var Form2: TForm2; implementation {$R *.dfm} procedure TForm2.NewWinProc(var Mag: TMessage); begin FOldProc(Mag); if (Mag.Msg = WM_VSCROLL) then // scroll vertical begin end; end; procedure TForm2.FormCreate(Sender: TObject); begin FOldProc:=LV.WindowProc; LV.WindowProc:=NewWinProc; end; end.
Bonjour,
Je suis plus FMX que VCL aussi ai-je mis plus de temps à fournir une solution.
tu veux parler de : TopItem.Index effectivement c'est une solution
Je suis parti sur l'idée d'un Helper.
Comme il n'était pas indiqué qu'il s'agissait de tester l'évènement j'ai plutôt écrit une simple fonction de test.
Que finalement j'ai modifiée par la suite pour prendre en compte le scroll vertical comme le scroll horizontal.
Seul bémol, l'obligation d'avaoir une variable globale (privée de préférence) de type TPoint
Une autre solution (outre celle de wheel) serait d'intercepter (terme mieux choisi que redéclarer ?) la classe pour déclarer ce que l'on veut (voir cet article de Cary Jensen)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57 type TScrollMvt = (SB_HORZ,SB_VERT); TScrollbarMove = class Helper for TListView function Scrolled(var before : Tpoint; const bar : TScrollMvt) : boolean; End; TForm23 = class(TForm) ListView1: TListView; btnFill: TButton; btnTest: TButton; procedure btnFillClick(Sender: TObject); procedure btnTestClick(Sender: TObject); private { Déclarations privées } before : TPoint; public { Déclarations publiques } end; var Form23: TForm23; implementation {$R *.dfm} { TScrollbarMove } function TScrollbarMove.Scrolled(var before :Tpoint;const bar : TScrollMvt) : boolean; var After : Integer; begin After := GetScrollPos(Handle, Ord(bar)); if bar=TScrollMvt.SB_VERT then result:= After<>Before.y else result:= After<>Before.x; if Result then if (bar=TScrollMvt.SB_VERT) then Before.y:=After else Before.x:=After; end; procedure TForm23.btnFillClick(Sender: TObject); var I: Integer; begin for I := 1 to 100 do with listview1.Items.Add do begin Caption:=Format('Item %d',[i]); end; before:=Tpoint.Zero; end; procedure TForm23.btnTestClick(Sender: TObject); // test déplacement vertical begin if Listview1.Scrolled(before,SB_VERT) then showmessage('j''ai bougé, topitem.index = '+ListView1.TopItem.Index.tostring); end;
type
TListView = Class (VCL.ComControls.TListView)
private
....
public
end
le seul inconvénient, tous les TlistView de la forme seront interceptés
Partager