Está en la página 1de 4

Unidad 54.

Impresin (VII)
El siguiente ejemplo utiliza una base de datos, como soporte de datos.

Private Sub Hoja_PrintPage(ByVal sender As Object, _


ByVal e As System.Drawing.Printing.PrintPageEventArgs) _
Handles Hoja.PrintPage

Static Posicion As Integer

Dim Cy As Single

' Coordenada vertical

Dim Cabec As Boolean = True

While Posicion < Tabla.Rows.Count


Reg = Tabla.Rows(Posicion)
If Cabec Then

' Cabeceras

Cabeceras(Cy, e)
Cabec = False
End If
LineaDetalle(Reg, e, Cy)

' Lnea de detalle

Posicion = Posicion + 1

' Incremento del contador

If Cy > e.MarginBounds.Height * 0.8 Then


e.HasMorePages = True

' Hay ms hojas

Exit Sub
End If
End While
e.HasMorePages = False

' No hay ms hojas

Posicion = 0

' para ms listados

End Sub

Si se compara ste ejemplo con los anteriores, podremos ver que los cambios son mni
mos.

Visto varios ejemplos vamos a detallar el funcionamiento de los mismos.


Definicin de elementos que intervienen

Static Posicion As Integer

Dim Cy As Single

' Coordenada vertical

Dim Cabec As Boolean = True

Posicin, se ha conservado su nombre por motivos didcticos, adems no est fuera de lug
ar tampoco, es el contador que nos permite progresar en la coleccin de filas de l
a tabla.
Se define esttico, para preservar su valor con respecto a las reentradas en el pr
ocedimiento despus de generar pginas nuevas.

While Posicion < Tabla.Rows.Count

El control del bucle, mientras hayan filas, posicin menor que el nmero de filas.

Reg = Tabla.Rows(Posicion)

Fila, registro a procesar.

If Cabec Then

' Cabeceras

Cabeceras(Cy, e)
Cabec = False
End If

El control de cabeceras, cuando se produce la reentrada, pero si no se entra en


el bucle no se ejecutan.

LineaDetalle(Reg, e, Cy)

' Lnea de detalle

Impresin propiamente dicha de la lnea de detalle.

Posicion = Posicion + 1

' Incremento del contador

Incremento de la posicin en la tabla.

If Cy > e.MarginBounds.Height * 0.8 Then


e.HasMorePages = True

' Hay ms hojas

Exit Sub
End If

El control de final de pgina.


Se realiza porque la variable Cy, se compara con un porcentaje del alto del obje
to, 80, 90 % segn las necesidades.

e.HasMorePages = True

' Hay ms hojas

Exit Sub

Esto es lo que provoca el salto de pgina en realidad, y la reentrada en el proced


imiento de nuevo, y eso es desde el principio, es decir se vuelve a ejecutar

Static Posicion As Integer

Dim Cy As Single

' Coordenada vertical

Dim Cabec As Boolean = True

De ah, que al inicializarse a cierto Cabec, la cabecera se ejecute al principio d


e cada pgina.
Y ese es el peligro del funcionamiento del evento PrintPage, si no se escribe bi
en, se pierden datos por lecturas indebidas.

Y al finalizar el listado, el bucle, el While.

End While
e.HasMorePages = False

' No hay ms hojas

Posicion = 0

' para ms listados

Indicamos que no hay ms pginas.

e.HasMorePages = False

' No hay ms hojas

Y la variable posicin se asigna a cero para segundos usos.


Esto es en detalle el funcionamiento del evento Printpage, desde donde se lanza
el listado.
Lo ms importante es

e.HasMorePages = True

' Hay ms hojas

Exit Sub

Que es lo que provoca la salida del procedimiento de evento, la obtencin de una pg


ina nueva, y la reentrada en el mismo, desde el principio, con todas sus consecu
encias.
3
Fin del proceso, EndPrint.
Cuando finaliza el proceso se ejecuta este evento, y en el se cierran archivos,
si procede, o se realizan procesos de actualizacin, etc.
Pero al igual que el BeginPrint, se ejecuta solo una vez.