Scroll et Richtextbox

Signaler
Messages postés
855
Date d'inscription
samedi 11 juin 2005
Statut
Membre
Dernière intervention
21 août 2015
-
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
-
Salut !

J'ai un richtextbox et je voudrais que lorsque le scroll est à la fin de la lecture, cad tout en bas là où le texte finit, m'envoie un message.

Avez-vous une idée svp ?

Merci

----------
OS : Windows 7 Pro 64 Bit
Platforme : Visual Studio 2012
A voir également:

20 réponses

Messages postés
7231
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
26 janvier 2021
118
Bonjour,
Je ne sais pas dans quel langage tu programmes. En haut VB6 et en bas VB2012

Voici en net ce que tu peux faire. Je l'ai mis dans un button:

   RichTextBox1.SelectionStart = RichTextBox1.Text.Length
        RichTextBox1.ScrollToCaret()
        MsgBox("fin du texte")


A toi de voir dans quel evenement l'attribuer!
@+Le Pivert
Messages postés
855
Date d'inscription
samedi 11 juin 2005
Statut
Membre
Dernière intervention
21 août 2015

Non désolé, c'est en vb6 :(
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
233
Bonjour, Le Pivert,
Le "Scroll", pour moi, n'a rien à voir avec le caret. Il s'exerce à l'aide des flèches de l'ascenseur dont le contrôle est doté.


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
233
Bonjour, Sinsitrus,
Je veux bien t'aider à mettre en place cette nouvelle "bébelle", mais ce sera la dernière fois, car je constate que tu passes beaucoup de temps à t'amuser avec du superflu et peu aux choses fondamentales.
Tu veux donc de l'"étonnant" ? Cela t'amuse ?
D'ac, mais sans la moindre explication.
Regarde, essaye d'analyser et comprendre cet exemple bâclé, donc, qui fait nécessairement appel à une fonction de l'API de Windows et utilise forcément un timer. :
Option Explicit
Private Declare Function GetScrollPos Lib "user32" (ByVal hwnd As Long, ByVal nBar As Long) As Long
Dim posfin As Long, deja As Boolean

Private Sub Form_Initialize()
  toto
End Sub
Private Sub Text1_Change()
 toto
End Sub

Private Sub Text1_GotFocus()
  toto
End Sub

Private Sub toto()
    Dim titi As Long
    titi = Text1.SelStart
    Text1.SelStart = Len(Text1.Text)
    posfin = GetScrollPos(Text1.hwnd, 1)
    Text1.SelStart = titi
    Timer1.Enabled = True
    Timer1.Interval = 10
End Sub

Private Sub Timer1_Timer()
 If GetScrollPos(Text1.hwnd, 1) posfin And Not deja Then MsgBox "stop": Timer1.Enabled  False
End Sub


Attention : tu as dit en VB6 , hein. (Ce code est donc UNIQUEMENT pour du VB6).

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
233
Ah oui : précisons :
Je t'ai mis là la manière de traiter le scroll vertical d'une textbox multiligne
Une valeur (et une seule) serait à modifier pour le scroll horizontal.
PS : j'ai dit "bébelle" et "superflu" pour une raison simple : nul utilisateur n'a besoin d'un message pour savoir qu'il est arrivé à la fin d'un scroll, hein ! Il le constate forcément seul (le scroll n'avançant plus, de lui-même, hein !!!)

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
233
Et à propos : quid de cette autre discussion, laissée sans suite :
Tapez le texte de l'url ici.
Ce n'est pas sérieux !


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
233
Dans mon bâclage/essai, j'ai oublié de supprimer la booléenne deja, devenue inutile.
Enlève sa déclaration et modifie ===>>
If GetScrollPos(Text1.hwnd, 1) >posfin And Not deja Then MsgBox "stop": Timer1.Enabled False



________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Messages postés
855
Date d'inscription
samedi 11 juin 2005
Statut
Membre
Dernière intervention
21 août 2015

Merci à tous les deux et surtout à toi ucfoutu.

Tu dis bâclage, bébelle, superflu... tu as raison !

D'abord, le lien précédent ne fait plus parti du projet. Je m'amusais à faire plaisir à ma belle soeur qui souhaitais une petite appli comme elle souhaitais. Si un client te demande de lui faire un scrollbar qui affiche 0 et chaque x seconde affiche 1% de plus tu diras non à ton client parce que c'est une bébelle ou du superflu ? Peut-être oui vu que le perfection ne s'obtient qu'après un dur labeur !
Mais moi je refuserai pas ce client :)

Ici, le msgbox sera remplacé par un autre code, (rien a voir avec le premier projet en fait) mais pour simplifier, j'ai dis msgbox puisque le reste du code, je l'ai.

En tant que programmeur professionnel, tu sais que l'on peux supprimer une ligne de code et la remplacer non ? Alors pourquoi venir contre moi lorsque tu vois du "simple" ?

Je vois souvent une trentaine de lignes pour un truc que je peux faire en 3 ou 6 lignes, chacun ses petits secrets tu trouves pas ?

Bref ucfoutu, merci pour ton bout de code et pour l'autre poste car chez moi on dis :
"celui qui t'enseigne un mot, appel le maître" :)
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
233
Veux-tu alors bien libérer toutes tes discussions qui ont été résolues ?
C'est à cela, que sert le tag "Réponse acceptée"


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Messages postés
855
Date d'inscription
samedi 11 juin 2005
Statut
Membre
Dernière intervention
21 août 2015

Ici non pas encore.
Lorsque je scroll, je suis obligé de cliquer dans le texte pour que le message s'affiche. Or il était voulu que le scroll réponde lorsqu'il est en fin de texte.
N'y a t-il pas un moyen ? J'ai essayé le KeyUp, et les autre mais rien a faire.

Et si je clique dans le texte avant de scroller et je descend avec le scroll, il n'affiche plus le msg.


Tu te souviens lorsque tu descends les conditions d'utilisation de winDev ? Lorsque le scroll atteint la fin du texte et le bouton s'active ? Quelque soit l'endroit où tu es tant que tu n'as pas lu le texte tout entier (enfin lorsque le scroll n'est pas à la fin) le bouton s'active pas... C'est exactement pareil là.

Bonsoir ucfoutu,

nul utilisateur n'a besoin d'un message pour savoir qu'il est arrivé à la fin d'un scroll
Lorsqu'un logiciel ordonne à un utilisateur de lire une licence jusqu'au bout par exemple (donc en déplaçant la scollbar jusqu'en bas), ton code peut trouver toute sa place. Du coup, fini la 'bébelle' et le superflu.
En ce qui concerne le bâclage : joker
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
233
Bonjour, banana32,
Si tu savais ...
Ben .. tu vas savoir ....
Quand j'étais gamin et que, pendant les vacances scolaires, on prétendait me faire consacrer une partie de mon temps à la lecture plutôt qu'à jouer aux billes, je n'hésitais pas à tromper tout le monde, en faisant arriver très rapidement mon marque-page à la fin d'un livre que j'avais à peine parcouru.
Je ne connais pas de logiciel pouvant vérifier qu'un texte a vraiment été lu jusqu'au bout


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
233
Ah oui, pardon : ===>>
Bâclage, oui, car il y a mieux à faire (autre fonction) ... et sans même le timer. Juste un code un peu plus long...


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
233
Et tiens (j'y pense à l'instant même) : on pourrait également y parvenir avec VB6 tout seul, sans fonction de l'Api de Windows et sans timer ...
Juste un code encore un peu plus long et deux contrôles supplémentaires.

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
233
Allez ===>> voilà du moins bâclé.
- Je change de fonction de l'api de Windows
- je m'affranchis totalement des contraintes précédentes (toto lancé dans plusieurs évènements). Car je détermine le max sans nécessité de déployer
- je garde le timer (dont je pourrais fort bien me passer avec un peu plus de code) uniquement pour faciliter la suivi
Une richtextbox (remplie) multiline et avec scrollbar verticale et un timer ===>>
Private Type SCROLLINFO
   cbSize As Long
   fMask As Long
   nMin As Long
   nMax As Long
   nPage As Long
   nPos As Long
   nTrackPos As Long
End Type
Private Declare Function GetScrollInfo Lib "user32" (ByVal hwnd As Long, ByVal n As Long, lpScrollInfo As SCROLLINFO) As Long
Private Sub Form_Initialize()
   Timer1.Enabled = True
   Timer1.Interval = 10
End Sub
Private Sub Timer1_Timer()
  Static ant As Long
  Dim titi As SCROLLINFO, toto As Long
  With titi
    .cbSize = Len(si)
    .fMask = 1 Or 2 Or 4 Or 16
    toto = GetScrollInfo(RichTextBox1.hwnd, 1, titi)
    If toto <> 0 Then
      If .nPos > ant And .nPos >= .nMax - .nPage Then MsgBox "stop"
      ant = .nPos
    End If
   End With
End Sub

Tu vois, banana32, pourquoi je disais avoir bâclé mon autre code ?

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
233
corriger ===>> .cbSize = Len(titi), bien évidemment ...


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ

Bonjour ucfoutu,

Je ne comprends pas bien une partie de ton code. Tu déclares titi comme ceci :
Dim titi As SCROLLINFO

Puis tu fais juste après :
With titi
    .cbSize = Len(titi)

A mon avis cbSize sera toujours égal à zéro. A moins de placer cette ligne :
toto = GetScrollInfo(RichTextBox1.hwnd, 1, titi)

...avant le bloc With.
Mais je maîtrise pas vb6 alors...
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
233
Non, banana32 : tu as fort bien compris . Et cette ligne se sert à rien ici.
Elle est restée là (oublié de la supprimer) uniquement parce-que, pour mon plaisir personnel, je m'était amusé, parallèlement, à faire d'autres actions dans le timer (déroulement automatique, à un rythme défini par l'interval, de l'ascenseur, à l'aide d'une autre fonction encore de l'Api de Windows). Et quand j'ai effacé ce qui ne regardait pas sinsitrus, j'ai oublié cette ligne.
Bon week-end à toi (ici, il pleut à verse).


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ

Oui d'ailleurs cbSize n'est pas réutilisé dans le code qui suit, je me disais bien qu'elle ne servait à rien
Il pleut beaucoup chez moi également et nous en avions bien besoin.
Bon dimanche à toi aussi
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
233
Fais toutefois gaffe...
Dès lors que titi a été définie comme SCROLLINFO, ses membres deviennent accessibles et modifiables, avant même l'appel de la fonction utilisant titi.
Ainsi :
.fMask = 1 Or 2 Or 4 Or 16
doit nécessairement être placé avant l'appel de la fonction, car il définit les flags du masque à utiliser.

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ