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() |
Moleza , não é mesmo !!! Até mais