Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   ShowProgress en TProgressBar (https://www.clubdelphi.com/foros/showthread.php?t=87869)

Angel.Matilla 11-03-2015 10:02:39

ShowProgress en TProgressBar
 
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:
Código PHP:

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:
Código PHP:

private:   // User declarations 

    
void __fastcall CmQrProgressUpdate(TMessagemsg
    { 
        
ProgressBar1->Position msg.WParamLo
        
inherited::Dispatch(&msg); 
    } 
    
BEGIN_MESSAGE_MAP 
        MESSAGE_HANDLER
(CM_QRPROGRESSUPDATETMessageCmQrProgressUpdate
    
END_MESSAGE_MAP(inherited

Y, evidentemente:
Código PHP:

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.


¿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
Código PHP:

#include <QRPrntr.hpp> 

Código PHP:

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

Cita:

Empezado por Ñuño Martínez (Mensaje 490037)
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:
Código:

if (Sender->QRPrinter->Client->ClassNameIs("TQRProgressForm"))
En concreto salta cuando entra en systobj.h en:
Código:

bool __fastcall ClassNameIs(const AnsiString string)
{
    return ClassNameIs(ClassType(), string);
}

Cita:

Empezado por escafandra (Mensaje 490043)
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
Código:

#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)):
Código:

if (Sender->QRPrinter->Client->ClassNameIs("TQRProgressForm"))
se "abre" el include systobj.h; en concreto en la línea 87:
Código:

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

Cita:

Empezado por Ñuño Martínez (Mensaje 503202)
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.


La franja horaria es GMT +2. Ahora son las 09:03:11.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi