Impresion con PrintDialog

04/08/2006 - 01:04 por Antonio | Informe spam
Hola de nuevo,
Ya parece que voy manejando algo el componente PrintDocument.
Hasta el momento me va todo bien si tengo que imprimir una pag. solo, pero
si las lineas que quiero imprimir sobre pasa la pag. ya no me va tan bien.
Os explico, cuando imprimo mas de una pag. me sobre escribe el texto en la
misma pag., os paso el codigo y si alguien sabe donde tengo que corregir le
agradeceria mucho que me lo indicase.

for (int i = 0; i <= wh.nodos.Length - 1; i++)

{

letra = new Font("Bookman Old Style", 10, FontStyle.Italic);

float lineasPag = ev.MarginBounds.Height /
letra.GetHeight(ev.Graphics);//calculamos las lineas que caben en la pag.

posicionY = ev.MarginBounds.Top + (lineasEscritas *
letra.GetHeight(ev.Graphics));//nos colocamos en posicion para escribir una
linea

cadena = wh.nodos[i].Text; //le asignamos el titulo...

ev.Graphics.DrawString(cadena, letra, Brushes.Black, ev.MarginBounds.Left,
posicionY);//...y lo imprimimos

lineasEscritas++;

if ((lineasEscritas * letra.GetHeight(ev.Graphics)) >
ev.MarginBounds.Height)// si el ancho de lineas supera el ancho de la hoja
creamos otra pag.

{

lineasEscritas = 0;

ev.HasMorePages = true;

}

else

ev.HasMorePages = false;

for (int j = 0; j <= texto.Lines.Length - 1; j++)//ahora imprimimos el texto
del marcador

{

letra = new Font("Bookman Old Style", 10, FontStyle.Regular);

cadena = texto.Lines[j];

posicionY = ev.MarginBounds.Top + (lineasEscritas *
letra.GetHeight(ev.Graphics));//nos volvemos a colocar en poscion para
imprimir otra linea

ev.Graphics.DrawString(cadena, letra, Brushes.Blue, ev.MarginBounds.Left,
posicionY);

lineasEscritas++;

if ((lineasEscritas * letra.GetHeight(ev.Graphics)) >
ev.MarginBounds.Height)

{

lineasEscritas = 0;

ev.HasMorePages = true;

}

else

ev.HasMorePages = false;

}

}

}

LineasEscritas es de tipo entero que se va incrementando conforme voy
imprimiendo lineas.

Texto es un richTextBox.

Preguntas similare

Leer las respuestas

#1 Octavio Hernandez
04/08/2006 - 11:41 | Informe spam
Antonio,

El problema es que el evento PrintPage es llamado para cada página del
documento, y en cada llamada tú vuelves a empezar por i = 0...
Sugerencias:

a) Cambia el bucle for por un bucle while:

while (i < wh.nodos.Length)
{
// todo lo demás...
i++;
}

b) Saca la variable i FUERA del evento PrintPage, para que conserve su valor
entre llamadas:

private int i;

private void PrintPage( // etc...

c) Inicializa i a cero en el evento BeginPrint del PrintDocument, para que
empiece de cero cada vez que ordenes una nueva impresión.

OJO: No entiendo exactamente la lógica de impresión que utilizas,
probablemente tengas que hacer lo mismo con la variable 'j'.

Slds - Octavio



"Antonio" escribió en el mensaje
news:
Hola de nuevo,
Ya parece que voy manejando algo el componente PrintDocument.
Hasta el momento me va todo bien si tengo que imprimir una pag. solo, pero
si las lineas que quiero imprimir sobre pasa la pag. ya no me va tan bien.
Os explico, cuando imprimo mas de una pag. me sobre escribe el texto en la
misma pag., os paso el codigo y si alguien sabe donde tengo que corregir
le agradeceria mucho que me lo indicase.

for (int i = 0; i <= wh.nodos.Length - 1; i++)

{

letra = new Font("Bookman Old Style", 10, FontStyle.Italic);

float lineasPag = ev.MarginBounds.Height /
letra.GetHeight(ev.Graphics);//calculamos las lineas que caben en la pag.

posicionY = ev.MarginBounds.Top + (lineasEscritas *
letra.GetHeight(ev.Graphics));//nos colocamos en posicion para escribir
una linea

cadena = wh.nodos[i].Text; //le asignamos el titulo...

ev.Graphics.DrawString(cadena, letra, Brushes.Black, ev.MarginBounds.Left,
posicionY);//...y lo imprimimos

lineasEscritas++;

if ((lineasEscritas * letra.GetHeight(ev.Graphics)) >
ev.MarginBounds.Height)// si el ancho de lineas supera el ancho de la hoja
creamos otra pag.

{

lineasEscritas = 0;

ev.HasMorePages = true;

}

else

ev.HasMorePages = false;

for (int j = 0; j <= texto.Lines.Length - 1; j++)//ahora imprimimos el
texto del marcador

{

letra = new Font("Bookman Old Style", 10, FontStyle.Regular);

cadena = texto.Lines[j];

posicionY = ev.MarginBounds.Top + (lineasEscritas *
letra.GetHeight(ev.Graphics));//nos volvemos a colocar en poscion para
imprimir otra linea

ev.Graphics.DrawString(cadena, letra, Brushes.Blue, ev.MarginBounds.Left,
posicionY);

lineasEscritas++;

if ((lineasEscritas * letra.GetHeight(ev.Graphics)) >
ev.MarginBounds.Height)

{

lineasEscritas = 0;

ev.HasMorePages = true;

}

else

ev.HasMorePages = false;

}

}

}

LineasEscritas es de tipo entero que se va incrementando conforme voy
imprimiendo lineas.

Texto es un richTextBox.


Respuesta Responder a este mensaje
#2 Antonio
04/08/2006 - 17:23 | Informe spam
gracias Octavio por tu interes, al final he decidido cambiar el codigo.
Lo que intentava hacer es coger las cadenas directamente desde componentes,
por eso todo el follon.
Al final he decidido crear un archivo con el texto que quiero imprimir y
leer desde ahi las lineas.
Este es el codigo:

private void doc_PrintPage(object sender, PrintPageEventArgs ev)

{

float lineasPag = 0;

float posicionY = 0;

int contador = 0;

float margenIzq = ev.MarginBounds.Left;

float margenArr = ev.MarginBounds.Top;

string linea = null;

lineasPag = ev.MarginBounds.Height / letra.GetHeight(ev.Graphics);

while (contador < lineasPag && ((linea = leeF.ReadLine()) != null))

{

posicionY = margenArr + (contador * letra.GetHeight(ev.Graphics));

if ((linea.Length > 1) && (linea.Substring(0, 1) == "¬"))

{

letra = new Font("Bookman Old Style", 10, FontStyle.Italic);

ev.Graphics.DrawString(linea, letra, Brushes.Black, margenIzq, posicionY,
new StringFormat());

}

else

{

letra = new Font("Bookman Old Style", 10, FontStyle.Regular);

ev.Graphics.DrawString(linea, letra, Brushes.Blue, margenIzq, posicionY, new
StringFormat());

}

contador++;

}

if (linea != null)

ev.HasMorePages = true;

else

ev.HasMorePages = false;

}

En un principio no queria crear otro archivo, pero me he visto ya impotente
ante la circunstancia y lo he creado.
Lo dicho muchas gracias por tu ayuda.

"Octavio Hernandez" escribió en el mensaje
news:%
Antonio,

El problema es que el evento PrintPage es llamado para cada página del
documento, y en cada llamada tú vuelves a empezar por i = 0...
Sugerencias:

a) Cambia el bucle for por un bucle while:

while (i < wh.nodos.Length)
{
// todo lo demás...
i++;
}

b) Saca la variable i FUERA del evento PrintPage, para que conserve su
valor entre llamadas:

private int i;

private void PrintPage( // etc...

c) Inicializa i a cero en el evento BeginPrint del PrintDocument, para que
empiece de cero cada vez que ordenes una nueva impresión.

OJO: No entiendo exactamente la lógica de impresión que utilizas,
probablemente tengas que hacer lo mismo con la variable 'j'.

Slds - Octavio



"Antonio" escribió en el mensaje
news:
Hola de nuevo,
Ya parece que voy manejando algo el componente PrintDocument.
Hasta el momento me va todo bien si tengo que imprimir una pag. solo,
pero si las lineas que quiero imprimir sobre pasa la pag. ya no me va tan
bien.
Os explico, cuando imprimo mas de una pag. me sobre escribe el texto en
la misma pag., os paso el codigo y si alguien sabe donde tengo que
corregir le agradeceria mucho que me lo indicase.

for (int i = 0; i <= wh.nodos.Length - 1; i++)

{

letra = new Font("Bookman Old Style", 10, FontStyle.Italic);

float lineasPag = ev.MarginBounds.Height /
letra.GetHeight(ev.Graphics);//calculamos las lineas que caben en la pag.

posicionY = ev.MarginBounds.Top + (lineasEscritas *
letra.GetHeight(ev.Graphics));//nos colocamos en posicion para escribir
una linea

cadena = wh.nodos[i].Text; //le asignamos el titulo...

ev.Graphics.DrawString(cadena, letra, Brushes.Black,
ev.MarginBounds.Left, posicionY);//...y lo imprimimos

lineasEscritas++;

if ((lineasEscritas * letra.GetHeight(ev.Graphics)) >
ev.MarginBounds.Height)// si el ancho de lineas supera el ancho de la
hoja creamos otra pag.

{

lineasEscritas = 0;

ev.HasMorePages = true;

}

else

ev.HasMorePages = false;

for (int j = 0; j <= texto.Lines.Length - 1; j++)//ahora imprimimos el
texto del marcador

{

letra = new Font("Bookman Old Style", 10, FontStyle.Regular);

cadena = texto.Lines[j];

posicionY = ev.MarginBounds.Top + (lineasEscritas *
letra.GetHeight(ev.Graphics));//nos volvemos a colocar en poscion para
imprimir otra linea

ev.Graphics.DrawString(cadena, letra, Brushes.Blue, ev.MarginBounds.Left,
posicionY);

lineasEscritas++;

if ((lineasEscritas * letra.GetHeight(ev.Graphics)) >
ev.MarginBounds.Height)

{

lineasEscritas = 0;

ev.HasMorePages = true;

}

else

ev.HasMorePages = false;

}

}

}

LineasEscritas es de tipo entero que se va incrementando conforme voy
imprimiendo lineas.

Texto es un richTextBox.






email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida