Scroll et Richtextbox

Sinsitrus Messages postés 849 Date d'inscription samedi 11 juin 2005 Statut Membre Dernière intervention 21 août 2015 - 18 oct. 2012 à 23:13
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 - 21 oct. 2012 à 11:25
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

20 réponses

cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 137
19 oct. 2012 à 16:50
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
0
Sinsitrus Messages postés 849 Date d'inscription samedi 11 juin 2005 Statut Membre Dernière intervention 21 août 2015
19 oct. 2012 à 16:54
Non désolé, c'est en vb6 :(
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
19 oct. 2012 à 16:56
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
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
19 oct. 2012 à 17:29
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
19 oct. 2012 à 17:37
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
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
19 oct. 2012 à 17:42
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
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
19 oct. 2012 à 19:06
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
0
Sinsitrus Messages postés 849 Date d'inscription samedi 11 juin 2005 Statut Membre Dernière intervention 21 août 2015
19 oct. 2012 à 22:26
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" :)
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
19 oct. 2012 à 23:06
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
0
Sinsitrus Messages postés 849 Date d'inscription samedi 11 juin 2005 Statut Membre Dernière intervention 21 août 2015
19 oct. 2012 à 23:20
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à.
0
Utilisateur anonyme
20 oct. 2012 à 23:40
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
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
21 oct. 2012 à 07:38
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
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
21 oct. 2012 à 07:41
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
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
21 oct. 2012 à 08:19
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
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
21 oct. 2012 à 10:48
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
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
21 oct. 2012 à 10:50
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
0
Utilisateur anonyme
21 oct. 2012 à 11:11
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...
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
21 oct. 2012 à 11:19
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
0
Utilisateur anonyme
21 oct. 2012 à 11:24
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
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
21 oct. 2012 à 11:25
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
0
Rejoignez-nous