' Función del API de Windows de 32 bits de múltiple uso
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
(ByVal hWnd As Long, ByVal wMsg As Long, _
ByVal wParam As Long, ByVal lParam As Long) As Long
Public Sub ImprimirPorLinea(qControl As TextBox, margenIzquierdo As Integer, margenSuperior As Integer)
' Este procedimiento tomará cada línea de un textbox multiline (23/Ene/00)
' y lo imprimirá en la impresora predeterminada
'
' El parámetro qControl, será el TextBox a usar, en este caso no es necesario
' ya que sólo tenemos un TextBox, pero si se usaran varios...
' sería un procedimiento de uso genérico...
'
Dim i As Long, k As Long
Dim L1 As Long, L2 As Long
' Constantes para usar con SendMessage
Const EM_GETLINECOUNT = &HBA
Const EM_LINEFROMCHAR = &HC9
Const EM_LINELENGTH = &HC1
Const EM_LINEINDEX = &HBB '--- Faltaba esta declaración (21/Abr/00)
' Número de líneas del TextBox
k = SendMessage(qControl.hWnd, EM_GETLINECOUNT, 0, 0&)
Printer.ScaleLeft = margenIzquierdo * -1
Printer.ScaleTop = margenSuperior * -1
Printer.Print ""
For i = 0 To k - 1
' Primer carácter de la línea actual
L1 = SendMessage(qControl.hWnd, EM_LINEINDEX, i, 0&) + 1
' Longitud de la línea actual
L2 = SendMessage(qControl.hWnd, EM_LINELENGTH, L1, 0&)
' Imprimimos el trozo de texto que representa a una línea
Printer.Print Mid$(qControl.Text, L1, L2)
Next
' Le indicamos que ya no hay más que imprimir
Printer.EndDoc
End Sub