PDA

Ver la Versión Completa : Problema clase PrintDocument


mamen
29-03-2007, 14:27:30
Hola a todos necesito ayuda urgente, me estoy volviendo loca con este tema. Estoy utilizando la clase PrintDocument para imprimir un archivo q tengo en memoria en un MemoryStream, pero el ejemplo viene en visual basic mis preguntas son:
1. No entiendo cómo relaciona el PrintDocument con el StreamReader.
2. Esta linea de codigo

AddHandler pd.PrintPage, AddressOf Me.pd_PrintPage
cómo se traduce a delphi.

3. Cómo se asocia el parametro ev As PrintPageEventArgs del método pd_PrintPage

Por favor, agradecería que alguien me pudiera ayudar. Muchas gracias por adelantado. El código completo lo adjunto a continuacion.

CODIGO COMPLETO


Public Class PrintingExample
Inherits System.Windows.Forms.Form
Private components As System.ComponentModel.Container
Private printButton As System.Windows.Forms.Button
Private printFont As Font
Private streamToPrint As StreamReader

Public Sub New()
' The Windows Forms Designer requires the following call.
InitializeComponent()
End Sub

' The Click event is raised when the user clicks the Print button.
Private Sub printButton_Click(sender As Object, e As EventArgs)
Try
streamToPrint = New StreamReader("C:\My Documents\MyFile.txt")
Try
printFont = New Font("Arial", 10)
Dim pd As New PrintDocument()
AddHandler pd.PrintPage, AddressOf Me.pd_PrintPage
pd.Print()
Finally
streamToPrint.Close()
End Try
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Sub

' The PrintPage event is raised for each page to be printed.
Private Sub pd_PrintPage(sender As Object, ev As PrintPageEventArgs)
Dim linesPerPage As Single = 0
Dim yPos As Single = 0
Dim count As Integer = 0
Dim leftMargin As Single = ev.MarginBounds.Left
Dim topMargin As Single = ev.MarginBounds.Top
Dim line As String = Nothing

' Calculate the number of lines per page.
linesPerPage = ev.MarginBounds.Height / printFont.GetHeight(ev.Graphics)

' Print each line of the file.
While count < linesPerPage
line = streamToPrint.ReadLine()
If line Is Nothing Then
Exit While
End If
yPos = topMargin + count * printFont.GetHeight(ev.Graphics)
ev.Graphics.DrawString(line, printFont, Brushes.Black, leftMargin, yPos, New StringFormat())
count += 1
End While

' If more lines exist, print another page.
If Not (line Is Nothing) Then
ev.HasMorePages = True
Else
ev.HasMorePages = False
End If
End Sub

__hector
29-03-2007, 20:22:01
Hola,

Nunca he usado la clase PrintDocument, pero para aclarar tus dudas (aunque genere otras):

- El AddressOf es la forma en la que VB maneja los delegados. En tu caso particular, al parecer la clase PrintDocument, al llamar el metodo Print(), dispara el evento PrintPage (pd.PrintPage). Lo que hace AddressOf es decir: cuando se dispare el evento PrintPage del objeto pd de tipo PrintDocument, yo quiero que tu me ejecutes el metodo pd_PrintPage que yo tengo definido en mi clase.

Este metodo (pd_PrintPage) tiene que cumplir con el "signature" (tipo y numero de parametros) definido para ese evento, en tu caso, recibir un object y PrintPageEventArgs, en sender y ev, como parametros del metodo.

Eso lo puedes ver con cualquier otro componente que arrastres al formulario, especialmente en c#, ya que vb oculta (lamentablemente) esto del programador, y lo maneja con un ... methodname() Handles control.Evento. Son cosas del lenguaje.

Sobre lo segundo, la asociacion no se da entre el stream y el printdocument, sino en:


line = streamToPrint.ReadLine()
If line Is Nothing Then
Exit While
End If


Va leyendo linea a linea del stream, y lo va imprimiendo con el drawstring (eso supongo). Fijate en las condiciones que evaluan lacantidad de lineas que pueden imprimirse por pagina, y toma en cuenta que cada vez que se hace un .ReadLine() se lee la linea actual y el puntero se mueve a la siguiente linea.