Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

problemas de impresion
Ir a página 1, 2  Siguiente
 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: problemas de impresion Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

¿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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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 Smile

Muchas gracias
Saludos
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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 Smile

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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 Laughing

Muchísimas gracias _Leo
Saludos
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

por dios, que quiten el jodio Oso Madroño de madrid y pongan una estatua de Leo..... x-D merecido lo tiene ....
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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. Very Happy
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.