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 :

RichEdit défilement Scrollbar


Sujet :

Composants VCL Delphi

  1. #1
    Membre actif Avatar de XeGregory
    Homme Profil pro
    Passionné par la programmation
    Inscrit en
    Janvier 2017
    Messages
    284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Passionné par la programmation
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2017
    Messages : 284
    Points : 238
    Points
    238
    Par défaut RichEdit défilement Scrollbar
    Bonjour a tous,

    Je chercher a faire défilé la ScrollBar verticale de mon RichEdit, visa une boucle While ... Do.
    Pour cela je récupère les informations de la ScrollBar du RichEdit visa le TScrollInfo.

    Mon souci réside dans le fait que ma boucle While ... Do ne se termine jamais car la valeur (ScrollInfo.nPos) n'a pas atteint la valeur (ScrollInfo.nMax).
    Il y a un moment où la barre de défilement verticale atteint sa position maximale (Ont n'est bien arrivé en bas du RichEdit), L'application est bloquée, car la valeur (ScrollInfo.nPos) n'a pas atteint la valeur (ScrollInfo.nMax).

    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
    { ScrollAutoClick }
    procedure TFReading.ScrollAutoClick(Sender: TObject);
    var
      ScrollInfo: TScrollInfo;
    begin
      with ScrollInfo do
      begin
        cbSize := SizeOf(Self);
        fMask := SIF_POS or SIF_RANGE;
      end;
     
      GetScrollInfo(DocReading.Handle, SB_VERT, ScrollInfo);
     
      while ScrollInfo.nPos < ScrollInfo.nMax do
      begin
        SendMessage(RichEdit.Handle, WM_VSCROLL, SB_LINEDOWN, 0);
        DocReading.Update;
        Sleep(500);
        Application.ProcessMessages;
     
        with ScrollInfo do
        begin
          cbSize := SizeOf(Self);
          fMask := SIF_POS or SIF_RANGE;
        end;
     
        GetScrollInfo(RichEdit.Handle, SB_VERT, ScrollInfo);
      end;
    end;
    Avez-vous une petite idée de d'où peut venir le problème ?
    Merci beaucoup.
    Vous ne pouvez pas faire confiance à un code que vous n'avez pas totalement rédigé vous-même.
    Ce n’est pas un bogue - c’est une fonctionnalité non documentée.

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 714
    Points : 13 184
    Points
    13 184
    Par défaut
    Déjà fixer correctement cbSize : cbSize := SizeOf(TScrollInfo).

    Sinon la position max est le défilement maximum moins une page.

  3. #3
    Membre actif Avatar de XeGregory
    Homme Profil pro
    Passionné par la programmation
    Inscrit en
    Janvier 2017
    Messages
    284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Passionné par la programmation
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2017
    Messages : 284
    Points : 238
    Points
    238
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Déjà fixer correctement cbSize : cbSize := SizeOf(TScrollInfo).

    Sinon la position max est le défilement maximum moins une page.
    Merci Andnotor

    J'ai regardé les différences entre les valeurs (ScrollInfo.nPos) - (ScrollInfo.nMax)
    Quoi que je charge comme texte dans le RichEdit j'ai toujours une différence de 750 entre la valeur de ScrollInfo.nPos & ScrollInfo.nMax.

    Donc je comprend mieux quoi je ne sort pas de ma boucle.
    Vous ne pouvez pas faire confiance à un code que vous n'avez pas totalement rédigé vous-même.
    Ce n’est pas un bogue - c’est une fonctionnalité non documentée.

  4. #4
    Membre actif Avatar de XeGregory
    Homme Profil pro
    Passionné par la programmation
    Inscrit en
    Janvier 2017
    Messages
    284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Passionné par la programmation
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2017
    Messages : 284
    Points : 238
    Points
    238
    Par défaut
    J'ai peu être une piste, mes j'ai encore un décalage entre la valeur de [ScrollInfo.nPos + RichEdit.Height) - ScrollInfo.cbSize] & [ScrollInfo.nMax] de -2, je suis encore bloqué dans ma boucle.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      while (ScrollInfo.nPos + RichEdit.Height) - ScrollInfo.cbSize < ScrollInfo.nMax do
    J'arrive pas à retombé sur mes pattes
    Vous ne pouvez pas faire confiance à un code que vous n'avez pas totalement rédigé vous-même.
    Ce n’est pas un bogue - c’est une fonctionnalité non documentée.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Il faut tester la valeur renvoyée par SendMessage comme indiqué dans le lien une valeur nulle veut dire que le message n'a pas été traitée
    https://learn.microsoft.com/en-us/wi...ols/wm-vscroll

    WM_VSCROLL effectue le défilement par pixel pour le richedit il y autres messages qui le font par ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    var
      TopLine: integer;
    begin
      RichEdit1.Perform( EM_SCROLL , SB_TOP, 0); // retourne au début 
      while ( RichEdit1.Perform( EM_SCROLL , SB_LINEDOWN, 0)and $FFFF  ) <> 0 do
      begin
         TopLine := RichEdit1.Perform(EM_GETFIRSTVISIBLELINE, 0, 0);
         Caption := TopLine.ToString;
         Application.ProcessMessages
      end;

  6. #6
    Membre actif Avatar de XeGregory
    Homme Profil pro
    Passionné par la programmation
    Inscrit en
    Janvier 2017
    Messages
    284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Passionné par la programmation
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2017
    Messages : 284
    Points : 238
    Points
    238
    Par défaut
    Je suis pas convaincu d'avoir trouvé, ceci dit ma valeur (ScrollInfo.nPos + ScrollInfo.nPage) et bien = ou > que la valeur (ScrollInfo.nMax) quand la barre de défilement verticale atteint sa position maximale, donc je sort bien de ma boucle.


    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
    { ScrollAutoClick }
    procedure TFReading.ScrollAutoClick(Sender: TObject);
    var
      ScrollInfo: TScrollInfo;
    begin
     with ScrollInfo do
      begin
        cbSize := SizeOf(ScrollInfo);
        fMask := SIF_ALL;
      end;
     
      RichEdit.Perform(EM_SCROLL , SB_TOP, 0);
      GetScrollInfo(RichEdit.Handle, SB_VERT, ScrollInfo);
     
     
      while (ScrollInfo.nPos + ScrollInfo.nPage) < ScrollInfo.nMax do
      begin
        RichEdit.Perform(WM_VSCROLL, SB_LINEDOWN, 0);
        RichEdit.Update;
        //Sleep(1);
        Application.ProcessMessages;
     
        with ScrollInfo do
        begin
          cbSize := SizeOf(ScrollInfo);
          fMask := SIF_ALL;
        end;
     
        GetScrollInfo(RichEdit.Handle, SB_VERT, ScrollInfo);
      end;
    end;
    Vous ne pouvez pas faire confiance à un code que vous n'avez pas totalement rédigé vous-même.
    Ce n’est pas un bogue - c’est une fonctionnalité non documentée.

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 714
    Points : 13 184
    Points
    13 184
    Par défaut
    La position correspond au Top de la zone visible. C'est donc bien la hauteur totale moins celle d'une page.

  8. #8
    Membre actif Avatar de XeGregory
    Homme Profil pro
    Passionné par la programmation
    Inscrit en
    Janvier 2017
    Messages
    284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Passionné par la programmation
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2017
    Messages : 284
    Points : 238
    Points
    238
    Par défaut
    Merci Andnotor
    Vous ne pouvez pas faire confiance à un code que vous n'avez pas totalement rédigé vous-même.
    Ce n’est pas un bogue - c’est une fonctionnalité non documentée.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 03/02/2007, 00h12
  2. Réponses: 3
    Dernier message: 31/07/2006, 09h34
  3. ScrollBars dans un RichEdit
    Par blondelle dans le forum C++Builder
    Réponses: 3
    Dernier message: 27/05/2006, 23h29
  4. Comment débloquer le ScrollBar d'un RichEdit ?
    Par Droïde Système7 dans le forum Composants VCL
    Réponses: 2
    Dernier message: 24/07/2005, 11h43
  5. [Delphi 7] [RichEdit] ScrollBar récalcitrant
    Par Droïde Système7 dans le forum Composants VCL
    Réponses: 1
    Dernier message: 23/07/2005, 15h30

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