Puedes mostrar una foto de la impresión, que se vea como va quedando... así me hago cargo del tamaño de los textos, etc...????
p.d.:
Lo que si veo repasando el código, es que a la función ' listarcolumnas', no le has puesto los parámetros necesarios, y por tanto no los recibe, luego parece que simplemente estás imprimiendo un texto detrás del otro, pero sin una consideración correcta de columnas, por eso te está fallando.
Dicho de otro modo... te redacto la función con los parámetros adecuados, ya que parece que no los pasas pero tampoco los inicializas (aunque si el list1)
b]Nota que:[/b]
- MargenIzquierdo y MargenDerecho pueden valer 0, lo que significará que se usará todo el ancho disponible del papel por parte de la impresora (printer.width). Ahora bien si ves que 'queda feo', porque 4 columnas son pocas, puedes o bien añadir alguna columna o utilizar márgenes a ambos lados.
- Puedes omitir el parámetro listbox, si siempre vas a usar un único listbox, pero es acertado que una función reciba por parámetro los datos que utiliza.
Si más adelante copias y pegas la función a otro proyecto, seguirá funcionando porque requerirá el listbox que en dicho proyecto estés usando (se llame como se llame, queda aislado dentro de la función), lo que es mejor que andar renombrando cada aparición del listbox...
Para no liarte visto que ya tienes la función usando el control list1, lo retiro como parámetro, pero es más adecuado que se incluya como tal.
Recuerda que todo lo que se haga con printer.print, printer.line, printer.circle, priter.paintpicture y printer.pset se dibuja a un backbuffer, donde se va recreando la 'imagen' a imprimir, cuando se invoca enddoc, equivale a invocar 'draw' del backbuffer, es decir es cuando se vuelca la imagen completa a la impresora.
p.d.:
Lo que si veo repasando el código, es que a la función ' listarcolumnas', no le has puesto los parámetros necesarios, y por tanto no los recibe, luego parece que simplemente estás imprimiendo un texto detrás del otro, pero sin una consideración correcta de columnas, por eso te está fallando.
Dicho de otro modo... te redacto la función con los parámetros adecuados, ya que parece que no los pasas pero tampoco los inicializas (aunque si el list1)
Código (vb) [Seleccionar]
Private Sub ListarColumnas(byval NumCols as integer, byval MargenIzquierdo as integer, byval AnchoPapel as integer)
Dim AnchoPapel As Integer
'Dim MargenIzquierdo As Integer, numCols As Integer
Dim filas As Long
Dim ultimafila As Long
Dim k As Long, j As Long, i As Integer, n As Integer, anchocol As Integer
Dim linea As String
'Dim margen As Integer
Dim fuente As StdFont
Set fuente = Printer.Font
'numCols = 4 Se recibe por parámetro mejor...
Printer.FontName = "Courier New" ' una fuente monoespaciada, si no el trabajo es más laborioso...
filas = ((List1.ListCount + 1) \ numCols)
ultimafila = ((List1.ListCount + 1) Mod numCols) ' columnas que tendrá la última fila.
anchocol = ((AnchoPapel - MargenIzquierdo) \ numCols)
For k = 0 To filas - 1
n = MargenIzquierdo
For i = 0 To numCols - 1
Printer.CurrentX = n ' imprime el texto de la columna 'i'
Printer.Print List1.List(j + i)
n = (n + anchocol)
Next
j = (j + numCols)
Printer.CurrentY = (Printer.CurrentY + Printer.TextHeight("t")) ' el textheight depende de la fuente seleccionada en la impresora, no importa el texto entre paréntesis... es fijo para la fuente.
Next
If (ultimafila > 0) Then ' la última fila tiene 1 o más columnas, pero menos que 'numcols'.
n = MargenIzquierdo
For i = 0 To ultimafila - 1
Printer.CurrentX = n ' imprime el texto de la columna 'i'
Printer.Print List1.List(j + i)
n = (n + anchocol)
Next
End If
Set Printer.Font = fuente
End Sub
' y la invocas así:
' numero de columnas, margen izquierdo donde empezar, ancho que ocuparán las columnas.
call ListarColumnas(4, 240, printer.width - MargenDerecho)
b]Nota que:[/b]
- MargenIzquierdo y MargenDerecho pueden valer 0, lo que significará que se usará todo el ancho disponible del papel por parte de la impresora (printer.width). Ahora bien si ves que 'queda feo', porque 4 columnas son pocas, puedes o bien añadir alguna columna o utilizar márgenes a ambos lados.
- Puedes omitir el parámetro listbox, si siempre vas a usar un único listbox, pero es acertado que una función reciba por parámetro los datos que utiliza.
Si más adelante copias y pegas la función a otro proyecto, seguirá funcionando porque requerirá el listbox que en dicho proyecto estés usando (se llame como se llame, queda aislado dentro de la función), lo que es mejor que andar renombrando cada aparición del listbox...
Para no liarte visto que ya tienes la función usando el control list1, lo retiro como parámetro, pero es más adecuado que se incluya como tal.
Recuerda que todo lo que se haga con printer.print, printer.line, printer.circle, priter.paintpicture y printer.pset se dibuja a un backbuffer, donde se va recreando la 'imagen' a imprimir, cuando se invoca enddoc, equivale a invocar 'draw' del backbuffer, es decir es cuando se vuelca la imagen completa a la impresora.