Publicado el 9 de Octubre del 2019
1.137 visualizaciones desde el 9 de Octubre del 2019
128,8 KB
18 paginas
Creado hace 20a (01/01/2005)
1. Impresión.
1.1 Introducción.
Vamos a ver la impresión desde el entorno de programación, no vamos a ver Crystal Report.
La conclusión después de lo visto con ésta versión de VB Studio Net 2005 es que hemos mejorado los
recursos con respecto a la versión seis, aunque lo que se ha hecho es legalizar lo que a nivel de calle era
habitual, y como consecuencia de ello el objeto PictureBox, que antes se usaba para lo que ahora hace el
PrintDocument, ha perdido casi todas sus capacidades.
En esta versión nos aparece una categoría de objetos en la caja de herramientas denominados
Impresión.
Estos objetos son:
PageSetupDialog
PrintDialog
PrintDocument
PrintPreviewControl
PrintPreviewDialog
El que dirige la impresión PrintDocument y el resto los que recogen los resultados, por lo tanto:
Como director de orquesta
Como receptor para la impresora
Como receptor para una vista previa
Configurar parámetros desde usuario
Como receptor para gestionar nosotros la vista previa
PrintDocument
PrintDialog
PrintPreviewDialog
PageSetupDialog
PrintPreviewControl.
Una vez hecha una primera aproximación al tema hay que avanzar unas cuantas advertencias para
entender el ejemplo que tenemos.
El funcionamiento de una impresión está controlado por el objeto PrintDocument en su evento PrintPage.
Es decir que las tareas de impresión se han de escribir en éste evento para que se ejecuten, no es como
antes que se escribía un procedimiento para realizar un listado y desde él se llamaba a un procedimiento en el
que se realizaba la tarea de imprimir, método Print, sea en el objeto Printer o en un PictureBox, y se
gestionaban los cambios de página.
Ahora hay que gestionar los cambios de página ejecutando las líneas que siguen
e.HasMorePages = True
Exit Sub
Esto provoca una salida del procedimiento de evento y un retorno al mismo, pero el retorno es al
principio, no al punto en el que se ejecuta la salida, por lo que hay que tener presente, que es lo que se hace
en el inicio del procedimiento, pues si no puede ser que nunca acabemos el listado, porque siempre se inicie
desde el principio, o bien que se generen errores de apertura de archivos, o posicionamientos inesperados, o
parecidos.
Por lo tanto hay que realizar todas las tareas previas al inicio fuera de ese procedimiento para evitar su
duplicado y consecuente error.
Por otro lado tampoco sirve realizar algunas tareas en el procedimiento desde el que se llama al objeto
PrintDocument, pues como es un evento, no se ejecuta en el orden de llamada, sino después de que se a
ejecutado el procedimiento, por lo que si se
Apertura de archivos
Llamada a PrintDocument
Cerrado de archivos
cuando se ejecuta el PrintDocument, los archivos están cerrados.
Cuando estamos usando el objeto PrintPreviewDialog, no se puede colocar el objeto en tiempo de
diseño en el formulario si deseamos que se pueda ejecutar el listado más de una vez, ya que la segunda vez
da error por que el objeto no está disponible.
La solución es crear una instancia de ese objeto en tiempo de ejecución en el programa, de esa forma
queda resuelto el problema.
1
En fin esta es la entrada, pero a pesar de todo, una vez controlado estas incidencias, la impresión
funciona.
1.2 Paso a paso.
Desde el interior hacia el exterior.
Vamos a ver la impresión de dentro a fuera, empezando por la impresión de una línea de detalle
Los pasos que hemos contemplado son:
Inicio de listado
Cabeceras
Detalle
Fin de página
Fin de listado
para el ejemplo es suficiente.
complicar el tema.
1.2.1 Definición.
El procedimiento de impresión que vamos a ver está basado en el uso de un vector en el que se
almacenan los datos de los campos que se van a imprimir.
Estos datos son el título y su coordenada X, en su mínima expresión, esto se puede enriquecer, pero
Por lo que el primer paso es ver como cargar ese vector y calcular la coordenada X de cada campo.
Este procedimiento también es susceptible de mejoras, pero se trata de ver un ejemplo sencillo y no
Estructura del vector para su creación.
En esta estructura se pueden añadir todos aquellos parámetros que permiten potenciar el diseño del
listado a nivel de campos, color, coordenada Y para casos especiales, subcabeceras, etc.
Public Structure CabecDetalle
Public Texto As String
Public Cx As Long
End Structure
Crear el vector, a nivel de formulario, conviene que tenga un campo de más, a nulos, porque ese campo
puede ser, es, el final del campo anterior, es decir el último, pero nos da la coordenada X exacta para un
posible enmarcado, o final de un subrayado, etc….
Dim TextoCabecera(6) As CabecDetalle
Estilos que se van a utilizar en el listado.
La definición se puede realizar a nivel de módulo.
Estos datos se pueden capturar de un archivo de personalización.
' Estilos de impresión
Public Est_Lin_Iden As Font = New Font("Arial", 6)
Public Est_Titulo As Font = New Font("Arial", 14, FontStyle.Italic)
Public Est_Cabecera As Font = New Font("Arial", 12)
Public Est_Lin_Det As Font = New Font("Arial", 10, FontStyle.Regular)
Public Est_Pie As Font = New Font("Arial", 12)
Public Est_Fin As Font = New Font("Arial", 12)
Procedimiento que calcula las coordenadas para su uso posterior.
2
El cálculo se basa en la fuente que se va a utilizar después en el momento de imprimir la línea de detalle.
Private Sub ConfigCabecera(ByRef Textocabecera() As CabecDetalle)
Dim Fuente As Font
Dim Lapiz As New System.Drawing.SolidBrush(System.Drawing.Color.Black)
Dim AnchoString As New SizeF
Dim Formato As New System.Drawing.StringFormat
Dim Cx As Long
Dim Grafico As Graphics = Me.CreateGraphics
Dim X As Integer
Fuente = Est_Lin_Det
' Campos del listado
Textocabecera(0).Texto = "Código "
Textocabecera(1).Texto = "Nombre "
Textocabecera(2).Texto = "Apellido 1 "
Textocabecera(3).Texto = "Apellido 2 "
Textocabecera(4).Texto = "Domicilio "
Textocabecera(5).Texto = ""
' Formato del texto
Formato.FormatFlags = StringFormatFlags.MeasureTrailingSpaces
' Margen lateral
Cx = Clng(Hoja.DefaultPageSettings.Margins.Left)
' Fuente a utilizar
Fuente = Est_Lin_Det
' Bucle de cálculo
While X < UBound(Textocabecera)
Textocabecera(X).Cx = Cx
' Ancho del texto
AnchoString
Grafico.MeasureString(StrDup(Len(Textocabecera(X).Texto), "n"), Fuente)
Cx = CLng(Cx + AnchoString.Width)
X = X + 1
End While
End Sub
=
El ancho del campo se calcula a partir de una letra de referencia generando una cadena con ella, en el
ejemplo se ha usado la “n”, que ni es muy ancha ni muy estrecha. Hay que tener presente que se usan fuentes
del tipo TrueType, no de ancho fijo.
Este procedimiento debe llamarse desde el evento Load, de esa forma solo se ejecuta una vez.
1.2.2 Línea de detalle.
En este procedimiento se recibe el registro de datos del archivo que se va a imprimir, y se utiliza para
colocar cada campo en su sitio las coordenadas X Y de rigor,
La coordenada X es la que se ha calculado antes en la fase de configuración.
La coordenada Y se va calculando para cada fase del listado.
En el caso de éste procedimiento, se basa en la suma de la altura de la fuente utilizada a una variable
llamada Cy, que se pasa ByRef.
Este incremento puede alterarse y de esa forma cambiar el espacio interlinea.
El valor de esa variable es el que se usará como referencia para el control de cambio de página al
superar un determinado valor del alto del objeto.
3
Private Sub Detalle(ByVal e As System.Drawing.Printing.PrintPageEventArgs, _
ByRef Cy As Long, _
ByVal Registro As Archivo)
Dim Fuente As Font
Dim Pincel As New System.Drawing.SolidBrush(System.Drawing.Color.Black)
Fuente = Est_Lin_Det
With Registro
e.Graphics.DrawString(.Expe, Fuente, Pincel, TextoCabecera(0).Cx, Cy)
e.Graphics.DrawString(.Nomb, Fuente, Pincel, TextoCabecera(1).Cx, Cy)
e.Graphics.DrawString(.Ape1, Fuente, Pincel, TextoCabecera(2).Cx, Cy)
e.Graphics.DrawString(.Ape2, Fuente, Pincel, TextoCabecera(3).Cx, Cy)
e.Graphics.DrawString(.Domi, Fuente, Pincel, TextoCabecera(4).Cx, Cy)
End With
‘ Incremento de la coordenada Y
Cy = Cy + Fuente.Height
End Sub
1.2.3 Cabeceras.
La cabecera puede crearse todo lo detallada que se desee, en el ejemplo se ha utilizado
Línea de identificación
Título
Cabecera de detalle.
Private Sub Cabeceras(ByRef Cy As Long, _
ByVal
System.Drawing.Printing.PrintPageEventArgs)
LineaIden(Cy, ContPag, e) ' Línea de identificación
Titulo(Cy, e, "Listado archivo secuencial") ' Título del listado
Cabecera(Cy, TextoCabecera, e) ' Cabecera de detalle
End Sub
e
As
Los procedimientos llamados desde este procedimiento son los siguientes
Public Sub LineaIden(ByRef Cy As Long, _
ByRef ContPag As Integer, _
ByVal e As System.Drawing.Printing.PrintPageEventArgs)
Dim Fuente As Font
Dim Pincel As New System.Drawing.SolidBrush(System.Drawing.Color.Black)
Dim Alto As Long = e.PageSettings.PaperSize.Height
Dim Ancho As Long = e.PageSettings.PaperSize.Width
Dim Cx As Long ' Coordenada horizontal
Dim Texto As String
Fuente = Est_Lin_Iden
ContPag = ContPag + 1
Cy = CLng(Alto * 0.02) ' Avance de línea con respecto al borde
superior
Cx = CLng(Ancho * 0.05)
Texto = "Archivos s
Comentarios de: 1. Vb .Net 2005 - Impresión (0)
No hay comentarios