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 :

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.
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
 
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
Je ne vois pas où sont les erreurs.

Merci de m'avoir lu.