 VB.NET - Criando um Editor de textos
   
VB.NET - Criando um Editor de textosAs 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 - Inicie um novo projeto no Visual Studio.NET com as seguintes características (sinta-se a vontade para alterar a seu gosto.)
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:
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:
|  | 
 
 | 
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: 
 - 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: 
 | 
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 IfEnd If RichTextBox1.Clear() RichTextBox1.Focus() End Sub | 
- Código para Abrir um arquivo existente.
| Private
    Sub 
    Abrir_Arquivos() 
 If Me.FileDialogNet.ShowDialog() = DialogResult.OK ThenDim 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 IfEnd Sub | 
- código para Salvar o arquivo. Estou usando a classe Stream.
| PrivateSub Salvar_arquivo() Try ' Pega o nome do arquivo para salvar If Me.SaveDialogNet.ShowDialog() = DialogResult.OKThen ' 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 IfCatch em As Exception MsgBox("Erro a salvar o arquivo ", MsgBoxStyle.Critical, "Erro ao Salvar") End TryEnd 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 AsSingle 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 IfEnd Sub Private Sub Italico() 
 Dim nome_fonte As StringDim 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 IfEnd Sub Private Sub Sublinhar() 
 Dim nome_fonte As StringDim 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 IfEnd 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) 
 Abaixo vemos os dois componentes junto com os componentes já incluídos no projeto: 
 Para saber mais detalhes sobre os componentes leia o artigo: | 
    
     | 
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 = NothingDim 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áginaIf Not (linha Is Nothing) Then texto.HasMorePages = TrueElse texto.HasMorePages = FalseEnd 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
| PrivateSub visualiza() 'visualiza a impressaoTry 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 WithCatch exp As Exception MsgBox(exp.Message.ToString, MsgBoxStyle.Critical, "Erro na visualização da impressão") End TryEnd 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.OKThen Me.PrintDocument1.Print() 
 EndIf 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 : 
 | 
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 'colarCase 7 Negritar() Case 8 Italico() Case 9 Sublinhar() Case 11 visualiza() Case 12 imprimir() Case 14 ajuda() Case 16 Application.Exit() End SelectEnd 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 IfEnd 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 Facebook
  
 Compartilhe no Twitter
 
Compartilhe no Twitter
 
Referências: