Bonsoir,
Je souhaite synchroniser le défilement entre 2 mémos.
Vu les problèmes rencontrés j'ai simplifié le source en ne gardant qu'un mémo.
Je teste sous windows 10 (64 bits) avec delphi 7 et xe5 et j'obtiens les mêmes résultats :
Tout ce passe bien si je scrolle en cliquant dans la barre de scroll vertical, en revanche, si j'utilise la molette de la souris je tombe sur une bizarrerie.
Il se produit un décalage entre la position réelle de la 1ère ligne affichée et la valeur de sa position.
Tous les scrolls avec la molette sont positifs ou négatifs d'une ligne à la fois.
au début du programme aucune position n'est affichée et la 1ère ligne affichée est la 1 ère ligne du mémo (qui contient 1).
1er scroll positif : position affichée = 0 !!!! et la 1 ère ligne affichée est bien la ligne suivante dans le mémo (la 2ème du mémo qui contient 2).
2ème scroll positif : position affichée = 1 !!!! et la 1 ère ligne affichée est bien la ligne suivante dans le mémo (la 3ème du mémo qui contient 3).
3ème scroll positif : position affichée = 2 !!!! et la 1 ère ligne affichée est bien la ligne suivante dans le mémo (la 4ème du mémo qui contient 4).
Il y a toujours un déphasage de 2 entre la position affichée et la ligne affichée.
On remonte maintenant dans le mémo
1er scroll négatif : position affichée = 3 et la 1 ère ligne affichée est bien la ligne précédante dans le mémo (la 3ème du mémo qui contient 3).
2ème scroll négatif : position affichée = 2 et la 1 ère ligne affichée est bien la ligne précédante dans le mémo (la 2ème du mémo qui contient 2).
3ème scroll négatif : position affichée = 1 et la 1 ère ligne affichée est bien la ligne précédante dans le mémo (la 1ère du mémo qui contient 1).
4ème scroll négatif : position affichée = 0 !!!! et la 1 ère ligne affichée reste la même (la 1ère du mémo qui contient 1).
le code source :
la form en mode texte :
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 unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Memo1: TMemo; Position: TLabel; procedure FormCreate(Sender: TObject); private { Private declarations } procedure Memo1ScrollCatcher(var message: TMessage); public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} type TMyControl = class(TControl); procedure TForm1.FormCreate(Sender: TObject); var i : integer; begin for i := 1 to 10 do begin Memo1.Lines.Add(inttostr(i)); end; Memo1.WindowProc := Memo1ScrollCatcher; end; procedure TForm1.Memo1ScrollCatcher(var message: TMessage); var VertPos : integer; begin if ((message.Msg = WM_VSCROLL) or (message.Msg = WM_MOUSEWHEEL)) then begin VertPos := GetScrollPos(Memo1.Handle, SB_VERT); Position.Caption := inttostr(VertPos); end; TMyControl(Memo1).WndProc(message); end; end.
Je ne vois pas où sont les erreurs.
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 object Form1: TForm1 Left = 1408 Top = 359 Width = 240 Height = 186 Caption = 'Form1' Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [] OldCreateOrder = False OnCreate = FormCreate PixelsPerInch = 96 TextHeight = 13 object Position: TLabel Left = 64 Top = 8 Width = 37 Height = 13 Caption = 'Position' end object Memo1: TMemo Left = 8 Top = 32 Width = 185 Height = 89 ScrollBars = ssVertical TabOrder = 0 end end
Merci de m'avoir lu.
Partager