Rechercher et Rechercher le suivant dans une richtextbox vb [Résolu]

Gabilach 201 Messages postés mercredi 2 mars 2011Date d'inscription 28 septembre 2014 Dernière intervention - 18 août 2011 à 23:30 - Dernière réponse : Gabilach 201 Messages postés mercredi 2 mars 2011Date d'inscription 28 septembre 2014 Dernière intervention
- 18 sept. 2011 à 19:05
Bien le bonjour, cela fait quelques temps déjà que je cherche comment rechercher un mot dans un richtextbox avec une form ( que l'on nomera SearchForm ) où il y aurait un bouton rechercher le suivant, j'ai bien trouvé quelques codes mais aucuns ne marchent correctement.

Merci de votre aide

Gabilach...
Afficher la suite 

Votre réponse

18 réponses

Meilleure réponse
Utilisateur anonyme - 19 août 2011 à 14:27
3
Merci
Salut,
Tu peux faire un truc comme ceci (tester avec un richtextbox1 et un button1) :
Public Class Form1

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Dim texte As String = "Maitre corbeau sur un arbre perché tenait dans son bec un fromage" & _
                                Environment.NewLine & _
                              "Maitre renard par l'odeur alléchée lui tint à peu près ce langage"
        RichTextBox1.AppendText(texte)
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim fenetre As New frmCherche()
        fenetre.ShowDialog()
        RichTextBox1.Find(fenetre.Mot)
        fenetre.Close()
        Me.BringToFront()
        RichTextBox1.Focus()
    End Sub


    Public Class frmCherche
        Inherits Windows.Forms.Form
        Dim txtCherche As New TextBox With {.Left 20, .Top 10, .Width = 200}
        Dim btnOK As New Button With {.Left 40, .Top 40, .Text = "OK"}
        Dim btnAnnuler As New Button With {.Left 120, .Top 40, .Text = "Annuler"}
        Dim _Mot As String
        Sub New()
            With Me
                .Controls.Add(txtCherche)
                .Controls.Add(btnOK)
                .Controls.Add(btnAnnuler)
                .Height = 120
                .Width = 250
                .Text = "Rechercher"
                .StartPosition = FormStartPosition.CenterParent
                .MaximizeBox = False
                .MinimizeBox = False
                .AcceptButton = btnOK
            End With
            AddHandler btnOK.Click, AddressOf btn_OK
            AddHandler btnAnnuler.Click, AddressOf btn_Annuler
        End Sub
        Sub New(ByVal Mot As String)
            txtCherche.Text = Mot
            Me.Controls.Add(txtCherche)
        End Sub
        Private Sub btn_OK(ByVal sender As Object, ByVal e As EventArgs)
            _Mot = txtCherche.Text
            Me.Hide()
        End Sub
        Private Sub btn_Annuler(ByVal sender As Object, ByVal e As EventArgs)
            _Mot = ""
            Me.Hide()
        End Sub
        ReadOnly Property Mot() As String
            Get
                Return _Mot
            End Get
        End Property
    End Class

 
End Class

Merci Utilisateur anonyme 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 96 internautes ce mois-ci

Commenter la réponse de Utilisateur anonyme
Meilleure réponse
Utilisateur anonyme - 5 sept. 2011 à 14:06
3
Merci
Salut,
Je n'ai pas eu (ou j'ai supprimé par erreur) les notifications par mail des 19 et 21 août.
Il faut préciser quand même que le principe n'est pas de pondre un code tout fait mais seulement des exemples.
Je pense qu'avec l'exemple que je t'ai fourni, tu devrais pouvoir t'en sortir à condition de ne pas brûler les étapes.
La classe frmCherche est un formulaire que l'on crée dynamiquement et dont le code est logé à l'intérieur de celui du formulaire principal.
Si maintenant tu décides de remplacer ce formulaire dynamique par un toolstriptextbox sur ton formulaire principal, tu comprendra bien que tout le code est à revoir.
Bon courage.

Merci Utilisateur anonyme 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 96 internautes ce mois-ci

Commenter la réponse de Utilisateur anonyme
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 19 août 2011 à 07:58
0
Merci
Bonjour,
En utilisant par exemple la fonction Instr et son paramètre Start (à incrémenter, à chque position trouvée, de la longueur de la chaine recherchée)
Le tout : dans une boucle tant que instr > 0
voilà.


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne intallée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Commenter la réponse de ucfoutu
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 19 août 2011 à 08:10
0
Merci
On peut même s'amuser à éclater (par Split et sur la chaine recherchée) la chaîne où l'on recherche ===>> on obtient ainsi un array dont chaque élément a une longueur. Il suffit alors d'un simple calcul arithmétique (additions) pour connaître la position de chaque occurence de la chaine recherchée dans la chaine où l'on recherche.

Cette seconde méthode est juste pour s'amuser à s'entraîner, hein ...

Quelle que soit la méthode utilisé , il te suffia ensuite, si tu veux mettre en exergue une occurence trouvée, d'utiliser selectionstart et selectionlenght

Ouvre ton aide (MSDN) sur chacun des mots de ces deux messages qui te seraient encore inconnus.


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne intallée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Commenter la réponse de ucfoutu
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 19 août 2011 à 10:56
0
Merci
Regarde le principe.
Je t'ai fait ici un bout de code sous VB6, très facilement adaptable à VB.Net (que je n'ai pas) en relisant mes deux messages plus haut.
sur un Form :
- 1 richtextbox nommée richtextbox1 (où tu as le texte dans lequel tu recherches)
- 1 textbox nommée text1 (où tu saisis le texte à rechercher dans la richtextbox)
- 1 bouton de commande nommé cherche_premier
- 1 bouton de commande nommé cherche_suivant

Ce code :

Private ou As Integer
Private Sub cherche_premier_Click()
  ou = 1
  trouve
End Sub

Private Sub cherche_suivant_Click()
  trouve
End Sub

Private Sub trouve()
  pos = InStr(ou, RichTextBox1.Text, Text1.Text)
  If pos > 0 Then
    RichTextBox1.SelStart = pos - 1
    RichTextBox1.SelLength = Len(Text1.Text)
    RichTextBox1.SetFocus
    ou = ou + Len(Text1.Text) + pos
  End If
End Sub

Transposer ce code en VB.Net est un jeu d'enfant et je te laisse le faire.
Commenter la réponse de ucfoutu
Gabilach 201 Messages postés mercredi 2 mars 2011Date d'inscription 28 septembre 2014 Dernière intervention - 19 août 2011 à 11:10
0
Merci
Bonjour, Je te remercie pour tous sa , mais j'ai une erreur sur le code avec pos: Inaccesible ou non déclaré, et une erreur avec ma richtextbox qui se trouve sur une autre form : SetFocus N'est pas un membre de Libwrite.RichtextBoxPrintCtrl.Richtextbox1. J'utilise une richtextbox modifée pour pouvoir prévisualiser la page avant impression, c'est que j'avais trouvé il y a longtemps sur le msdn, donc je me demande comment ajouter l'option focus dans ce fichier :

Imports System
Imports System.Windows.Forms
Imports System.Drawing
Imports System.Runtime.InteropServices
Imports System.Drawing.Printing

Namespace RichTextBoxPrintCtrl
    Public Class RichTextBox1
        Inherits RichTextBox
        ' Convert the unit that is used by the .NET framework (1/100 inch) 
        ' and the unit that is used by Win32 API calls (twips 1/1440 inch)
        Private Const AnInch As Double = 14.4

        <StructLayout(LayoutKind.Sequential)> _
        Private Structure RECT
            Public Left As Integer
            Public Top As Integer
            Public Right As Integer
            Public Bottom As Integer
        End Structure

        <StructLayout(LayoutKind.Sequential)> _
        Private Structure CHARRANGE
            Public cpMin As Integer          ' First character of range (0 for start of doc)
            Public cpMax As Integer          ' Last character of range (-1 for end of doc)
        End Structure

        <StructLayout(LayoutKind.Sequential)> _
        Private Structure FORMATRANGE
            Public hdc As IntPtr             ' Actual DC to draw on
            Public hdcTarget As IntPtr       ' Target DC for determining text formatting
            Public rc As RECT                ' Region of the DC to draw to (in twips)
            Public rcPage As RECT            ' Region of the whole DC (page size) (in twips)
            Public chrg As CHARRANGE         ' Range of text to draw (see above declaration)
        End Structure
        Property Findshadows(ByVal Words As String, ByVal p2 As Integer) As Integer
            Get
                Return _find
            End Get
            Set(ByVal value As Integer)
                _find = value
            End Set
        End Property

        Private Const WM_USER As Integer = &H400
        Private Const EM_FORMATRANGE As Integer = WM_USER + 57
        Private _find As Integer

        

        Property SelBold As Boolean

        Property SelLength As Integer

        Property SelStart As Integer

        Private Declare Function SendMessage Lib "USER32" Alias "SendMessageA" (ByVal hWnd As IntPtr, ByVal msg As Integer, ByVal wp As IntPtr, ByVal lp As IntPtr) As IntPtr

        ' Render the contents of the RichTextBox for printing
        '	Return the last character printed + 1 (printing start from this point for next page)
        Public Function Print(ByVal charFrom As Integer, ByVal charTo As Integer, ByVal e As PrintPageEventArgs) As Integer

            ' Mark starting and ending character 
            Dim cRange As CHARRANGE
            cRange.cpMin = charFrom
            cRange.cpMax = charTo

            ' Calculate the area to render and print
            Dim rectToPrint As RECT
            rectToPrint.Top = e.MarginBounds.Top * AnInch
            rectToPrint.Bottom = e.MarginBounds.Bottom * AnInch
            rectToPrint.Left = e.MarginBounds.Left * AnInch
            rectToPrint.Right = e.MarginBounds.Right * AnInch

            ' Calculate the size of the page
            Dim rectPage As RECT
            rectPage.Top = e.PageBounds.Top * AnInch
            rectPage.Bottom = e.PageBounds.Bottom * AnInch
            rectPage.Left = e.PageBounds.Left * AnInch
            rectPage.Right = e.PageBounds.Right * AnInch

            Dim hdc As IntPtr = e.Graphics.GetHdc()

            Dim fmtRange As FORMATRANGE
            fmtRange.chrg = cRange                 ' Indicate character from to character to 
            fmtRange.hdc = hdc                     ' Use the same DC for measuring and rendering
            fmtRange.hdcTarget = hdc               ' Point at printer hDC
            fmtRange.rc = rectToPrint              ' Indicate the area on page to print
            fmtRange.rcPage = rectPage             ' Indicate whole size of page

            Dim res As IntPtr = IntPtr.Zero

            Dim wparam As IntPtr = IntPtr.Zero
            wparam = New IntPtr(1)

            ' Move the pointer to the FORMATRANGE structure in memory
            Dim lparam As IntPtr = IntPtr.Zero
            lparam = Marshal.AllocCoTaskMem(Marshal.SizeOf(fmtRange))
            Marshal.StructureToPtr(fmtRange, lparam, False)

            ' Send the rendered data for printing 
            res = SendMessage(Handle, EM_FORMATRANGE, wparam, lparam)

            ' Free the block of memory allocated
            Marshal.FreeCoTaskMem(lparam)

            ' Release the device context handle obtained by a previous call
            e.Graphics.ReleaseHdc(hdc)

            ' Return last + 1 character printer
            Return res.ToInt32()
        End Function

        Private Sub InitializeComponent()
            Me.SuspendLayout()
            Me.ResumeLayout(False)

        End Sub
    End Class
End Namespace


Merci de l'aide

Gabilach...
Commenter la réponse de Gabilach
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 19 août 2011 à 11:33
0
Merci
Désolé, mais je vais te laisser travailler pas à pas (mille fois mieux que copier-coller).
- Commence par le plus simple : tout sur le même Form (ce sera l'étape 1).
- puis, avant de passer à deux Forms : apprends à perfectionner ainsi :
--- premier exercice : un seul bouton de commande au lieu de deux, travaillant en "switch"
--- deuxième exercice : toujours un seul bouton de commande, mais valable et visible uniquement pour les "suivants", le premier étant à trouver au Change de la textbox

Quand tu seras ainsi aguerri et plus à l'aise, on verra alors le reste (entre deux Forms)
Amuse-toi (car ce devrait être un plaisir) bien.




____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne intallée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Commenter la réponse de ucfoutu
Gabilach 201 Messages postés mercredi 2 mars 2011Date d'inscription 28 septembre 2014 Dernière intervention - 19 août 2011 à 11:59
0
Merci
Je ne voit pas comment travailler avec le peu de ressources que j'ai réussi à trouver et le peu de ressources que l'on me donne ?
Et je me demande vraiment comment mettre un champs de recherche sur la même form que mon richtextbox si je programme un genre de WordPad ?

Mais ce n'est pas grave j'abandonne de toute facon c'était la seul chose qui me manquer...

Gabilach...
Commenter la réponse de Gabilach
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 19 août 2011 à 12:04
0
Merci
Et je me demande vraiment comment mettre un champs de recherche sur la même form que mon richtextbox si je programme un genre de WordPad ?

je vais donc me répéter.
Entraîne-toi d'abord avec tout sur un Form.
Quand tu y seras parvenu (après cet effort) on passera à 2 Forms.
On n'a jamais rien sans rien (et un simple copier-coller est pour moi égal à rien).
____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne intallée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Commenter la réponse de ucfoutu
Gabilach 201 Messages postés mercredi 2 mars 2011Date d'inscription 28 septembre 2014 Dernière intervention - 19 août 2011 à 13:11
0
Merci
Et bien je viens d'essayer dans un nouveau projet sur la form de base et j'ai toujours l'erreur pos et j'ai 2 nouvelles erreurs sur richtextbox1, en tout j'ai 7 erreurs dont j'ai aucune idée de comment les enlevées.

Gabilach...
Commenter la réponse de Gabilach
Gabilach 201 Messages postés mercredi 2 mars 2011Date d'inscription 28 septembre 2014 Dernière intervention - 19 août 2011 à 17:01
0
Merci
Je viens d'essayer et tu a oublier
InitializeComponent()
a chaque Sub New() mais ce n'est pas très grave, sa marche nikel avec la fenetre frmrecherche, mais j'ai une question, j'ai remplacer la form par un toolstrip se trouvant dans ma form1 :



J'ai fait sa avec le code :

Dim _Mot As String
    Sub New()
        InitializeComponent()
        AddHandler ToolStripButton1.Click, AddressOf btn_OK
    End Sub
    Sub New(ByVal Mot As String)
        InitializeComponent()
        ToolStripTextBox1.Text = Mot
    End Sub
    Private Sub btn_OK(ByVal sender As Object, ByVal e As EventArgs)
        _Mot = ToolStripTextBox1.Text
        Me.Hide()
    End Sub
    ReadOnly Property Mot() As String
        Get
            Return _Mot
        End Get
    End Property

    Private Sub ToolStripButton1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripButton1.Click
        RichTextBox1.Find(Me.Mot)
        RichTextBox1.Focus()
    End Sub


Et lorsque j'appuie sur rechercher, une erreur se produit :
ArgumentNullException non gérée
La valeur ne peut pas être null.
Nom du paramètre : str

On me dit d'utiliser new mais je ne voie pas comment ?

Merci encore une fois à toi Banana ! Tu est un BOSS


Gabilach...
Commenter la réponse de Gabilach
Utilisateur anonyme - 19 août 2011 à 20:30
0
Merci
Je pense que tu as mal utilisé mon code.
A mon avis, tu as dû créer un formulaire dans lequel tu as collé ma classe frmCherche.
Tu remarquera que cette classe est logée dans la classe du formulaire Form1.
Colle mon code directement dans un nouveau projet et observe ce qui se passe.

En ce qui concerne ton deuxième problème ce serait plutôt :
dim mot as string = Toolstriptextbox1.text
Richtextbox1.find(mot)

Bonne prog.
Commenter la réponse de Utilisateur anonyme
Gabilach 201 Messages postés mercredi 2 mars 2011Date d'inscription 28 septembre 2014 Dernière intervention - 19 août 2011 à 20:42
0
Merci
J'ai ajouter ton code ce qui me donne :

Dim _Mot As String
    Sub New()
        InitializeComponent()
        AddHandler ToolStripButton1.Click, AddressOf btn_OK
    End Sub
    Sub New(ByVal Mot As String)
        InitializeComponent()
        ToolStripTextBox1.Text = Mot
    End Sub
    Private Sub btn_OK(ByVal sender As Object, ByVal e As EventArgs)
        _Mot = ToolStripTextBox1.Text
        Me.Hide()
    End Sub
    ReadOnly Property Mot() As String
        Get
            Return _Mot
        End Get
    End Property

    Private Sub ToolStripButton2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
        Dim mot As String = ToolStripTextBox1.Text
        RichTextBox1.Find(Me.Mot)
        RichTextBox1.Focus()
    End Sub


Mais lorsque je clique sur mon bouton rechercher la Form se ferme mais reste dans les processus

J'est essayé avec un autre bouton et sa me fait pareil, sa viens donc du code, mais comment résoudre se problème ?

Gabilach...
Commenter la réponse de Gabilach
Gabilach 201 Messages postés mercredi 2 mars 2011Date d'inscription 28 septembre 2014 Dernière intervention - 21 août 2011 à 16:39
0
Merci
UP SVP


Gabilach...
Commenter la réponse de Gabilach
Gabilach 201 Messages postés mercredi 2 mars 2011Date d'inscription 28 septembre 2014 Dernière intervention - 4 sept. 2011 à 22:58
0
Merci
Up SVP !!!

Gabilach...
Commenter la réponse de Gabilach
Gabilach 201 Messages postés mercredi 2 mars 2011Date d'inscription 28 septembre 2014 Dernière intervention - 12 sept. 2011 à 20:01
0
Merci
Avec ce conseil :

Si maintenant tu décides de remplacer ce formulaire dynamique par un toolstriptextbox sur ton formulaire principal, tu comprendra bien que tout le code est à revoir.


Je viens de my remettre et je vien de trouver je t'en remercie mdr

Bon dévellopement

Gabilach...
Commenter la réponse de Gabilach
Gabilach 201 Messages postés mercredi 2 mars 2011Date d'inscription 28 septembre 2014 Dernière intervention - 17 sept. 2011 à 01:28
0
Merci
Après avoir réussie cette action je voudrait demander une dernière chose, comment je pourrait faire pour que quand je reclique sur mon bouton rechercher, sa recherche le suivant ?

Merci bien

Gabilach...
Commenter la réponse de Gabilach
Gabilach 201 Messages postés mercredi 2 mars 2011Date d'inscription 28 septembre 2014 Dernière intervention - 18 sept. 2011 à 19:05
0
Merci
UP pliz

Gabilach...
Commenter la réponse de Gabilach

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.