VB .NET- Localizando e destacando textos em um RicthTextBox


 Neste artigo vou mostrar como podemos localizar e destacar o texto localizado em um controle RichtTextBox.

O componente RichTextBox é similar com o controle TextBox mas fornece características mais avançadas que podemos explorar. Dentre elas temos a formatação de texto, cores e fontes. Da mesma forma que o controle TextBox o controle RichTextBox é baseado na classe TextBoxBase a qual é baseada na classe Control.

Ao acessar textos no controle RichTextBox temos duas opções:

  1. text - Trata o texto no formato normal

  2. rtf - Trata o texto no formato Rich Text Format

Além disto o controle RichTextBox fornece métodos para abrir e salvar arquivos e procurar strings:

 - LoadFile - permite carregar um arquivo .RTF existente ou um arquivo Texto no controle. Você pode também carregar dados de um stream de dados já aberto.

- SaveFile - permite salvar para RTF ou ASCII texto. Você também pode salvar para um stream de dados aberto.

- Find -  permite localizar strings específicas no texto do controle

Você também pode inicializar o controle para dados armazenados em memória.  Se o texto no interior do controle contiver links para sítios web , você pode usar a propriedade DetectUrls para exibir o link apropriadamente no texto; pode também tratar o evento LinkClicked para realizar tarefas associada com o link.

Neste artigo vou usar o método Find para mostrar como localizar strings em um texto, destacando cada uma das ocorrências.

O método de Find procura pelo texto especificado e retorna o local do primeiro caractere da cadeia de caracteres de pesquisa dentro do controle. Se a propriedade retornar um valor negativo, a cadeia de caracteres de texto sendo procurada não foi encontrada dentro do conteúdo do controle. Você pode usar esse método para criar a funcionalidade de pesquisa que pode ser fornecida para o usuário. Você também pode usar esse método para procurar pelo texto a ser substituído por um formato específico.

Recursos usados :

Criando o projeto no VS Community

Abra o VS Community 2015  e clique em New Project;

A seguir selecione Visual Basic -> Windows -> Windows Forms Application;

Informe o nome LocalizaDestacaTexto_RichTextBox e clique no botão OK;

A partir da ToolBox inclua os seguintes controles no formulário form1.vb:

Disponha os controles conforme o leiaute da figura abaixo:

No evento Click da opção Abrir (mnuAbrir) do menu inclua o código a seguir que irá permitir selecionar um arquivo texto e exibi-lo no controle RichTextBox (rtb1):

Private Sub mnuAbrir_Click(sender As Object, e As EventArgs) Handles mnuAbrir.Click
        Dim ofd1 As New OpenFileDialog
        If ofd1.ShowDialog = Windows.Forms.DialogResult.OK Then
            rtb1.Text = My.Computer.FileSystem.ReadAllText(ofd1.FileName)
        End If
    End Sub

Criamos uma instância do controle OpenFileDialog e a seguir usando o recurso My lemos e atribuímos o arquivo texto ao controle RichTextBox.

No evento Click da opção Localizar no menu inclua o código abaixo:

Private Sub mnuLocalizar_Click(sender As Object, e As EventArgs) Handles mnuLocalizar.Click
        Dim i As Integer = 0
        Dim Prompt As String = "Informe o Texto "
        Dim Titulo As String = "Procurar"
        Dim respostaPadrao As String = ""
        Dim XPos As Integer = 750
        Dim YPos As Integer = 400
        Dim strTexto As String
        strTexto = InputBox(Prompt, Titulo, respostaPadrao, XPos, YPos)
        If Not String.IsNullOrWhiteSpace(strTexto) Then

            While i < rtb1.Text.LastIndexOf(strTexto)
                rtb1.Find(strTexto, i, rtb1.TextLength, RichTextBoxFinds.None)
                rtb1.SelectionBackColor = Color.Orange
                i = rtb1.Text.IndexOf(strTexto, i) + 1
            End While

        End If

    End Sub

Este código usa a função inputbox que exibe um prompt em uma caixa de diálogo que aguarda que um texto seja informado ou um dos botões seja clicado e então retorna uma string contendo o conteúdo do TextBox.

Verificamos a seguir se a string retornada (strTexto) é vazia e a seguir iniciamos um laço while onde percorremos todo o texto localizando a string.

O comando usado para localizar a string é :

   rtb1.Find(strTexto, i, rtb1.TextLength, RichTextBoxFinds.None)

A sintaxe para esse comando é a  seguinte :   RichTextBox.Find(String str, int start, int end, RichTextBoxFinds options)  onde:

str    -  É o texto a localizar no controle.
start -  É o local dentro do texto do controle para começar a procurar.
end  -  É o local dentro do texto do controle para finalizar a pesquisa. Este valor deve ser igual  a -1 ou maior ou igual ao parâmetro start .
options - Uma enumeração que pode ter o seguintes valores:

Para destacar o texto usando o código :   rtb1.SelectionBackColor = Color.Orange

Finalmente no evento Click da opção Sair do menu inclua o código para encerrar a aplicação:

Private Sub mnuSair_Click(sender As Object, e As EventArgs) Handles mnuSair.Click
        Application.Exit()
End Sub

Executando o projeto e informando uma palavra para pesquisa. Obtemos o resultado abaixo:

Para remover o destaque da última palavra selecionada inclua o código destacado em azul na opção Localizar:

Private Sub mnuLocalizar_Click(sender As Object, e As EventArgs) Handles mnuLocalizar.Click
        Dim i As Integer = 0
        Dim temp As String = rtb1.Text
        rtb1.Text = temp
        Dim Prompt As String = "Informe o Texto "
        Dim Titulo As String = "Procurar"
        Dim respostaPadrao As String = ""
        Dim XPos As Integer = 750
        Dim YPos As Integer = 400
        Dim strTexto As String
        strTexto = InputBox(Prompt, Titulo, respostaPadrao, XPos, YPos)
        If Not String.IsNullOrWhiteSpace(strTexto) Then
            While i < rtb1.Text.LastIndexOf(strTexto)
                rtb1.Find(strTexto, i, rtb1.TextLength, RichTextBoxFinds.None)
                rtb1.SelectionBackColor = Color.Orange
                i = rtb1.Text.IndexOf(strTexto, i) + 1
            End While
        End If
    End Sub

Pegue o projeto completo aqui :  LocalizaDestacaTexto_RichTextBox.zip

(Disse Jesus) - Em verdade, em verdade vos digo que vem a hora, e agora é, em que os mortos ouvirão a voz do Filho de Deus, e os que a ouvirem viverão.
João 5:25

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

Referências:


José Carlos Macoratti