Problèmes de scroll sur un mémo
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:
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:
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.