Imprimindo o conteúdo de uma caixa de Texto com múltiplas linhas.


Você já precisou imprimir o conteúdo de um TextBox com propriedade Multiline igual a True ? Esta é uma pergunta constante nos grupos de discussão ... Então vamos responder. Siga as instruções:

1 - Inicie um novo projeto no VB e no formulário padrão insira um controle textBox - text1 - com sua propriedade Multiline definida para True e um botão de comando - command1 - com a propriedade Caption = &Imprimir , conforme layout abaixo:

2- Insira o código a seguir na seção General Declarations do formulário:

Option Explicit

Private Declare Function SendMessageAsString Lib "user32" Alias "SendMessageA" ( _
ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, _
ByVal lParam As String ) As Long

Private Declare Function SendMessageAsLong Lib "user32" Alias "SendMessageA" ( _
ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, _
ByVal lParam As Long ) As Long

Private Const EM_GETLINE As Long = &HC4
Private Const EM_GETLINECOUNT As Long = &HBA

Acima declaramos as APIs que iremos usar e as constantes usadas nas APIs.

3- No evento click do botão de comando - command1 - insira o codigo abaixo:

Private Sub Command1_Click()
Dim i As Long
Dim n As Long

n = PegaLinhaContador(Text1)
For i = 1 To n
  'Printer.Print PegaLinha(Text1, i - 1)
  Debug.Print PegaLinha(Text1, i - 1)
Next

'Printer.EndDoc

End Sub
Neste código usamos a função PegaLinhaContador - que

recebe como parâmetro o conteudo de Text1 e retorna o

número de linhas atual.


A função PegaLinha recebe o conteúdo de TextBox e

extrai a linha indica colocando-a no buffer.

4- Agora vamos definir as funções - PegaLinha e PegaLinhaContador :

Função PegaLinhaContador:
'// retorna o numero de linhas atual no textbox
Private Function PegaLinhaContador(txt) As Long
   PegaLinhaContador = SendMessageAsLong(txt.hWnd, EM_GETLINECOUNT, 0, 0)
End Function
Função PegaLinha:
'// preenche o buffer com uma linha de texto definida em LinhaNumero
'// a primeira linha comeco no zero
Private Function PegaLinha(txt As TextBox, LinhaNumero As Long) As String

 '// caracteres por linha
 Const MAX_CHAR_PER_LINE As Long = 80

 Dim ByteLo As Integer
 Dim ByteHi As Integer
 Dim rtn As Long
 Dim Buffer As String

 ByteLo = MAX_CHAR_PER_LINE And (255)
 ByteHi = Int(MAX_CHAR_PER_LINE / 256)
 Buffer = Chr$(ByteLo) + Chr$(ByteHi) + Space$(MAX_CHAR_PER_LINE - 2)
 rtn = SendMessageAsString(txt.hWnd, EM_GETLINE, LinhaNumero, Buffer)
 PegaLinha = Left$(Buffer, rtn)
End Function

Agora é só executar o projeto e o conteúdo do textbox ( você tem que preencher o controle com algum texto) será impresso na janela de depuração - Debug.Print PegaLinha(Text1, i - 1) . Você pode alterar o código de acordo com suas necessidades.

Obs: Um código alternativo que obtém o mesmo resultado é :(Para testar ponha o código abaixo em um formulário com um botão de comando e um textbox multiline com algum texto)

Option Explicit

Private Declare Function SetTextAlign Lib "gdi32.dll" (ByVal hdc As Long, ByVal wFlags As Long) As Long
Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wmsg As Long, ByVal wparam As Long, lparam As Any) As Long

Private Sub Command1_Click()
Dim i As Integer
Dim ta As Long
Dim LinhasDeTexto As Long
Dim BufferDoTexto As String
Dim CaractereDeRetorno As Long
Const TA_CENTRO = 10

'Centraliza o texto no objeto printer
ta = SetTextAlign(Printer.hdc, TA_CENTRO)
Printer.CurrentY = (Printer.ScaleHeight / Text1.Parent.ScaleHeight) * Text1.Top
' pega o numero de linhas do text box
LinhasDeTexto = SendMessage(Text1.hwnd, &HBA, 0, 0)
'exibe núumero de linhas
Label1.Caption = Label1.Caption & LinhasDeTexto

' Extrai e imprime cada linha no TextBox

For i = 0 To LinhasDeTexto - 1
    BufferDoTexto = Space(1000)
    Printer.CurrentX = (Printer.ScaleWidth / Text1.Parent.ScaleWidth) * (Text1.Left + (Text1.Width / 2))
    ' define o buffer para cada linha
    Mid(BufferDoTexto, 1, 1) = Chr(79 And &HFF)
    Mid(BufferDoTexto, 2, 1) = Chr(79 \ &H100)
    CaractereDeRetorno = SendMessage(Text1.hwnd, &HC4, i, ByVal BufferDoTexto)
    Printer.Print Left(BufferDoTexto, CaractereDeRetorno)
Next i

Printer.EndDoc
' reseta o alinhamento de volta a configuração original
ta = SetTextAlign(Printer.hdc, ta)
End Sub
 

Moleza , não é mesmo !!! Até mais