IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants VCL Delphi Discussion :

Problèmes de scroll sur un mémo


Sujet :

Composants VCL Delphi

  1. #1
    Membre régulier
    Homme Profil pro
    retraité informaticien
    Inscrit en
    Novembre 2008
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : retraité informaticien

    Informations forums :
    Inscription : Novembre 2008
    Messages : 90
    Points : 75
    Points
    75
    Par défaut 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 : 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.

  2. #2
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 694
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 694
    Points : 13 130
    Points
    13 130
    Par défaut
    En fait la même "erreur" est générée par clic ou par molette seulement tu ne t'en rends pas compte dans le premier cas parce que WM_VSCROLL survient à plusieurs reprises, le dernier étant lorsque le scroll est terminé (SB_ENDSCROLL).

    Dans le cas de WM_MOUSEWHEEL, le scroll n'a pas encore eu lieu et ne le sera qu'après l'appel à WndProc. Il suffit donc d'appeler WndProc avant le test.

  3. #3
    Membre régulier
    Homme Profil pro
    retraité informaticien
    Inscrit en
    Novembre 2008
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : retraité informaticien

    Informations forums :
    Inscription : Novembre 2008
    Messages : 90
    Points : 75
    Points
    75
    Par défaut Résolu
    Bonjour à tous et merci à toi Andnotor.
    Merci pour ta réponse rapide et correcte.

    Il fallait bien déplacer WndProc avant le test et tout fonctionne à souhait.

    Bonne journée à tous.

    jjnoui

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème de float /de background-color/scroll sur IE6
    Par asandoz dans le forum Mise en page CSS
    Réponses: 0
    Dernier message: 08/04/2010, 21h13
  2. problème scroll sur flash dans page html
    Par éloi_75 dans le forum Flash
    Réponses: 4
    Dernier message: 11/09/2008, 21h47
  3. [CR] Problème de sélection sur un champ date
    Par noluc dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 21/11/2003, 16h56
  4. Problème avec RDTSC sur K6-III
    Par le mage tophinus dans le forum x86 32-bits / 64-bits
    Réponses: 17
    Dernier message: 30/09/2003, 09h43
  5. problème de float sur SQL server 2000.
    Par fidji dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 24/07/2003, 14h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo