| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
bosoft Master

Registrado: 23 Oct 2005Mensajes: 342
|
Publicado: Mie 17 May, 2006 6:30 pm Asunto: problemas de impresion |
|
|
estoy modificando una impresion, la cual se creó sobre un bitmap->canvas y en pixels. En inicio estaba hecha para una impresora epson stylus. Hasta aqui todo correcto
tengo que lanzar la impresion en una laser. El problema era que el bitmap modificaba el tamaño para adecuarlo a la impresora. Cuando ha llegado la laser, con una resolucion de 600x600, el programa dice que no tiene memoria suficiente.
Yo hago la modificacion usando StretchDraw del printer, pero no chuta de ninguna forma, mejor dicho, imprime la pagina en blanco.
Ya he dicho que "proba" es un bitmap declarado al principio.
| Código: |
Graphics::TBitmap *proba = new Graphics::TBitmap();
if(impri->Execute()==false) return; //TPrinterSetupDialog
ancho=Printer()->PageWidth;
largo=Printer()->PageHeight;
//proba->Height=largo; -----> viejo codigo
//proba->Width=ancho; -----> viejo codigo
// pixels de la stylus //
proba->Height=3969; //largo
proba->Width=2892; //ancho
|
el codigo final es:
| Código: |
// para saber si hay algo "dibujado"
Clipboard()->Assign(proba);
Image1->Picture->Assign(Clipboard());
grafic = Rect(0,0,ancho,largo);
Printer()->Copies=1;
Printer()->BeginDoc();
Printer()->Canvas->StretchDraw(grafic,proba);
Printer()->EndDoc();
delete proba;
|
Os explico:
Las lineas del Clipboard e Image las he puesto para saber si habia o no algo en el bitmap, y si que esta todo.
Pero las impresoras, incluida la de acrobat PDF, lanzan las paginas en blanco excepto la stylus.
Alguna idea?
Saludos, Bosoft |
|
| Volver arriba |
|
 |
bosoft Master

Registrado: 23 Oct 2005Mensajes: 342
|
Publicado: Mie 14 Dic, 2016 9:16 pm Asunto: |
|
|
Aunque este post es viejo, lo vuelvo a subir por ver si a alguien se le ocurre alguna solución
Para solucionarlo desde entonces, simplemente puse las impresoras a 300ppp. Pero ahora ya hay impresoras que no "bajan" de 600
El problema creo que está que no tiene memoria suficiente para crear la instancia de la impresora, pero si hacemos pruebas con la misma máquina (impresión de prueba desde el driver) funciona correctamente, lo cual me induce a pensar que es un bug del rad2007
Espero que alguien me tire un cable porque estoy mas que bloqueado
Saludos |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Vie 16 Dic, 2016 11:55 am Asunto: |
|
|
¿Te falla en todas las versiones de Windows? Lo digo porque a mí en Windows 10 Pro x64 me deja escalar a tamaños grandes sin problema.
Haz una prueba así a ver qué tal:
| Código: | //Añadimos: #include<memory>
//En caso de estar usando versiones más actuales
//podemos cambiar auto_ptr por unique_ptr
std::auto_ptr<Graphics::TBitmap> bmp(new Graphics::TBitmap);
bmp->LoadFromFile("c:\\prueba.bmp");
if (PrinterSetupDialog1->Execute())
{
std::auto_ptr<TMetafile> meta(new TMetafile);
TRect pag(0, 0, Printer()->PageWidth, Printer()->PageHeight);
meta->Width = bmp->Width;
meta->Height = bmp->Height;
std::auto_ptr<TMetafileCanvas> mcanvas(new TMetafileCanvas(meta.get(), 0));
Printer()->BeginDoc();
mcanvas->Draw(0, 0, bmp.get());
mcanvas.reset();
Printer()->Canvas->StretchDraw(pag, meta.get());
Printer()->EndDoc();
} |
|
|
| Volver arriba |
|
 |
bosoft Master

Registrado: 23 Oct 2005Mensajes: 342
|
Publicado: Vie 16 Dic, 2016 5:24 pm Asunto: |
|
|
Gracias _Leo
Si, me falla siempre en XP y algunas veces en Win10
Yo entendí (leyendo por ahí) que era por memoria, pero no consigo saberlo a ciencia cierta.
Hasta el lunes no podré probar en esa máquina puesto que en la mía de XP hago pruebas a 600 y solo falla muy poquitas veces. Te digo algo.
Gracias y saludos |
|
| Volver arriba |
|
 |
bosoft Master

Registrado: 23 Oct 2005Mensajes: 342
|
Publicado: Sab 17 Dic, 2016 11:22 am Asunto: |
|
|
Hola _Leo
Ya he implementado la modificación en el programa y en la maquina de XP que tengo funciona, aunque tengo que decir que antes fallaba pocas veces
Mi pregunta es: ¿puedo hacer algo para saber que es lo que realmente falla?
Puedo guardar paso a paso en un txt (u otro formato) todos los valores que quiera para saber que es lo que ha fallado.
Claro está que si funciona correctamente no servirán para nada esos datos, pero lo digo porque me tengo que desplazar para hacer las pruebas.
Gracias por tu ayuda
Saludos |
|
| Volver arriba |
|
 |
bosoft Master

Registrado: 23 Oct 2005Mensajes: 342
|
Publicado: Lun 19 Dic, 2016 8:29 pm Asunto: |
|
|
Perfecto _Leo. Ha funcionado perfectamente
Lo que no entiendo es el motivo del fallo y ahora tampoco entiendo porque funciona
Si algún día tienes un momento y tienes ganas de explicarlo
Muchas gracias
Saludos |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Lun 19 Dic, 2016 10:53 pm Asunto: |
|
|
| bosoft escribió: | Perfecto _Leo. Ha funcionado perfectamente
Lo que no entiendo es el motivo del fallo y ahora tampoco entiendo porque funciona
Si algún día tienes un momento y tienes ganas de explicarlo
Muchas gracias
Saludos |
Te preguntaba si te pasaba con todas las versiones de windows porque es el XP el que principalmente no se lleva muy bien con bitmaps de gran tamaño, y claro al escalarlo falla. Parece que este problema no lo tiene al trabajar con metafiles.
Para lo de los errores tienes distintas opciones, una de ellas es usar las herramientas para hacer una depuración remota que traen todas las versiones del builder. Así puedes hacer la depuración en la máquina del cliente por internet y sin necesidad de instalar C++Builder en su máquina ni desplazarte. Aunque la mayoría de las veces es más que suficiente con un log detallado de los errores y excepciones, lo de la depuración remota está bien sobre todo para algún error que se resiste. |
|
| Volver arriba |
|
 |
bosoft Master

Registrado: 23 Oct 2005Mensajes: 342
|
Publicado: Mar 20 Dic, 2016 8:53 am Asunto: |
|
|
Muchas gracias por la explicación. No había pensado en los metafiles
En un win10 también a llegado a fallar, pero pocas veces. Como el programa será el mismo, espero acabar con este "problema" con tu solución
En cuanto a lo del debug, solo te preguntaba si querías que pusiese algún log (o algo) para comprobar por si volvía a fallar.
En este caso me tenía que desplazar puesto que en remoto me era imposible saber si la impresora hacía la impresión o no si no tenía a alguien al teléfono.
Una cosa que descubrí antes de instalar las actualizaciones es que en la ventana de trabajos de la impresora, que previamente había pausado, los trabajos solo ocupaban 25K cuando lo normal eras 30M lo cual indica que desde el programa no se "imprimía" correctamente. Si llego a saberlo antes me ahorro el desplazarme
Muchísimas gracias _Leo
Saludos |
|
| Volver arriba |
|
 |
bosoft Master

Registrado: 23 Oct 2005Mensajes: 342
|
Publicado: Mie 14 Jun, 2017 6:41 pm Asunto: |
|
|
Hola _Leo. Después de tanto tiempo me he encontrado con un fallo en la impresión por metafile que me pasaste. El error viene al hacer la impresión de mas de una hoja
| _Leo escribió: | ¿Te falla en todas las versiones de Windows? Lo digo porque a mí en Windows 10 Pro x64 me deja escalar a tamaños grandes sin problema.
Haz una prueba así a ver qué tal:
| Código: | //Añadimos: #include<memory>
//En caso de estar usando versiones más actuales
//podemos cambiar auto_ptr por unique_ptr
std::auto_ptr<Graphics> bmp(new Graphics::TBitmap);
bmp->LoadFromFile("c:\\prueba.bmp");
if (PrinterSetupDialog1->Execute())
{
std::auto_ptr<TMetafile> meta(new TMetafile);
TRect pag(0, 0, Printer()->PageWidth, Printer()->PageHeight);
meta->Width = bmp->Width;
meta->Height = bmp->Height;
std::auto_ptr<TMetafileCanvas> mcanvas(new TMetafileCanvas(meta.get(), 0));
Printer()->BeginDoc();
mcanvas->Draw(0, 0, bmp.get());
mcanvas.reset();
Printer()->Canvas->StretchDraw(pag, meta.get());
Printer()->EndDoc();
} |
|
El código actual es mas o menos así:
| Código: |
std::auto_ptr<Graphics> bmp(new Graphics::TBitmap);
std::auto_ptr<TMetafile> meta(new TMetafile);
meta->Width = bmp->Width;
meta->Height = bmp->Height;
std::auto_ptr<TMetafileCanvas> mcanvas(new TMetafileCanvas(meta.get(), 0));
primerapagina=true;
impresion=false;
for(;;paginas++){
.
.
.
// generar una pagina y guardar en bmp
if (PrinterSetupDialog1->Execute()==false) return;
TRect pag(0, 0, Printer()->PageWidth, Printer()->PageHeight);
if(primerapagina) Printer()->BeginDoc();
primerapagina==false;
impresion=true;
mcanvas->Draw(0, 0, bmp.get()); // aquí error en la segunda hoja
mcanvas.reset();
Printer()->Canvas->StretchDraw(pag, meta.get());
Printer()->NewPage();
}
if(impresion==true) Printer()->EndDoc(); |
El error que me aparece es
Access violation at address 004A8340 in module 'winextract.exe'. Read of address 00000000.
¿Hay algo mal que no veo?
gracias por anticipado
Saludos |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Mie 14 Jun, 2017 11:00 pm Asunto: |
|
|
Lo mejor cuando se trata de comprobar errores por el foro es hacer un pequeño ejemplo independiente que sea solo copiar y pegar, que reproduzca el problema, y no haya que añadir más código..
Por si te sirve, el mismo ejemplo imprimiendo varias páginas con bitmaps diferentes:
| Código: |
std::auto_ptr<TStringList> lista(new TStringList);
lista->Add("C:\\prueba.bmp");
lista->Add("C:\\otra prueba.bmp");
lista->Add("C:\\ultima.bmp");
if (PrinterSetupDialog1->Execute())
{
Printer()->BeginDoc();
for (int pagina = 0; pagina < lista->Count; pagina++)
{
if (pagina) Printer()->NewPage();
std::auto_ptr<Graphics::TBitmap> bmp(new Graphics::TBitmap);
bmp->LoadFromFile(lista->Strings[pagina]);
std::auto_ptr<TMetafile> meta(new TMetafile);
TRect pag(0, 0, Printer()->PageWidth, Printer()->PageHeight);
meta->Width = bmp->Width;
meta->Height = bmp->Height;
std::auto_ptr<TMetafileCanvas> mcanvas(new TMetafileCanvas(meta.get(), 0));
mcanvas->Draw(0, 0, bmp.get());
mcanvas.reset();
Printer()->Canvas->StretchDraw(pag, meta.get());
}
Printer()->EndDoc();
} |
|
|
| Volver arriba |
|
 |
bosoft Master

Registrado: 23 Oct 2005Mensajes: 342
|
Publicado: Jue 15 Jun, 2017 7:40 am Asunto: |
|
|
Muchísimas gracias _Leo
Lo que no entiendo es porque cambiando las declaraciones funciona y si están en "global" dentro de la función no
Gracias
Saludos |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Jue 15 Jun, 2017 10:28 am Asunto: |
|
|
El problema es que en la línea "mcanvas.reset()" estamos liberando el Canvas del Metafile (necesario ya que el canvas no se vuelca en el Metafile hasta que se libera), por lo tanto en la siguiente vuelta del bucle tendremos el error.
Si prefieres declararlas fuera del bucle podrías hacer algo así:
| Código: |
std::auto_ptr<Graphics::TBitmap> bmp(new Graphics::TBitmap);
std::auto_ptr<TMetafile> meta(new TMetafile);
std::auto_ptr<TMetafileCanvas> mcanvas;
std::auto_ptr<TStringList> lista(new TStringList);
lista->Add("C:\\prueba.bmp");
lista->Add("C:\\otra prueba.bmp");
lista->Add("C:\\ultima.bmp");
if (PrinterSetupDialog1->Execute())
{
Printer()->BeginDoc();
for (int pagina = 0; pagina < lista->Count; pagina++)
{
if (pagina) Printer()->NewPage();
bmp->LoadFromFile(lista->Strings[pagina]);
TRect pag(0, 0, Printer()->PageWidth, Printer()->PageHeight);
meta->Width = bmp->Width;
meta->Height = bmp->Height;
mcanvas.reset(new TMetafileCanvas(meta.get(), 0));
mcanvas->Draw(0, 0, bmp.get());
mcanvas.reset();
Printer()->Canvas->StretchDraw(pag, meta.get());
}
Printer()->EndDoc();
} |
|
|
| Volver arriba |
|
 |
bosoft Master

Registrado: 23 Oct 2005Mensajes: 342
|
Publicado: Jue 15 Jun, 2017 12:11 pm Asunto: |
|
|
Ahhhh, ahora lo pillo. Ahí tenia el fallo. Al liberar el meta, en la siguiente pagina no existía
Gracias por tu infinita sabiduría y ayuda
Saludos |
|
| Volver arriba |
|
 |
Alpinador Lt Cmdr

Registrado: 21 Abr 2014Mensajes: 123
|
Publicado: Vie 07 Jul, 2017 10:04 am Asunto: |
|
|
| por dios, que quiten el jodio Oso Madroño de madrid y pongan una estatua de Leo..... x-D merecido lo tiene .... |
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Jue 13 Jul, 2017 6:06 pm Asunto: |
|
|
| Alpinador escribió: | | por dios, que quiten el jodio Oso Madroño de madrid y pongan una estatua de Leo..... x-D merecido lo tiene .... |
Aunque estoy de acuerdo, complicado; más que nada porque Leo vive, si no ha cambiado, en Lanzarote.  _________________ Un saludo
Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA) |
|
| Volver arriba |
|
 |
|