Unidad 54. Impresión (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)  ' Línea de detalle

  Posicion = Posicion + 1 ' Incremento del contador

  If Cy > e.MarginBounds.Height * 0.8 Then

  e.HasMorePages = True ' Hay más hojas

  Exit Sub

  End If

  End While

  e.HasMorePages = False   ' No hay más hojas

  Posicion = 0   ' para más listados

End Sub

 

Si se compara éste ejemplo con los anteriores, podremos ver que los cambios son mínimos.

 

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

Definición de elementos que intervienen

 

 Static Posicion As Integer

 

 Dim Cy As Single   ' Coordenada vertical

 Dim Cabec As Boolean = True

 

Posición, se ha conservado su nombre por motivos didácticos, además no está fuera de lugar tampoco, es el contador que nos permite progresar en la colección de filas de la tabla.

Se define estático, para preservar su valor con respecto a las reentradas en el procedimiento después de generar páginas nuevas.

 

  While Posicion < Tabla.Rows.Count

 

El control del bucle, mientras hayan filas, posición menor que el número 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)   ' Línea de detalle

 

Impresión propiamente dicha de la línea de detalle.

 

 Posicion = Posicion + 1 ' Incremento del contador

 

Incremento de la posición en la tabla.

 

 If Cy > e.MarginBounds.Height * 0.8 Then

e.HasMorePages = True ' Hay más hojas

Exit Sub

 End If

 

El control de final de página.

Se realiza porque la variable Cy, se compara con un porcentaje del alto del objeto, 80, 90 % según las necesidades.

 

  e.HasMorePages = True ' Hay más hojas

  Exit Sub

 

Esto es lo que provoca el salto de página en realidad, y la reentrada en el procedimiento 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 de cada página.

Y ese es el peligro del funcionamiento del evento PrintPage, si no se escribe bien, se pierden datos por lecturas indebidas.

 

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

 

 End While

 e.HasMorePages = False   ' No hay más hojas

 Posicion = 0   ' para más listados

 

Indicamos que no hay más páginas.

 

 e.HasMorePages = False   ' No hay más hojas

 

Y la variable posición se asigna a cero para segundos usos.

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

Lo más importante es

 

 e.HasMorePages = True ' Hay más hojas

 Exit Sub

 

Que es lo que provoca la salida del procedimiento de evento, la obtención de una página nueva, y la reentrada en el mismo, desde el principio, con todas sus consecuencias.

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 actualización, etc.

Pero al igual que el BeginPrint, se ejecuta solo una vez.

Octubre-2010
Pág. 54.7

Atrás  Inicio  Adelante






Página inicial  Cursos Informática Gratuitos

Síguenos en:   Facebook       Sobre aulaClic            Política de Cookies