hasta el final o una sola linea?

mcdowell
02 de Diciembre del 2003
Mi problema es el siguiente. hice un pequeño programa que se encarga de imprimir cualquier tipo de datos usando el objeto printer y el metodo print. al principio no sabia como imprimir la imagen pero ya lo resolvi, ahora me encuentro con este problema, cuando imprimo bastante informacion, como unos 120 caracteres, la impresora sigue imprimiendo como si nunca terminaran las columnas y no hace lo que es el salto de linea. buscando una solucion a este problema y viendo que no encontraba nada decidi hacer lo siguiente conte los caracteres que podia imprimir en una linea luego conte los caracteres de lo que se queria imprimir, los dividi para que me dieran 120 y me imprimiera en la otra linea lo que restaba. pero el remedio fue peor que la enfermad, ahora ok me hace las dos tres y hasta cuatro lineas, pero las palabras me quedan mal cortadas,(es comprensible porque no hay codigo que las corte bien). y me imprime la segunda linea donde le de la gana.

despues de echarles el cuento, mi pregunta es no hay una forma de imprimir donde se te tome el margen no importa que yto se lo de. y que te haga el multiline?. si alguien por favor me pudiera responder gracias. (si necesitan el codigo base para imprimir un texto en varias lineas, solo envienme un mail.) gracias por su atencion =;-S

Baltasar
02 de Diciembre del 2003
El problema lo resuelves con la función TEXTWIDTH. Esta función te devuelve el ancho que tendría un texto, por ejemplo:

printer.textwidth("Esto es una prueba del texto") te devolverá el ancho de dicho texto conla letra que en ese momento tiene la impresora. Sabiendo ésto, tendrías que hacerte una pequeña función que te devuelva el número de caracteres que "entraran" en determinado espacio del papel-
Por si no me he explicado:

Private Function Ajustar(Texto As String, Inicio As Long, Ancho As Long) As String
Dim a As Long
a = 1
Do While Printer.TextWidth(Mid(Texto, Inicio, a)) < Ancho And a < Len(Texto)
a = a + 1
Loop
a = a - 1
If a > 0 Then
Ajustar = Mid(Texto, Inicio, a)
Else
Ajustar = ""
End If
Inicio = Inicio + a
End Function

para llamar a la función, suponiendo un ancho de 4500, escribes:

dim Posicion as long
posicion=1
do while posicion<len(mitexto)
printer.print ajustar(mitexto,posicion,4500)

' aquí haces el salto de línea que precises

loop

No hay que olvidar asignar un tipo de letra a la impresora antes de llamar a esta función, ya que si no se hace tomará por defecto un tipo de letra preestablecido.

Saludos

Baltasar
02 de Diciembre del 2003
Que quede bien claro que el ejemplo anterior no justifica las líneas, no distingue los espacios entre las palabras ni nada parecido. El que necesite justificar las palabras, que se lo curre, jaja.

Juan
02 de Diciembre del 2003
¿Habeis probado con la función API DrawText?
Usándola sobre el formulario da un resultado estupendo.
Os pongo un ejemplo, sólo necesita un commandbutton:

Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
'Constantes para DrawText
Private Const DT_LEFT = &H0
Private Const DT_WORDBREAK = &H10
Private Const DT_INTERNAL = &H1000
'Constantes para DrawEdge
Private Const BDR_RAISEDOUTER As Long = &H1
Private Const BF_LEFT As Long = &H1
Private Const BF_TOP As Long = &H2
Private Const BF_BOTTOM As Long = &H8
Private Const BF_RIGHT As Long = &H4
Private Const BF_RECT As Long = (BF_LEFT Or BF_TOP Or BF_RIGHT Or BF_BOTTOM)

Private Declare Function DrawText Lib "user32" Alias "DrawTextA" (ByVal hdc As Long, ByVal lpStr As String, ByVal nCount As Long, lpRect As RECT, ByVal wFormat As Long) As Long
Private Declare Function DrawEdge Lib "user32" (ByVal hdc As Long, qrc As RECT, ByVal edge As Long, ByVal grfFlags As Long) As Long

Private Sub Command1_Click()
Dim r As RECT, texto As String
texto = "texto de muestra para ilustrar el uso de la función DrawText"
'Establece las dimensiones del rectángulo donde escribir
With r
.Left = 10
.Top = 10
.Right = 110
.Bottom = 110
End With
'Escribe el texto. Cambia Me.hdc por Printer.hdc si lo vas a imprimir
DrawText Me.hdc, texto, Len(texto), r, DT_LEFT + DT_WORDBREAK + DT_INTERNAL
'Dibujamos un borde alrededor del texto
With r
.Left = .Left - 1
.Top = .Top - 1
.Right = .Right + 1
.Bottom = .Bottom + 1
End With
DrawEdge Me.hdc, r, BDR_RAISEDOUTER, BF_RECT
'Activa la siguiente linea para imprimir
'Printer.EndDoc
End Sub