Erreur lors de l'adaptation [Résolu]

Renaud42_ 66 Messages postés dimanche 18 juin 2017Date d'inscription 19 mars 2018 Dernière intervention - 18 juin 2017 à 10:42 - Dernière réponse : vb95 1504 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 21 avril 2018 Dernière intervention
- 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 

30 réponses

Répondre au sujet
Whismeril 11409 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 21 avril 2018 Dernière intervention - 18 juin 2017 à 13:12
0
Utile
4
Bonjour

merci de copier ton code sur ce post, en utilisant les balises de coloration (procédure ici)
Renaud42_ 66 Messages postés dimanche 18 juin 2017Date d'inscription 19 mars 2018 Dernière intervention - 18 juin 2017 à 14:52
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 11409 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 21 avril 2018 Dernière intervention - 18 juin 2017 à 21:44
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_ 66 Messages postés dimanche 18 juin 2017Date d'inscription 19 mars 2018 Dernière intervention > Whismeril 11409 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 21 avril 2018 Dernière intervention - 18 juin 2017 à 22:38
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_ 66 Messages postés dimanche 18 juin 2017Date d'inscription 19 mars 2018 Dernière intervention - 18 juin 2017 à 22:40
Si tu ne comprend pas je t'enverrai une vidéo.
Commenter la réponse de Whismeril
Whismeril 11409 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 21 avril 2018 Dernière intervention - 18 juin 2017 à 22:03
0
Utile
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
Whismeril 11409 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 21 avril 2018 Dernière intervention - 18 juin 2017 à 22:51
0
Utile
1
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 1504 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 21 avril 2018 Dernière intervention - 19 juin 2017 à 18:44
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
Renaud42_ 66 Messages postés dimanche 18 juin 2017Date d'inscription 19 mars 2018 Dernière intervention - 19 juin 2017 à 07:15
0
Utile
15
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_ 66 Messages postés dimanche 18 juin 2017Date d'inscription 19 mars 2018 Dernière intervention > Renaud42_ 66 Messages postés dimanche 18 juin 2017Date d'inscription 19 mars 2018 Dernière intervention - 19 juin 2017 à 22:49
Ca marche niquel :D, des fois, mieux vaut peu de code.
Renaud42_ 66 Messages postés dimanche 18 juin 2017Date d'inscription 19 mars 2018 Dernière intervention > Renaud42_ 66 Messages postés dimanche 18 juin 2017Date d'inscription 19 mars 2018 Dernière intervention - 19 juin 2017 à 22:56
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 1504 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 21 avril 2018 Dernière intervention > Renaud42_ 66 Messages postés dimanche 18 juin 2017Date d'inscription 19 mars 2018 Dernière intervention - 20 juin 2017 à 03:05
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_ 66 Messages postés dimanche 18 juin 2017Date d'inscription 19 mars 2018 Dernière intervention > vb95 1504 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 21 avril 2018 Dernière intervention - 20 juin 2017 à 07:34
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_ 66 Messages postés dimanche 18 juin 2017Date d'inscription 19 mars 2018 Dernière intervention > Renaud42_ 66 Messages postés dimanche 18 juin 2017Date d'inscription 19 mars 2018 Dernière intervention - 20 juin 2017 à 07:34
Et la même taille de police.
Commenter la réponse de Renaud42_
vb95 1504 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 21 avril 2018 Dernière intervention - Modifié par vb95 le 20/06/2017 à 10:08
0
Utile
1
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 1504 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 21 avril 2018 Dernière intervention - 20 juin 2017 à 11:00
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
vb95 1504 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 21 avril 2018 Dernière intervention - Modifié par vb95 le 20/06/2017 à 12:52
0
Utile
3
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 1504 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 21 avril 2018 Dernière intervention - 20 juin 2017 à 13:23
Renaud42_ 66 Messages postés dimanche 18 juin 2017Date d'inscription 19 mars 2018 Dernière intervention > vb95 1504 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 21 avril 2018 Dernière intervention - 20 juin 2017 à 18:56
Nickel ! Merci énormément à tous ceux qui m'ont aidés vous êtes géniaux.
vb95 1504 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 21 avril 2018 Dernière intervention > Renaud42_ 66 Messages postés dimanche 18 juin 2017Date d'inscription 19 mars 2018 Dernière intervention - 20 juin 2017 à 18:58
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.