PDA

Ver la Versión Completa : ShowProgress en TProgressBar


Angel.Matilla
11-03-2015, 10:02:39
Estoy usando un código que me facilitaron en otro foro para que el ShowProgress al imprimir un documento con QuickReport se muestre en un TProgressBar en lugar de hacerlo en su propio formulario, que no me gusta ni por la estética que tiene ni por el botoncito de Cancel que incorpora.

El código es este:
1. En el BeforePrint del informe:
if (Sender->QRPrinter->Client->ClassNameIs("TQRProgressForm"))
Sender->QRPrinter->Client = Form1; // El Form donde queremos recibir CM_QRPROGRESSUPDATE 2. En el formulario que va a recibir la información:
private: // User declarations

void __fastcall CmQrProgressUpdate(TMessage& msg)
{
ProgressBar1->Position = msg.WParamLo;
inherited::Dispatch(&msg);
}
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(CM_QRPROGRESSUPDATE, TMessage, CmQrProgressUpdate)
END_MESSAGE_MAP(inherited)Y, evidentemente:
QuickReport1->ShowProgress = false;
QuickReport1->Print();Pero al tratar de ejecutar este código compilado con Builder 6 me da un error que no sé por donde enganchar.
http://sia1.subirimagenes.net/img/2015/03/10/150310052713555015.jpg

¿Alguien puede sugerirme alguna idea? O bien, como alternativa, como modificar el aspecto del panel en que se muestra el ShowProgress del propio QR.

Ñuño Martínez
15-03-2015, 14:28:02
Eso es que algún objeto no existe. Depura para saber dónde lanza la excepción, localiza qué es lo que falla y arréglalo.

escafandra
15-03-2015, 17:39:55
No reproduzco tu problema en Builder6.

prueba a ver si esto funciona para determinar si encuentras el nombre de la clase:
incluye esta línea en Form1.h
#include <QRPrntr.hpp>

void __fastcall TQuickReport2::QuickRepBeforePrint(TCustomQuickRep *Sender,
bool &PrintReport)
{
bool B = Sender->QRPrinter->Client->ClassNameIs("TQRProgressForm"); // debe ser true
String C = Sender->QRPrinter->Client->ClassName(); // Debe ser "TQRProgressForm"

if(Sender->QRPrinter->Client->ClassNameIs("TQRProgressForm"))
Sender->QRPrinter->Client = Form1; // El Form donde queremos recibir CM_QRPROGRESSUPDATE
}



Saludos.

Angel.Matilla
16-03-2015, 11:55:45
Eso es que algún objeto no existe. Depura para saber dónde lanza la excepción, localiza qué es lo que falla y arréglalo.
Los objetos que llama existen todos. La excepción la lanza en la línea del if:
if (Sender->QRPrinter->Client->ClassNameIs("TQRProgressForm")) En concreto salta cuando entra en systobj.h en:
bool __fastcall ClassNameIs(const AnsiString string)
{
return ClassNameIs(ClassType(), string);
}No reproduzco tu problema en Builder6.

prueba a ver si esto funciona para determinar si encuentras el nombre de la clase:
incluye esta línea en Form1.h
#include <QRPrntr.hpp>
Sigue dando el mismo error. Voy a rehacer el formulario, por si hubiera algo de código que no he visto y sea lo que produce el error.

Angel.Matilla
16-03-2015, 18:16:29
Aclarado, en parte, el problema. El error no venía producido por esa llamada para ver el progreso en un TStatusBar; hay otra "trampa": Como necesito un contador que numere los registros del informe y estaba definiendo dinámicamente un TQRSysData; es esto lo que provoca el error. Disculpadme por haberos dado la paliza y a ver si encuentro como crear ese elemento dinámicamente al generar el informe.

Angel.Matilla
04-03-2016, 19:19:38
Retomo este hilo porque, a pesar del tiempo transcurrido, pensaba que lo había solucionado pero no, me sigue dando el mismo error que comentaba en primer mensaje.

Corriendo la aplicación con el depurador (BCB 6, recuerdo) he comprobado que al ejecutar la línea con F7 (Trace into)):
if (Sender->QRPrinter->Client->ClassNameIs("TQRProgressForm"))se "abre" el include systobj.h; en concreto en la línea 87:
bool __fastcall ClassNameIs(const AnsiString string)
{
return ClassNameIs(ClassType(), string);
}Es al tratar de hacer el return es cuando se produce el error; la variable string definida en la declaración contiene el valor TQRProgressForm, pero no sé que demonios pasa. Probé a crear un proyecto con sólo dos formularios: uno con la barra de progreso y otro con un QuickReport, sin más historias y no me daba ningún error. ¿Pudiera ser por "algo"que haya en los formularios que hay debajo? No soy capaz de encontrar la respuesta.

Ñuño Martínez
10-03-2016, 13:08:27
Sigo pensando que es porque falta algún objeto en alguna parte. Por desgracia, nunca he usado Builder (he sido más de GCC), así que no sabría decirte.

Angel.Matilla
14-03-2016, 10:16:14
Sigo pensando que es porque falta algún objeto en alguna parte. Por desgracia, nunca he usado Builder (he sido más de GCC), así que no sabría decirte.
Gracias por tu respuesta. Yo estoy más en la idea que algo que hay definido en alguno de los formualrios choca con ese procedimiento. Lo he resuelto de otra forma, un poco pedestre, en el evento OnEndPage del TQuickReport.