VB.NET - Criando um Editor de textos

As vezes é melhor mostrar como se faz do que ficar falando e teorizando. Neste artigo vou criar um editor de textos no VB .NET com o objetivo de mostrar como implementar algumas funcionalidades que vão usar alguns dos novos recursos presentes no VB .NET ; assim você estará aprendendo na prática...

Neste artigo vou procurar mostrar como :

  1. Usar o controle Toolbar
  2. Usar o controle Imagelist
  3. Criar um menu de contexto
  4. Usar os controles SaveFileDialog e OpenFileDialog
  5. Implementar a impressão
  6. Usar os recursos de visualizar impressão no VB.NET

1 - Inicie um novo projeto no Visual Studio.NET com as seguintes características (sinta-se a vontade para alterar a seu gosto.)

  1. Project Types : Visual Basic Projects
  2. Templates : Windows Application
  3. Name : EditorNet
  4. Location : c:\vbnet\EditorNet

Nota: Como vamos usar os namespaces System.IO e System.Drawing.Printing . As duas primeiras linhas do seu projeto deverão ser as seguintes:

Imports System.IO

Imports System.Drawing.Printing

Na classe do projeto devemos declarar o objeto StringtReader e ativar eventos para o formulário. Usaremos estes recursos na visualização da impressão e impressão do texto.

Dim leitor As StringReader

Friend WithEvents Form1 As System.Windows.Forms.Form

No formulário padrão - form1.vb - vamos incluir os seguintes controles:

  1. RichTextBox
  2. Toolbar
  3. ImageList
  4. SaveDialog
  5. OpenDialog

A aparência inicial do nosso projeto deverá ser a da figura abaixo:

- Note os componentes : SaveFileDialog1 , OpenFileDialog1 e ImageList1 inseridos no formulário.

Vamos agora alterar algumas propriedades dos controles inseridos. Vamos começar com o formulário. Altere suas propriedades conforme a seguir:

Categoria Propriedade Valor Finalidade
Appearence Text Super Editor .NET Alterar o texto do titulo do formulário
Appearence Backcolor Gray Alterar a cor de fundo do formulário
Design Name EditorNet Definir o nome do formulário
Layout StartPosition CenterScreen Centralizar o formulário

Os controles ToolBar e ImageList são usados em conjuntos para podermos criar um menu com imagens. As imagens são definidas no controle ImageList; vamos usar o nome padrão - ImageList1 - e definir as imagens conforme abaixo:

  • Selecione o controle e pressione F4
  • Selecione na categoria Appearance a propriedade Images e clique em Collection
  • Para incluir uma imagem clique no botão - Add e selecione a imagem que desejar

 

Vamos agora configurar o controle ToolBar . Selecione em Properties na categoria Behavior a propriedade Buttons e clique em Collections ; a seguir configure o controle conforme a seguir:

- Você deve clique no botão Add e a seguir configurar as propriedades:
  • Name
  • ImageIndex
  • Style

- Criamos 10 botões com Style do tipo PushButton e 5 botões do tipo Separator

Para vincular as imagens aos botões definidos na ToolBar defina propriedade ImageList da categoria Behavior igual ao nome do nosso controle ImageList : ImageList1. (Feito isto as imagens irão ser exibidas nos buttons criados.)

No controle RichTextBox1 altere o nome do controle para rtbEditor e altere a propriedade Text para um valor nulo , e a propriedade AutoWordSelection para True.

Categoria Propriedade Valor Finalidade
Appearence Text deixar em branco Alterar o texto padrão exibido no controle
Design Name rtbEditor Definir o nome do controle RichTextBox
Behavior AutoWordSelection True Ativa a seleção automática de palavras

Vamos configurar o controle OpenFileDialog1 assim :

Categoria Propriedade Valor Finalidade
Design Name FileDialogNet Define o nome do controle
Misc DefaultExtension rtf Define a extensão padrão
Misc Filter (*.rtf)|*.rtf|Todos os Arquivos (*.*)|*.* Define o filtro para os arquivos
Misc InitialDirectory c:\arquivos Define o diretório padrão

Vamos configurar o controle SaveFileDialog1 assim :

Categoria Propriedade Valor Finalidade
Design Name SaveDialogNet Define o nome do controle
Misc DefaultExtension rtf Define a extensão padrão
Misc Filter (*.rtf)|*.rtf|Todos os Arquivos (*.*)|*.* Define o filtro para os arquivos
Misc InitialDirectory c:\arquivos Define o diretório padrão
Misc FileName arquivo Define o nome do arquivo

A aparência do seu projeto deverá ser parecida com a da figura abaixo:

- Os botões inseridos no projeto tem as seguintes funcionalidades:
  1. Novo
  2. Abrir
  3. Salvar
  4. Copiar
  5. Colar
  6. Negrito
  7. Itálico
  8. Sublinhado
  9. Visualizar Impressão
  10. Imprimir
  11. Ajuda
  12. Sair

Agora vamos criar o código referente a cada funcionalidade relacionada a cada botão. Vamos criar os procedimento e depois relacioná-las a cada botão da Toolbar.

- O código do para criar um novo arquivo. Note a sintaxe da caixa de mensagem MessageBox.

Private Sub Novo()

If RichTextBox1.Text <> "" Then

      If (MessageBox.Show("Deseja Salvar o arquivo ?", "Salvar Arquivo", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1) = DialogResult.Yes) Then

        Salvar_arquivo()

     End If

End If

RichTextBox1.Clear()

RichTextBox1.Focus()

End Sub

- Código para Abrir um arquivo existente.

Private Sub Abrir_Arquivos()

 

If Me.FileDialogNet.ShowDialog() = DialogResult.OK Then

     Dim fs As New FileStream(FileDialogNet.FileName, FileMode.Open, FileAccess.Read)

        Dim m_streamReader As New StreamReader(fs)

 

         ' Lê o arquivo usando a classe StreamReader

      m_streamReader.BaseStream.Seek(0, SeekOrigin.Begin)

 

     ' Lê cada linha do stream até a última

        Me.RichTextBox1.Text = ""

 

     Dim strLine As String = m_streamReader.ReadLine()

 

         While Not (strLine Is Nothing)

              Me.RichTextBox1.Text += strLine + ControlChars.Lf

              strLine = m_streamReader.ReadLine()

        End While

 

     ' Fecha o stream

     m_streamReader.Close()

End If

End Sub

- código para Salvar o arquivo. Estou usando a classe Stream.

Private Sub Salvar_arquivo()

 

Try

    ' Pega o nome do arquivo para salvar

      If Me.SaveDialogNet.ShowDialog() = DialogResult.OK Then

 

      ' abre um stream para escrita e cria um StreamWriter para implementar o stream

          Dim fs As New FileStream(SaveDialogNet.FileName, FileMode.OpenOrCreate, FileAccess.Write)

      Dim m_streamWriter As New StreamWriter(fs)

      m_streamWriter.Flush()

 

      ' Escreve para o arquivo usando a classe StreamWriter

      m_streamWriter.BaseStream.Seek(0, SeekOrigin.Begin)

         ' escreve no controle richtextbox

      m_streamWriter.Write(Me.RichTextBox1.Text)

          ' fecha o arquivo

      m_streamWriter.Flush()

      m_streamWriter.Close()

     End If

Catch em As Exception

     MsgBox("Erro a salvar o arquivo ", MsgBoxStyle.Critical, "Erro ao Salvar")

End Try

End Sub

 

- A seguir o código para aplicar Negrito , Itálico e Sublinhado.(O código é quase idêntico).Cada efeito é aplicado somente sobre o texto que for selecionado ( RichTextBox1.SelectionFont ).

 

Private Sub Negritar()

   Dim nome_fonte As String

   Dim tamanho_fonte As Single

  Dim negrito As Boolean

 

  nome_fonte = RichTextBox1.Font.Name

  tamanho_fonte = RichTextBox1.Font.Size

  negrito = RichTextBox1.Font.Bold

 

  If negrito = False Then

      RichTextBox1.SelectionFont = New Font(nome_fonte, tamanho_fonte, FontStyle.Bold)

    Else

      RichTextBox1.SelectionFont = New Font(nome_fonte, tamanho_fonte, FontStyle.Regular)

    End If

End Sub


Private Sub Italico()

 

Dim nome_fonte As String

Dim tamanho_fonte As Single

Dim italico As Boolean

 

nome_fonte = RichTextBox1.Font.Name

tamanho_fonte = RichTextBox1.Font.Size

italico = RichTextBox1.Font.Italic

 

If italico = False Then

   RichTextBox1.SelectionFont = New Font(nome_fonte, tamanho_fonte, FontStyle.Italic)

Else

   RichTextBox1.SelectionFont = New Font(nome_fonte, tamanho_fonte, FontStyle.Italic)

End If

End Sub


Private Sub Sublinhar()

 

Dim nome_fonte As String

Dim tamanho_fonte As Single

Dim sublinha As Boolean

 

nome_fonte = RichTextBox1.Font.Name

tamanho_fonte = RichTextBox1.Font.Size

sublinha = RichTextBox1.Font.Underline

 

If sublinha = False Then

    RichTextBox1.SelectionFont = New Font(nome_fonte, tamanho_fonte, FontStyle.Underline)

Else

    RichTextBox1.SelectionFont = New Font(nome_fonte, tamanho_fonte, FontStyle.Underline)

End If

End Sub

Para incluir as funcionalidades de visualização de impressão e de impressão devemos fazer o seguinte:

 Insira os seguintes componentes da barra de ferramentas :(veja figura ao lado)
  • PrintDocument
  • PrintPreviewDialog

Abaixo vemos os dois componentes junto com os componentes já incluídos no projeto:

Para saber mais detalhes sobre os componentes leia o artigo:

 VB .NET - Impressão e Visualização. O que há de novo ?

Para ativar o recurso de visualizar a impressão devemos primeiro escrever o código para imprimir o texto no evento PrintPage do objeto PrintDocument. Note que o procedimento PrintDocument1_PrintPage possui argumento do tipo PrintPageEventArgs que chamamos de texto. A seguir temos o código :

Private Sub PrintDocument1_PrintPage(ByVal sender As System.Object, ByVal texto As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage

 

Dim linhasPorPagina As Single = 0

Dim Posicao_Y As Single = 0

Dim contador As Integer = 0

Dim MargemEsquerda As Single = texto.MarginBounds.Left

Dim MargemSuperior As Single = texto.MarginBounds.Top

Dim linha As String = Nothing

Dim FonteDeImpressao As Font = Me.RichTextBox1.Font

Dim meupincel As New SolidBrush(Color.Black)

 

'Calcula o numero de linhas por página usando as medidas das margens

linhasPorPagina = texto.MarginBounds.Height / FonteDeImpressao.GetHeight(texto.Graphics)

 

' Vamos imprimiri cada linha implementando um StringReader

linha = leitor.ReadLine()

 

While contador < linhasPorPagina

     ' calcula a posicao da proxima linha baseado  na altura da fonte de acordo com o dispostivo de impressao

   Posicao_Y = (MargemSuperior + (contador * FonteDeImpressao.GetHeight(texto.Graphics)))

 

   ' desenha a proxima linha no controle richtext

   texto.Graphics.DrawString(linha, FonteDeImpressao, meupincel, MargemEsquerda, Posicao_Y, New StringFormat())

 

   contador += 1

   linha = leitor.ReadLine()

End While

' se existir mais linhas imprimi outra página

If Not (linha Is Nothing) Then

   texto.HasMorePages = True

Else

   texto.HasMorePages = False

End If

meupincel.Dispose()

End Sub

- Primeiro calculamos o número de linhas por página par podermos controlar a impressão. Usamos as medidas das margens do documento e o tamanho da fonte usada na impressão para fazer este cálculo.

linhasPorPagina = texto.MarginBounds.Height / FonteDeImpressao.GetHeight(texto.Graphics)

- Implementamos um StringReader para ler cada linha do texto ; Usando um laço While imprimimos linha por linha e incrementamos o contador de linha , verificando se o numero de linhas impresso é maior que o número de linhas por página.

While contador < linhasPorPagina

     ' calcula a posicao da proxima linha baseado  na altura da fonte de acordo com o dispostivo de impressao

   Posicao_Y = (MargemSuperior + (contador * FonteDeImpressao.GetHeight(texto.Graphics)))

 

   ' desenha a proxima linha no controle richtext

   texto.Graphics.DrawString(linha, FonteDeImpressao, meupincel, MargemEsquerda, Posicao_Y, New StringFormat())

 

   contador += 1

   linha = leitor.ReadLine()

End While

Agora devemos definir o procedimento que irá permitir visualizar a impressão. No código abaixo temos a rotina pronta . Definimos que janela de visualização será maximizada e que 

Private Sub visualiza()

'visualiza a impressao

Try

     Dim strTexto As String = Me.RichTextBox1.Text

 

   leitor = New StringReader(strTexto)

    

     Dim printPreviewDialog1 As New PrintPreviewDialog()

 

     With printPreviewDialog1

       .Document = Me.PrintDocument1

       .Text = "Macoratti - Visualizando a impressão"

       .WindowState = FormWindowState.Maximized

       .PrintPreviewControl.Zoom = 1

       .FormBorderStyle = FormBorderStyle.Fixed3D

       .ShowDialog()

    End With

Catch exp As Exception

   MsgBox(exp.Message.ToString, MsgBoxStyle.Critical, "Erro na visualização da impressão")

End Try

End Sub

Executando o projeto , carregando um texto e ativando a visualização iremos obter:

 

Vamos imprimir !!! Para imprimir o documento vamos inserir o componente PrintDialog no nosso projeto. Após fazer isto basta incluir o seguinte código na sua rotina que irá ativar a impressão. Ao lado a imagem que mostra a janela imprimir exibida pelo código.

 

Private Sub imprimir()

 

    printDialog1.Document = PrintDocument1

   

    Dim strTexto As String = Me.RichTextBox1.Text

    leitor = New StringReader(strTexto)

 

      If printDialog1.ShowDialog() = DialogResult.OK Then

      Me.PrintDocument1.Print()

 

      End If

 

End Sub

Vamos ativar a funcionalidade do botão - Ajuda . Na verdade iremos inserir um novo formulário e nele iremos exibir o nome do sistema , uma imagem e um link para ser acesso via web. A primeira coisa a fazer e inserir o formulário - form2.vb - no menu Project - opção - Add Windows Forms.

No formulário inserido vamos incluir os seguintes controles : GroupBox , Label e LinkLabel. Abaixo temos a visualização do formulário e o código do evento Click do controle LinkLabel e do formulário:

O código relacionado ao botão LinkLabel é o seguinte :
Private Sub LinkLabel1_LinkClicked(ByVal sender As System.Object, ByVal e As System.Windows.Forms.LinkLabelLinkClickedEventArgs) Handles LinkLabel1.LinkClicked

LinkLabel1.LinkVisited = True

'ativa o metodo Process.Start para abrir o navegador padrão com a url

System.Diagnostics.Process.Start("http://www.macoratti.net")

End Sub


Código ativado quando o usuário clicar no formulário:

Private Sub Form2_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Click

Me.Close()

End Sub

 

Quando o usuário clicar no link estamos usando o método start do objeto Process para abrir o navegador com a url indicada.

Só falta mostrar as opções Copiar e Colar. Antes disto eu vou mostrar como é o código que dispara cada rotina associado aos botões do menu:

Private Sub ToolBar1_ButtonClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ToolBarButtonClickEventArgs) Handles ToolBar1.ButtonClick

Dim botao As Object

 

botao = e.Button

 

Select Case ToolBar1.Buttons.IndexOf(e.Button)

 Case 0

    Novo()

 Case 1

    Abrir_Arquivos()

 Case 2

    Salvar_arquivo()

 Case 4

     'copiar

 Case 5

     'colar

 Case 7

    Negritar()

 Case 8

    Italico()

 Case 9

    Sublinhar()

 Case 11

    visualiza()

 Case 12

    imprimir()

 Case 14

    ajuda()

 Case 16

    Application.Exit()

 End Select

End Sub

Vamos agora ao código do botão - Copiar - que permite copiar partes dos textos selecionados , é bem simples:

Private Sub copiar()

 

If RichTextBox1.SelectionLength > 0 Then

    RichTextBox1.Copy()

End If

End Sub

Agora o código do botão - Colar - que permite o texto selecionado:

Private Sub copiar()

  RichTextBox1.Paste()

End Sub

Acabamos de criar um editor de texto , simples na verdade , mas que abre qualquer tipo de arquivo e que possui alguns recursos.

Você pode melhorar o editor com mais recursos. Use sua criatividade e bom estudo... 

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

Quer migrar para o VB .NET ?

Quer aprender C# ??

 

             Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter
 

Referências:


José Carlos Macoratti