Erreur lors de l'adaptation [Résolu]

Messages postés
71
Date d'inscription
dimanche 18 juin 2017
Dernière intervention
8 juin 2018
- - Dernière réponse : vb95
Messages postés
1735
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
18 décembre 2018
- 20 juin 2017 à 18:58
Bonjour,
J'ai crée un système de lignes à la gauche de mon RichTextBox via une méthode disponible ici : https://pradeep1210.wordpress.com/2010/02/01/vb-net-textbox-with-line-numbers/
Problème : lorsque j'arrive en bas de mon RichTextBox avec le curseur de selection, je fais entrer pour la 57ème ligne et là, Visual Studio me dit que la Value de VerticalScroll doit être entre 'minimum' et 'maximum'. J'ai donc essayé de faire
Panel1.VerticalScroll.Maximum = 99999999
, mais lorsque j'exécute, aucun changement.
Aidez-moi SVP !
Merci d'avance.
Renaud
Afficher la suite 

Votre réponse

6 réponses

Messages postés
12421
Date d'inscription
mardi 11 mars 2003
Dernière intervention
18 décembre 2018
0
Merci
Bonjour

merci de copier ton code sur ce post, en utilisant les balises de coloration (procédure ici)
Renaud42_
Messages postés
71
Date d'inscription
dimanche 18 juin 2017
Dernière intervention
8 juin 2018
-
Voilà le code :
Code lorsque l'on change le texte de la RichTextBox :
Private Sub CodeCS_TextChanged(sender As Object, e As EventArgs) Handles CodeCS.TextChanged
        CodeCS.ForeColor = Color.FromName("WindowText")
        
        ' Lignes sur le côté.
        SyncLineNumbers()
        Dim newHeight As Integer = lbLines.ItemHeight * lbLines.Items.Count
        If newHeight > panelIDE.Height Then
            lbLines.Height = newHeight
            CodeCS.Height = newHeight
        End If
        ' Lignes sur le côté lors du déplacement lorsque l'on tape du texte.
        lbLines.SelectedIndex = CodeCS.GetLineFromCharIndex(CodeCS.SelectionStart)
End Sub

SyncLineNumbers :
Private Sub SyncLineNumbers()
        ' Code pour synchroniser les lignes avec la RichTextBox.
        If CodeCS.Lines.Count <> lbLines.Items.Count Then
            Do While CodeCS.Lines.Count > lbLines.Items.Count
                lbLines.Items.Add((lbLines.Items.Count + 1).ToString)
            Loop
            Do While CodeCS.Lines.Count < lbLines.Items.Count
                lbLines.Items.RemoveAt(lbLines.Items.Count - 1)
            Loop
        End If
    End Sub

Code lorsqu'on relève une touche :
Private Sub CodeCS_KeyUp(sender As Object, e As KeyEventArgs) Handles CodeCS.KeyUp
        ' Lignes sur le côté lors du déplacement via les touches du clavier.
        lbLines.SelectedIndex = CodeCS.GetLineFromCharIndex(CodeCS.SelectionStart)
        Try
            If lbLines.Items.Count > panelIDE.Height \ lbLines.ItemHeight Then
                panelIDE.VerticalScroll.Maximum = 99999999
                panelIDE.VerticalScroll.Value = lbLines.ItemHeight * lbLines.SelectedIndex
            End If
        Catch

        End Try
    End Sub



CodeCS correspond à mon RichTextBox.
lbLines correspond à ma ListBox
panelIDE correspond au panel regroupant les deux éléments ci-dessus.
Whismeril
Messages postés
12421
Date d'inscription
mardi 11 mars 2003
Dernière intervention
18 décembre 2018
-
Juste à la lecture, il ne faut pas mettre
panelIDE.VerticalScroll.Maximum = 99999999
là ou tu l'as mis.
Tu peux soit remplir directement la fenêtre de propriété en mode design, soit mettre cette ligne dans le Load de ta form.

Je teste et je reviens vers toi
Renaud42_
Messages postés
71
Date d'inscription
dimanche 18 juin 2017
Dernière intervention
8 juin 2018
> Whismeril
Messages postés
12421
Date d'inscription
mardi 11 mars 2003
Dernière intervention
18 décembre 2018
-
J'ai ajouté directement dans le Fichier.Designer.vb car la propriété n'est pas listée dans la liste de propriétés de vs2017.
Résultats du test : Toujours la même chose, et si je met dans un Try Catch pour tester ce qui ne va pas, à partir de la 57, soit la dernière disponible selon la hauteur, bien quand j'ajoute des lignes, elles s'ajoutent plus. PS : la police est Courier New en 9,75! (10pt).

Et le code VerticalScroll.Maximum c'est le code que j'ai utilisé pour tester un truc mais ça n'a rien changé non plus

Pour ton bug lorsque on démarre avec une rtb vide, il suffit d'empêcher qu'elle soit vide : si elle est vide alors on lui remet un texte bidon du style un espace.

help plz
Renaud42_
Messages postés
71
Date d'inscription
dimanche 18 juin 2017
Dernière intervention
8 juin 2018
-
Si tu ne comprend pas je t'enverrai une vidéo.
Commenter la réponse de Whismeril
Messages postés
12421
Date d'inscription
mardi 11 mars 2003
Dernière intervention
18 décembre 2018
0
Merci
Je ne reproduis pas ton bug.
Par contre si je démarre avec un richtextbox vide, j'ai un autre bug.
J'ai mis du texte pour débuter.

Commenter la réponse de Whismeril
Messages postés
12421
Date d'inscription
mardi 11 mars 2003
Dernière intervention
18 décembre 2018
0
Merci
Pas besoin d'une vidéo.
J'ai VS2013, donc je ne peux pas préjugé du comportement de 2017.
Par contre, je suis surpris que la propriété ne soit pas accessible depuis la fenêtre idoine.

Pour le texte vide, c'est bien ce que j'ai fait, comme je te l'ai écrit.

As tu mis les différentes propriétés des 3 contrôles comme spécifié dans le tuto?

vb95
Messages postés
1735
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
18 décembre 2018
-
bonjour Whismeril

Avec Visual Studio Community 2017 la "propriété" VerticalScroll d'un Panel n'est pas visible en mode Conception de l'interface ( Design) mais elle est accessible par code
il faut comprendre que ce n'est pas véritablement une propriété mais un "contrôle" Scrollbar qui est greffé sur le Panel et Maximum est une véritable propriété de cette ScrollBar vertical
Commenter la réponse de Whismeril
Messages postés
71
Date d'inscription
dimanche 18 juin 2017
Dernière intervention
8 juin 2018
0
Merci
Oui, à part la BorderStyle du panel je l'ai mis en none que en Fixed3D mais aucune différence je pense, c'est des bordures et la Width de la ListBox mais aucune différence de toute façon tous les nombres jusque 99999999 rentrent dedans, j'ai essayé manuellement.

Je tiens à rappeller le problème : La Value de VerticalScroll doit être entre 'minimum' et 'maximum', le nombre 896 est trop grand. , j'ai regardé dans l'endroit en bas à droite des variables, et la variable 'maximum' doit s'override toute seule, ou bien on ne peux pas la set.

Et aussi il y a réellement peu de différences au niveau de l'interface de vs2013 et vs2015/7, ayant testé les trois.

Je vais t'envoyer une vidéo car mes explications sont pas très claires et un peu trop longues...
Renaud42_
Messages postés
71
Date d'inscription
dimanche 18 juin 2017
Dernière intervention
8 juin 2018
> Renaud42_
Messages postés
71
Date d'inscription
dimanche 18 juin 2017
Dernière intervention
8 juin 2018
-
Ca marche niquel :D, des fois, mieux vaut peu de code.
Renaud42_
Messages postés
71
Date d'inscription
dimanche 18 juin 2017
Dernière intervention
8 juin 2018
> Renaud42_
Messages postés
71
Date d'inscription
dimanche 18 juin 2017
Dernière intervention
8 juin 2018
-
Seul problème, quand on utilise la ScrollBar ça reste mais en décalé sur la ListBox, tu sais comment faire pour que la Scroll de la ListBox soit le même que celui du RichTextBox ?
vb95
Messages postés
1735
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
18 décembre 2018
> Renaud42_
Messages postés
71
Date d'inscription
dimanche 18 juin 2017
Dernière intervention
8 juin 2018
-
bonjour

Une Form avec uniquement la listbox ( Listbox1) et la richTextbox ( RichTextbox1)
Le Panel est supprimé
Les 2 contrôles ont les propriétés décrites dans le code que tu as trouvé
La hauteur de la RichTextbox doit être identique à celle de la Listbox
Seule la Scrollbar verticale est utilisée pour la RichTextbox et sa propriété Wordwrap est sur False
Utilisez la même Font pour les 2 contrôles


Public Class Form1

Private Declare Function SendMessageLong Lib "user32" Alias "SendMessageA" (ByVal hwnd As IntPtr, ByVal wMsg As Integer, ByVal _
wParam As Integer, lParam As Integer) As Integer

Private Const EM_GETFIRSTVISIBLELINE As Integer = 206

Private Function GetLine() As Integer

Dim Line As Integer
With RichTextBox1
' Find the line number of the first visible line
Line = SendMessageLong(.Handle, EM_GETFIRSTVISIBLELINE, 0, 0)
End With
Return Line

End Function

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

RichTextBox1.Text = String.Empty

End Sub

Private Sub RichTextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RichTextBox1.TextChanged

SyncLineNumbers()
ListBox1.TopIndex = GetLine()

End Sub

Private Sub SyncLineNumbers()

If TextBox1.Lines.Count <> ListBox1.Items.Count Then
Do While RichTextBox1.Lines.Count > ListBox1.Items.Count
ListBox1.Items.Add((ListBox1.Items.Count + 1).ToString)
Loop
Do While RichTextBox1.Lines.Count < ListBox1.Items.Count
ListBox1.Items.RemoveAt(ListBox1.Items.Count - 1)
Loop
End If

End Sub

Private Sub RichTextBox1_VScroll(sender As Object, e As EventArgs) Handles RichTextBox1.VScroll

ListBox1.TopIndex = GetLine()

End Sub

End Class
Renaud42_
Messages postés
71
Date d'inscription
dimanche 18 juin 2017
Dernière intervention
8 juin 2018
> vb95
Messages postés
1735
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
18 décembre 2018
-
Ca marche, merci beaucoup ! :)
Mais j'ai un problème : Les lignes se décalent un peu, au fur et à mesure, pourtant, j'ai la même police.
Renaud42_
Messages postés
71
Date d'inscription
dimanche 18 juin 2017
Dernière intervention
8 juin 2018
> Renaud42_
Messages postés
71
Date d'inscription
dimanche 18 juin 2017
Dernière intervention
8 juin 2018
-
Et la même taille de police.
Commenter la réponse de Renaud42_
Messages postés
1735
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
18 décembre 2018
0
Merci
Bonjour

Sur mon projet test je n'ai aucun décalage même après affichage de 10000 lignes fait dans une boucle au Form_Load de la Form ( voir image ci-jointe)
Quelle police utilises-tu et quelle taille ?


Par contre j'ai essayé différentes polices et certaines provoquent un décalage

La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi. 
vb95
Messages postés
1735
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
18 décembre 2018
-
La font "Microsoft sans Serif,8.25" ne provoque aucun décalage : c'est celle utilisée sur l'image plus haut
Testez d'autres polices pour voir celles qui ne provoquent point de décalage
Commenter la réponse de vb95
Messages postés
1735
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
18 décembre 2018
0
Merci
Rebonjour

Ici plus aucun souci avec les polices pourvu que ce soient exactement les mêmes des 2 côtés
La Listbox d'origine est maintenant une RichTextbox mais j'ai gardé son nom en Listbox1 car elle simule la listbox
ainsi plus de décalage quelle que soit la police utilisée
Enlèves la boucle For dans le Form_Load pour l'utiliser ( elle me servait pour les tests)
Les 2 Sub Listbox1_Textchanged et Listbox1.Click bloquent toutes modifications dans la Listbox1 si on y amène le curseur dessus et que l'on modifie les numéros de lignes

Le nouveau code


Public Class Form1

Const EM_GETSCROLLPOS As Integer = 1245
Const EM_SETSCROLLPOS As Integer = 1246
Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageW" (ByVal hWnd As IntPtr, ByVal msg As Integer, ByVal wParam As Integer, ByRef lParam As Point) As Integer

Private Liste As New List(Of Integer)
Private Chaine As String

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

RichTextBox1.Text = String.Empty
Listbox1.Text = String.Empty
For i = 0 To 1000
RichTextBox1.Text = RichTextBox1.Text & (i + 1).ToString & Environment.NewLine
Next

End Sub

Private Sub RichTextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RichTextBox1.TextChanged

SyncLineNumbers()
SynchroText()

End Sub

Private Sub SyncLineNumbers()

If RichTextBox1.Lines.Count <> Liste.Count Then
Do While RichTextBox1.Lines.Count > Liste.Count
Liste.Add((Liste.Count + 1).ToString)
Loop
Do While RichTextBox1.Lines.Count < Liste.Count
Liste.RemoveAt(Liste.Count - 1)
Loop
Chaine = String.Join(Environment.NewLine, Liste)
Listbox1.Text = chaine
End If

End Sub

Private Sub RichTextBox1_VScroll(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RichTextBox1.VScroll

SynchroText()

End Sub

Private Sub SynchroText()

Dim pt As Point
SendMessage(RichTextBox1.Handle, EM_GETSCROLLPOS, 0, pt)
SendMessage(Listbox1.Handle, EM_SETSCROLLPOS, 0, pt)

End Sub

Private Sub Listbox1_TextChanged(sender As Object, e As EventArgs) Handles Listbox1.TextChanged

Listbox1.Text = Chaine
SynchroText()

End Sub

Private Sub Listbox1_Click(sender As Object, e As EventArgs) Handles Listbox1.Click

Chaine = Listbox1.Text

End Sub

End Class


La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi. 
vb95
Messages postés
1735
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
18 décembre 2018
-
Renaud42_
Messages postés
71
Date d'inscription
dimanche 18 juin 2017
Dernière intervention
8 juin 2018
> vb95
Messages postés
1735
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
18 décembre 2018
-
Nickel ! Merci énormément à tous ceux qui m'ont aidés vous êtes géniaux.
vb95
Messages postés
1735
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
18 décembre 2018
> Renaud42_
Messages postés
71
Date d'inscription
dimanche 18 juin 2017
Dernière intervention
8 juin 2018
-
De rien
Penses à mettre le sujet en "résolu"
Commenter la réponse de vb95

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.