none
Suchen & Ersetzen Dialog in RichTextBox RRS feed

  • Frage

  • Hallo,

    ich habe mich schon durch einige Foren geschlagen aber nirgends kann mir jemand erklären wie ich Dialog erstelle um in einer RichTextBox Wörter zu finden oder diese zu ersetzen wie in den ReplaceDialog.

    Vielleicht kann mir hier jemand erklären wie ich das schreiben muss.

     

    LG

    Ryan

    Samstag, 18. Juni 2011 12:17

Antworten

  • Hallo Ryan,

    den Dialog zum Suchen und Ersetzen musst/kannst Du selber erstellen. Die RichTextBox stellt hier keinen standardmäßigen Dialog zur Verfügung. Die eigentliche Suchlogik ist dabei auch nicht so schwer zu implementieren. Ich habe ein Beispielprojekt als Download zur Verfügung gestellt, das solch einen einfachen Dialog implementiert:

    http://download.vb-faq.de/samples/findandreplacedialog.zip

    Lässt sich von den Optionen sicher noch weiter ausbauen, wie man es gerade braucht.


    Thorsten Dörfler
    Microsoft MVP Visual Basic
    vb-faq.de
    • Als Antwort markiert Ryan Shasta Samstag, 18. Juni 2011 16:02
    Samstag, 18. Juni 2011 15:04
    Moderator
  • Hallo Ryan,

    Zunächst benötigst Du ein Forms Projekt. Das benötigt eine Richtextbox und ein Button zum Starten des Dialogs.

    Dann musst Du dem Projekt eine neue Komponente hinzufügen: Dialogfeld. Es entsteht eine Dialog1.vb. Darin fügst Du einen Button und zwei Textboxen ein.

    Das Programm geht dann wie folgt. Richtextbox mit Text füllen (von Hand z.B.) und Button1 betätigen zum Starten des Dialogs. Im Dialog Textbox1 und 2 füllen mit dem zu suchenden und zu ersetzenden String. Da auch wieder Button1 betätigen. Und dann OK Button.

    Viel Erfolg und Grüsse Ellen

     

    Diesen Code kopierst Du in die Code Fenster:

    Public Class Form1
    
     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
      Dim dlg As New Dialog1
      dlg.s = RichTextBox1.Text
      If dlg.ShowDialog = DialogResult.OK Then
       RichTextBox1.Text = dlg.s
      End If
      dlg.Close()
     End Sub
    
    End Class
    
    Imports System.Windows.Forms
    
    Public Class Dialog1
     Private rtbText As String
     Public Property s() As String
      Get
       Return Me.rtbText
      End Get
      Set(ByVal value As String)
       Me.rtbText = value
      End Set
     End Property
     Private Sub OK_Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OK_Button.Click
      Me.DialogResult = System.Windows.Forms.DialogResult.OK
     End Sub
     Private Sub Cancel_Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Cancel_Button.Click
      Me.DialogResult = System.Windows.Forms.DialogResult.Cancel
     End Sub
    
     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
      rtbText = rtbText.Replace(TextBox1.Text, TextBox2.Text)
     End Sub
    End Class
    
    

     

     


    Ich benutze/ I'm using VB2008 & VB2010
    • Als Antwort markiert Ryan Shasta Samstag, 18. Juni 2011 16:02
    • Bearbeitet Ellen Ramcke Samstag, 18. Juni 2011 20:26 Tippfehler
    Samstag, 18. Juni 2011 13:29

Alle Antworten

  • Hallo Ryan,

    Zunächst benötigst Du ein Forms Projekt. Das benötigt eine Richtextbox und ein Button zum Starten des Dialogs.

    Dann musst Du dem Projekt eine neue Komponente hinzufügen: Dialogfeld. Es entsteht eine Dialog1.vb. Darin fügst Du einen Button und zwei Textboxen ein.

    Das Programm geht dann wie folgt. Richtextbox mit Text füllen (von Hand z.B.) und Button1 betätigen zum Starten des Dialogs. Im Dialog Textbox1 und 2 füllen mit dem zu suchenden und zu ersetzenden String. Da auch wieder Button1 betätigen. Und dann OK Button.

    Viel Erfolg und Grüsse Ellen

     

    Diesen Code kopierst Du in die Code Fenster:

    Public Class Form1
    
     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
      Dim dlg As New Dialog1
      dlg.s = RichTextBox1.Text
      If dlg.ShowDialog = DialogResult.OK Then
       RichTextBox1.Text = dlg.s
      End If
      dlg.Close()
     End Sub
    
    End Class
    
    Imports System.Windows.Forms
    
    Public Class Dialog1
     Private rtbText As String
     Public Property s() As String
      Get
       Return Me.rtbText
      End Get
      Set(ByVal value As String)
       Me.rtbText = value
      End Set
     End Property
     Private Sub OK_Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OK_Button.Click
      Me.DialogResult = System.Windows.Forms.DialogResult.OK
     End Sub
     Private Sub Cancel_Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Cancel_Button.Click
      Me.DialogResult = System.Windows.Forms.DialogResult.Cancel
     End Sub
    
     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
      rtbText = rtbText.Replace(TextBox1.Text, TextBox2.Text)
     End Sub
    End Class
    
    

     

     


    Ich benutze/ I'm using VB2008 & VB2010
    • Als Antwort markiert Ryan Shasta Samstag, 18. Juni 2011 16:02
    • Bearbeitet Ellen Ramcke Samstag, 18. Juni 2011 20:26 Tippfehler
    Samstag, 18. Juni 2011 13:29
  • Hallo Ryan,

    den Dialog zum Suchen und Ersetzen musst/kannst Du selber erstellen. Die RichTextBox stellt hier keinen standardmäßigen Dialog zur Verfügung. Die eigentliche Suchlogik ist dabei auch nicht so schwer zu implementieren. Ich habe ein Beispielprojekt als Download zur Verfügung gestellt, das solch einen einfachen Dialog implementiert:

    http://download.vb-faq.de/samples/findandreplacedialog.zip

    Lässt sich von den Optionen sicher noch weiter ausbauen, wie man es gerade braucht.


    Thorsten Dörfler
    Microsoft MVP Visual Basic
    vb-faq.de
    • Als Antwort markiert Ryan Shasta Samstag, 18. Juni 2011 16:02
    Samstag, 18. Juni 2011 15:04
    Moderator
  • Hallo 

    vielen Dank für Eure Antworten die mir schon weiterhelfen.

    @Thorsten Dörfler

    Darf ich aus den Download den Programmcode für meine Anwendung nutzen?

    LG

    Ryan

    Samstag, 18. Juni 2011 16:02
  • Hallo Ryan,

    ja natürlich darfst Du ihn in Deiner Anwendung nutzen.


    Thorsten Dörfler
    Microsoft MVP Visual Basic
    vb-faq.de
    Samstag, 18. Juni 2011 16:32
    Moderator
  • Dankeschön
    Samstag, 18. Juni 2011 16:34
  • Hallo,

    ich hatte es mal so komplett eingebunden und die Form angepasst, das Fenster wird auch aufgerufen Problem ist das bei den gesucht Wörtern kommt das er es nicht gefunden hat obwohl diese im Text drin stehen?

    Ich hab den findreplaceDialog meinen Projekt hinzugefügt, aus der Form1 haben ich den Quellcode in meine Form eingefügt den Aufruf Toolstripbutton in den Namen umgenannt wie es in der Form1 benannt ist und den Aufrufcode eingefügt.

    Habe ich da irgendetwas vergessen?

     

    LG

    Ryan

    Sonntag, 19. Juni 2011 07:17
  • Hallo Ryan,

    wenn Du den Text in die (Rich)TextBox eingefügt oder eingegeben hast, steht die Einfügemarke am Ende des Textes. Die Suche ist in diesem Beispiel so implementiert, dass von der aktuellen Position Vorwärts gesucht wird. Ein "Reset" an den Anfang muss manuell erfolgen.

    [Nachtrag] Ich habe das Beispiel aktualisiert, so dass die Suche am Anfang des Textes beginnt, wenn die Auswahl am Ende des Textes steht oder die Suche einmal durchgelaufen ist:

    http://download.vb-faq.de/samples/findandreplacedialog.zip


    Thorsten Dörfler
    Microsoft MVP Visual Basic
    vb-faq.de
    Sonntag, 19. Juni 2011 08:31
    Moderator
  • Hallo Thorsten,

    ich wollte lieber nix sagen. Bei mir hat Dein Sample auch nicht funktioniert, lpos lieferte immer den Wert -1 zurück.

    Ansonsten möchte ich sagen, dass Deine Lösung die intelligentere ist. Du gibst den Verweis der Instanz in den Dialog, während ich die .Text Eigenschaft jedes mal in den Dialog hinhein schreibe und heraus kopiere. Das dürfte bei Textlängen >1Mb schön zu merklichen Laufzeiten führen.

    Das habe ich mir gemerkt.

    Schöne Grüsse Ellen

     


    Ich benutze/ I'm using VB2008 & VB2010
    Sonntag, 19. Juni 2011 12:03
  • Hallo Ellen,

    wenn etwas nicht funktioniert, darfst Du dies ruhig sagen. Ich kann das Beispiel nur verbessern, wenn mir die Probleme damit bekannt sind. Funktioniert denn die überarbeitete Fassung davon jetzt?

    Zum Lösungsansatz selber, dachte ich hierbei weniger an die Speicherauslastung, wobei dies auch ein Aspekt ist, vielmehr darum vorhandene Formatierungen der RichTextBox zu erhalten. Liest man den Text aus der Text Eigenschaft aus und weist ihn dort wieder zu, gehen sämtliche Formatierungen verloren. Über SelectedText bleibt diese soweit möglich erhalten. Als Beispiel habe ich mich hier an Notepad bzw. WordPad orientiert


    Thorsten Dörfler
    Microsoft MVP Visual Basic
    vb-faq.de
    Sonntag, 19. Juni 2011 21:08
    Moderator
  • Hallo Thorsten,

    habe getestet. Läuft jetzt. Dieses Beispiel nehme ich dann in meine Code Sammlung auf, die mittlerweile schon sehr umfangreich ist.

    Vielen Dank. Ach so, Deine Lösung gehört nach oben. Das mache ich denn mal.

    schöne Grüsse Ellen


    Ich benutze/ I'm using VB2008 & VB2010
    Montag, 20. Juni 2011 15:28
  • Hallo

     

    ich habe das jetzt auch getestet, was ich merkwürdig finde, wenn ich Suchen anklicke passiert gar nichts tippe ich ein Wort zum ersetzen ein, passiert bei Suchen wieder nichts bei Ersetzen kommt dann eine Meldung das gesuchte Wort nicht gefunden. Bestätige ich die Meldung ersetzt er dann das gesuchte Wort und schließt den Dialog.

    Ich habe das nur hinzugefügt, den Code aus Form1 in meine Form übernommen und das Clickereigniss erstellt.

     

    LG

     

    Ryan

    Montag, 20. Juni 2011 21:40
  • Hallo Ryan,

    dass "nichts" passiert mag daran liegen, dass Du die HideSelection Eigenschaft der (Rich)TextBox auf True stehen hast (Standardeinstellung). Dann wird keine Markierung angezeigt, solange der Ersetzen Dialog den Fokus hat. Der Ablauf beim Ersetzen ist folgender:

    1. Klick auf Ersetzen: Suche nach dem gewünschten Wort

    2. Klick: Ersetze das gesuchte, markierte Wort und suche nächstes => Wird kein weiteres gefunden: Meldung "'xy' konnte nicht gefunden werden."

    Ist verbesserungswürdig, genau wie der Fehler, der noch enthalten war. Es wird immer das markierte Wort ersetzt:

     

      If Me.TextBox.SelectionLength = 0 OrElse _
        String.Compare(Me.TextBox.SelectedText, term, ignoreCase) <> 0 Then

    Siehe => V 0.3 http://download.vb-faq.de/samples/findandreplacedialog.zip


    Thorsten Dörfler
    Microsoft MVP Visual Basic
    vb-faq.de
    Dienstag, 21. Juni 2011 05:55
    Moderator
  • Hallo Thorsten,

     

    danke jetzt klappt es.

     

    LG

    Ryan

    Dienstag, 21. Juni 2011 07:35