 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
amas2 Lt

Registrado: 01 Jun 2004Mensajes: 91
|
Publicado: Mie 20 Oct, 2004 12:54 pm Asunto: Generación automatica de Reports |
|
|
Uso Qreport en BCB5. Creo un Tquickreport dinamicamente, siguiendo el Ejemplo de _LEO.
El usa como Origen de datos un TTable. Yo quiero usar un TDataset.
Pues bien no se en que fallo porque las TQRExpr no me funcionan.
| Código: | TQRExpr *QRDB;
QRDB = new TQRExpr(bandDetail);
QRDB->Parent = bandDetail;
QRDB->Master = qr;
QRDB->AutoSize = false;
QRDB->Transparent = true;
QRDB->Expression = cadena_q; |
Donde cadena_q es: '123'+datos.nombre
y en la creación del
| Código: |
qr = new TQuickRep(Application);
qr->DataSet = datos; //datos es un TDataSet
|
No hay forma!! alguien ve el error!!! Gracias. |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Mie 20 Oct, 2004 8:32 pm Asunto: |
|
|
Por si te sirve de algo, aquí el mismo ejemplo que había puesto, pero ahora como una función totalmente independiente, y como ejemplo en vez de usar un TQRDBText uso un TQRExpr:
| Código: | // Añadimos las siguientes cabeceras
// #include <QuickRpt.hpp>
// #include <Qrctrls.hpp>
void GenerarInforme(TDataSet* dataset, String titulo, TStrings* campos)
{
if (campos->Count < 1)
throw Exception("No hay campos seleccionados.");
static TQuickRep* qr = 0;
if (qr)
delete qr;
qr = new TQuickRep(Application);
qr->DataSet = dataset;
TQRBand* bandPageHeader = qr->CreateBand(rbPageHeader);
TQRBand* bandPageFooter = qr->CreateBand(rbPageFooter);
TQRBand* bandColumnHeader = qr->CreateBand(rbColumnHeader);
TQRBand* bandDetail = qr->CreateBand(rbDetail);
qr->Units = MM;
bandPageHeader->Size->Height = 10;
bandPageHeader->Frame->DrawBottom = true;
bandPageHeader->Frame->Color = clSilver;
bandPageHeader->Frame->Width = 2;
bandPageFooter->Size->Height = 15;
bandPageFooter->Frame->DrawTop = true;
bandPageFooter->Frame->Color = clSilver;
bandPageFooter->Frame->Width = 2;
bandColumnHeader->Color = clSilver;
TQRSysData* QRSysData = new TQRSysData(bandPageHeader);
QRSysData->Parent = bandPageHeader;
QRSysData->Data = qrsReportTitle;
QRSysData->AlignToBand = true;
QRSysData->Alignment = taCenter;
QRSysData->Font->Style = TFontStyles() << fsBold;
QRSysData->Top += 10;
QRSysData = new TQRSysData(bandPageFooter);
QRSysData->Parent = bandPageFooter;
QRSysData->Data = qrsPageNumber;
QRSysData->AlignToBand = true;
QRSysData->Alignment = taCenter;
QRSysData->Text = "Página ";
QRSysData->Top += 4;
// Calcula el alto y el ancho medio de una letra
TForm* mainForm = Application->MainForm;
mainForm->Canvas->Font->Assign(bandDetail->Font);
int charWidth = mainForm->Canvas->TextWidth("x");
int charHeight = mainForm->Canvas->TextHeight("Xg");
mainForm->Canvas->Font->Assign(mainForm->Font);
// Definimos la altura de las bandas de cabecera y detalle
bandColumnHeader->Height = charHeight + 6;
bandDetail->Height = charHeight + 2;
// Añade el texto
TQRLabel *QRLabel;
TQRExpr *QRExpr;
int pos = 0;
for (int i=0; i<campos->Count; i++)
{
String fieldName = campos->Strings[i];
TField* field = qr->DataSet->Fields->FieldByName(fieldName);
QRLabel = new TQRLabel(bandColumnHeader);
QRLabel->Parent = bandColumnHeader;
QRLabel->AutoSize = false;
QRLabel->Transparent = true;
QRLabel->Caption = fieldName;
QRLabel->Width = field->DisplayWidth * charWidth;
QRLabel->Left = pos;
QRLabel->Top = 2;
QRExpr = new TQRExpr(bandDetail);
QRExpr->Parent = bandDetail;
QRExpr->AutoSize = false;
QRExpr->Color = bandDetail->Color;
QRExpr->Left = pos;
QRExpr->Top = 2;
QRExpr->Width = QRLabel->Width;
QRExpr->Expression = "'->'+" + dataset->Name + "." + fieldName;
// Justificar a la derecha si es un campo numerico
switch(field->DataType)
{
case ftSmallint:
case ftInteger:
case ftAutoInc:
case ftLargeint:
QRExpr->Alignment = taRightJustify;
}
pos += QRLabel->Width + QRLabel->Font->Size;
}
// Cambia la orientación del papel dependiendo del ancho del texto
if (pos < bandDetail->Width)
qr->Page->Orientation = poPortrait;
else
qr->Page->Orientation = poLandscape;
qr->ReportTitle = titulo;
// Mostramos el report
qr->Preview();
} |
Un ejemplo de como usarla:
| Código: | TStringList* campos = new TStringList;
campos->Append("Nombre");
campos->Append("Provincia");
campos->Append("Fax");
GenerarInforme(Table1, "prueba", campos);
delete campos; |
También esta probada con DBExpress:
GenerarInforme(SQLTable1, "prueba", campos);
con Interbase:
GenerarInforme(IBTable1, "prueba", campos);
con ADO:
GenerarInforme(ADOQuery1, "prueba", campos);
...teóricamente debería funcionar con cualquier descendiente de TDataSet.
-----------------------------------------------------------------------
Bueno, lo anterior era como ejemplo de TQRExpr, la versión con TQRDBText quedaría así:
| Código: | void GenerarInforme(TDataSet* dataset, String titulo, TStrings* campos)
{
if (campos->Count < 1)
throw Exception("No hay campos seleccionados.");
static TQuickRep* qr = 0;
if (qr)
delete qr;
qr = new TQuickRep(Application);
qr->DataSet = dataset;
TQRBand* bandPageHeader = qr->CreateBand(rbPageHeader);
TQRBand* bandPageFooter = qr->CreateBand(rbPageFooter);
TQRBand* bandColumnHeader = qr->CreateBand(rbColumnHeader);
TQRBand* bandDetail = qr->CreateBand(rbDetail);
qr->Units = MM;
bandPageHeader->Size->Height = 10;
bandPageHeader->Frame->DrawBottom = true;
bandPageHeader->Frame->Color = clSilver;
bandPageHeader->Frame->Width = 2;
bandPageFooter->Size->Height = 15;
bandPageFooter->Frame->DrawTop = true;
bandPageFooter->Frame->Color = clSilver;
bandPageFooter->Frame->Width = 2;
bandColumnHeader->Color = clSilver;
TQRSysData* QRSysData = new TQRSysData(bandPageHeader);
QRSysData->Parent = bandPageHeader;
QRSysData->Data = qrsReportTitle;
QRSysData->AlignToBand = true;
QRSysData->Alignment = taCenter;
QRSysData->Font->Style = TFontStyles() << fsBold;
QRSysData->Top += 10;
QRSysData = new TQRSysData(bandPageFooter);
QRSysData->Parent = bandPageFooter;
QRSysData->Data = qrsPageNumber;
QRSysData->AlignToBand = true;
QRSysData->Alignment = taCenter;
QRSysData->Text = "Página ";
QRSysData->Top += 4;
// Calcula el alto y el ancho medio de una letra
TForm* mainForm = Application->MainForm;
mainForm->Canvas->Font->Assign(bandDetail->Font);
int charWidth = mainForm->Canvas->TextWidth("x");
int charHeight = mainForm->Canvas->TextHeight("Xg");
mainForm->Canvas->Font->Assign(mainForm->Font);
// Definimos la altura de las bandas de cabecera y detalle
bandColumnHeader->Height = charHeight + 6;
bandDetail->Height = charHeight + 2;
// Añade el texto
TQRLabel *QRLabel;
TQRDBText *QRDBText;
int pos = 0;
for (int i=0; i<campos->Count; i++)
{
String fieldName = campos->Strings[i];
TField* field = qr->DataSet->Fields->FieldByName(fieldName);
QRLabel = new TQRLabel(bandColumnHeader);
QRLabel->Parent = bandColumnHeader;
QRLabel->AutoSize = false;
QRLabel->Transparent = true;
QRLabel->Caption = fieldName;
QRLabel->Width = field->DisplayWidth * charWidth;
QRLabel->Left = pos;
QRLabel->Top = 2;
QRDBText = new TQRDBText(bandDetail);
QRDBText->Parent = bandDetail;
QRDBText->AutoSize = false;
QRDBText->Color = bandDetail->Color;
QRDBText->Left = pos;
QRDBText->Top = 2;
QRDBText->Width = QRLabel->Width;
QRDBText->DataSet = dataset;
QRDBText->DataField = fieldName;
// Justificar a la derecha si es un campo numerico
switch(field->DataType)
{
case ftSmallint:
case ftInteger:
case ftAutoInc:
case ftLargeint:
QRDBText->Alignment = taRightJustify;
}
pos += QRLabel->Width + QRLabel->Font->Size;
}
// Cambia la orientación del papel dependiendo del ancho del texto
if (pos < bandDetail->Width)
qr->Page->Orientation = poPortrait;
else
qr->Page->Orientation = poLandscape;
qr->ReportTitle = titulo;
// Mostramos el report
qr->Preview();
} |
... es solo un ejemplo sencillo, habría que mejorarlo para que funcione bien con cualquier tipo de campo, etc. |
|
| Volver arriba |
|
 |
amas2 Lt

Registrado: 01 Jun 2004Mensajes: 91
|
Publicado: Jue 21 Oct, 2004 9:40 am Asunto: Mil Gracias. |
|
|
Pues si ya se que esto es un foro y todo eso, pero viendo respuestas como esta me emociono!!!
Muchas Gracias LEO , por todo lo que has dejado de tu sabiduria en este foro, por todo lo que me has ayudado. Me quito el sombrero!!!
Estoy aprendiendo un monton con tus ejemplos!! Me faltan muchos quilometros para poder decir que soy un buen programador, por eso espero poder seguir aprendiendo de tus mensajes.
Gracias. |
|
| Volver arriba |
|
 |
amas2 Lt

Registrado: 01 Jun 2004Mensajes: 91
|
Publicado: Mie 29 Dic, 2004 11:41 am Asunto: Problema al eliminar |
|
|
Gracias de nuevo por tu inpagable!! repito inpagable consejo!!
Bien, el ejemplo de los reportes lo uso ,y tengo un pequeño problema con:
| Código: |
// Creamos el informe
static TQuickRep* qri = 0;
if (qri) delete qri;
|
La primera vez que leo este codigo todo correcto. Es la segunda vez, que intenta eliminar qri donde se produce el error. Si suprimo la linia todo funciona ok.
Mi pregunta es: Que pasa si no lo destruyo? donde podria destruirlo?
Gracias de nuevo!! |
|
| Volver arriba |
|
 |
amas2 Lt

Registrado: 01 Jun 2004Mensajes: 91
|
Publicado: Mie 29 Dic, 2004 12:15 pm Asunto: Más de lo mismo |
|
|
Por cierto, no se si hay alguna forma de ajustar más la anchura de los campos a la real de las cadenas y no a la medida en caracteres de la tabla. O sea poder dar una anchura dependiendo de la cadena más larga que se tendra que imprimir y no de la medida del campo en la Tabla.
Yo recorro la tabla previamente pero no se si es muy optimo!!
Gracias. |
|
| Volver arriba |
|
 |
_Viktor Master


Registrado: 20 Jul 2003Mensajes: 463Ubicación: Santiago, Los Angeles - Chile
|
Publicado: Vie 04 Mar, 2005 8:05 am Asunto: |
|
|
Hola, he usado esta funcion entregada por _Leo, sin ningun problema, hasta que instale la version 4.0 de QuickReport, ahora en la siguientes lineas me da problemas: (En las sentencias de asignacion)
| Código: |
// Cambia la orientación del papel dependiendo del ancho del texto
if (pos < bandDetail->Width)
qr->Page->Orientation = poPortrait;
else
qr->Page->Orientation = poLandscape;
qr->ReportTitle = titulo;
|
Y el error que me genera es el siguiente... Ojo compila perfectamente y solo se cae en teimpo de ejecucion.
| Cita: |
---------------------------
Debugger Exception Notification
---------------------------
Project Siria.exe raised exception class EAccessViolation with message 'Access violation at address 004379DB in module 'Siria.exe'. Write of address 00000052'. Process stopped. Use Step or Run to continue.
---------------------------
OK Help
---------------------------
|
Estuvimos varias Horas con Cesar tratando de solucionar el problema...
En otro post Kalux encontro la siguiente solucion:
| Cita: |
Lo he solucionado incluyendo en el proyecto la libreria: QR4RunC6.lib (para la version 6 del builder).
|
Pero al hacer eso, me da el siguiente error de compilacion:
| Cita: |
Build [Linker Error] Unable to open file 'QRSEARCHDLG.DFM'
|
Y la verdad ya estoy un poco perdido...
Alguien tiene alguna idea de lo que pueda estar pasando ???
Gracias por sus posibles respuestas...
Saludos! _________________ "Ser inteligente no es ser mas, solo equivocarse menos y no usar Visual Basic"
Atte.
Victor Yañez
Apoyen el Proyecto OpenSource del Club Builder. Ya tenemos componentes Listos!!! |
|
| Volver arriba |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Vie 04 Mar, 2005 8:20 am Asunto: |
|
|
Anexo, los pasos que se ejecutaron, desde la pagina de www.qsoft.com
| Código: | Installing QR402PC6.EXE
1. Remove the current QR and QRExports libraries from the design libraries list
using the Component|Install Package menu.
(cierras el builder)
remueves el archivo..de system32
Note that the libraries are now called QR4DesignXX and QR4RunXX.
Remove any copies of qrptX0.bpl from the Windows/System32 directory.
ejecutas el programa
2. Run the self installer EXE.
habres el bulder, y te dice que no puede encontrar la apliacion.. le dices que
no. y luego te vas a Componet - Install Packager - boton add
seleccionas el archivo que contiene la palabra "designed" (QR4DesignC6.bpl)
y ya parece la dichosa paleta..
3. Install the QR4 components by using the Add button and browsing to -
Program files/Borland/Delp
Instalar los componetes, Component - Install - component
posteriormente habre en el directoiro CBuilder\qreport
los dos BPL, que aparecen, y segun esto ya quedo.. pero
nunca se pudo... |
alguien pudo instalar correctamente, el QuickReport Ver 4.0.x. Profesional, en builder c++ 6.0
Gracias por sus respuestas _________________
 |
|
| Volver arriba |
|
 |
kalux Master


Registrado: 21 Nov 2003Mensajes: 313Ubicación: Alicante - España
|
Publicado: Vie 04 Mar, 2005 7:23 pm Asunto: |
|
|
Yo los instale tal y como indica Tugui en:
https://cppbuilder.es/viewtopic.php?t=9735
Es decir:
- Desistalas los antiguos. Vas a Component - Install pakages y remove sobre este paquete.
- Ejecutas la instalacion, le das el mismo directorio que el Builder (por las carpetas: lib, help, ...
- Luego, creo recordar, que fui a Component - Install pakages y add. Vas al directorio BIN del Builder y buscas: QR4DesignC6.bpl
Y ya lo tienes instalado. Entre medio de estas operaciones sali y volvi a entrar del C++Builder, por si tenia que actualizar los cambios (ante la duda)
La unica pega fue que tienes que añadir al proyecto la libreria: QR4RunC6.lib
Tambien hice la prueba de incluir en Proyect - Options Directories/Conditionals tanto en include como en lib path de la carpeta de quickrpt, pero no surgio efecto. Este paso lo realice para ver si no hacia falta incluir la libreria en el proyecto. Pero ...
Un saludo. |
|
| Volver arriba |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Vie 04 Mar, 2005 11:46 pm Asunto: |
|
|
Bien, eso indica que te funciona correctamente, no se te pasa, el borrado de los archivos, del la carpeta ...\system32\qrxxxx para que se tomen los nuevos archivos
saludos..? _________________
 |
|
| Volver arriba |
|
 |
kalux Master


Registrado: 21 Nov 2003Mensajes: 313Ubicación: Alicante - España
|
Publicado: Sab 05 Mar, 2005 3:08 pm Asunto: |
|
|
No he borrado ninguna carpeta, ni nada. Solo desistalar.
Ojo: estoy actualizando desde la version que viene por defecto con el C++ Builder ver. 6 Enterprise que es la 3 y algo.
Estoy mirando en la carpeta windows/system32 y aparecen los ficheros: QR4RunC6.bpl y qrpt60.bpl, que supongo que los a colocado el instalador.
Supongo que esa explicacion es para los que ya tenian instalada la version 4 y actualizan a otra posterior. Este no es mi caso.
Un saludo. |
|
| Volver arriba |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Sab 05 Mar, 2005 6:02 pm Asunto: |
|
|
Por fin lo consegui, aqui esta la manera correcta.
24 hrs, sin dormir, y reinstalando varias veces el borland ha quedado, jeje
| Código: |
Instalacion o (Actualizacion de la version 3.0.9) Correcta del QReport Ver. 40x
1.- Abres el builder cierras todo con "File-Close All", y te vas
al menu "Component-Install Packages" dentro de ella seleccionas,
el componente, QuickRepor y los que consideres que pertenecen al
quickreport, y los eliminamos con el boton remove
2.- Cierras el builder y te vas a la carpeta de ...\system32, en ella
borras los siguientes archivos..
QR4RunC6.bpl -> alguna version anterior del QuickReport
qrpt60.bpl -> La version que viene con el Builder.
Eliminas los 2
3.- Ejecutas el Instalador (QR40xpC6.exe) y despues continuas con el paso 4
4.- Abres el Builder, y te indica que no puede encontrar la libreria
del Quickreport, presionas el boton aceptar, y te sale un msg
Indicandote que si deseas buscar de nuevo la libreria cada vez
que inicies el builder, seleccionas el boto no y listo.
5.- cierras todo con "File-Close All", te vas a "Component - Install
Component...", y Habres el que dice QR4DesignC6.cpp y QR4DesignC6.bpk
respectivamente, compilas / instalas y ya tienes la Carpeta de QReport
Con los nuevos componentes.
6.- para que se compile tu proyecto, agrega, dentro del Menu
"View-Project Manager", y agregas los archivos del QuickReport
que se encuentren en el directorio "Lib" de CBuilder6 (QR4RunC6.lib),
asi como el Archivo QR4DesignC6.cpp
suerte!!!!
|
_________________
 |
|
| Volver arriba |
|
 |
jotny Master


Registrado: 17 Feb 2004Mensajes: 226Ubicación: santiago
|
Publicado: Dom 03 Abr, 2005 9:19 pm Asunto: Saludos Gran Leo__ |
|
|
Hola leo... me preguntaba si se pudiera hacer lo mismo, pero en vez de una tabla cargada de una BD, pasarle un StringGrid.... será posible?
de antemano muchisimas gracias super Leo__ |
|
| Volver arriba |
|
 |
rafaelr Cdt

Registrado: 05 Ago 2008Mensajes: 15
|
Publicado: Lun 16 Feb, 2009 6:41 am Asunto: ayudaaaaa con report |
|
|
| _Leo escribió: | Por si te sirve de algo, aquí el mismo ejemplo que había puesto, pero ahora como una función totalmente independiente, y como ejemplo en vez de usar un TQRDBText uso un TQRExpr:
| Código: | // Añadimos las siguientes cabeceras
// #include <QuickRpt>
// #include <Qrctrls>
void GenerarInforme(TDataSet* dataset, String titulo, TStrings* campos)
{
if (campos->Count <1>DataSet = dataset;
TQRBand* bandPageHeader = qr->CreateBand(rbPageHeader);
TQRBand* bandPageFooter = qr->CreateBand(rbPageFooter);
TQRBand* bandColumnHeader = qr->CreateBand(rbColumnHeader);
TQRBand* bandDetail = qr->CreateBand(rbDetail);
qr->Units = MM;
bandPageHeader->Size->Height = 10;
bandPageHeader->Frame->DrawBottom = true;
bandPageHeader->Frame->Color = clSilver;
bandPageHeader->Frame->Width = 2;
bandPageFooter->Size->Height = 15;
bandPageFooter->Frame->DrawTop = true;
bandPageFooter->Frame->Color = clSilver;
bandPageFooter->Frame->Width = 2;
bandColumnHeader->Color = clSilver;
TQRSysData* QRSysData = new TQRSysData(bandPageHeader);
QRSysData->Parent = bandPageHeader;
QRSysData->Data = qrsReportTitle;
QRSysData->AlignToBand = true;
QRSysData->Alignment = taCenter;
QRSysData->Font->Style = TFontStyles() <<fsBold>Top += 10;
QRSysData = new TQRSysData(bandPageFooter);
QRSysData->Parent = bandPageFooter;
QRSysData->Data = qrsPageNumber;
QRSysData->AlignToBand = true;
QRSysData->Alignment = taCenter;
QRSysData->Text = "Página ";
QRSysData->Top += 4;
// Calcula el alto y el ancho medio de una letra
TForm* mainForm = Application->MainForm;
mainForm->Canvas->Font->Assign(bandDetail->Font);
int charWidth = mainForm->Canvas->TextWidth("x");
int charHeight = mainForm->Canvas->TextHeight("Xg");
mainForm->Canvas->Font->Assign(mainForm->Font);
// Definimos la altura de las bandas de cabecera y detalle
bandColumnHeader->Height = charHeight + 6;
bandDetail->Height = charHeight + 2;
// Añade el texto
TQRLabel *QRLabel;
TQRExpr *QRExpr;
int pos = 0;
for (int i=0; i<campos>Count; i++)
{
String fieldName = campos->Strings[i];
TField* field = qr->DataSet->Fields->FieldByName(fieldName);
QRLabel = new TQRLabel(bandColumnHeader);
QRLabel->Parent = bandColumnHeader;
QRLabel->AutoSize = false;
QRLabel->Transparent = true;
QRLabel->Caption = fieldName;
QRLabel->Width = field->DisplayWidth * charWidth;
QRLabel->Left = pos;
QRLabel->Top = 2;
QRExpr = new TQRExpr(bandDetail);
QRExpr->Parent = bandDetail;
QRExpr->AutoSize = false;
QRExpr->Color = bandDetail->Color;
QRExpr->Left = pos;
QRExpr->Top = 2;
QRExpr->Width = QRLabel->Width;
QRExpr->Expression = "'->'+" + dataset->Name + "." + fieldName;
// Justificar a la derecha si es un campo numerico
switch(field->DataType)
{
case ftSmallint:
case ftInteger:
case ftAutoInc:
case ftLargeint:
QRExpr->Alignment = taRightJustify;
}
pos += QRLabel->Width + QRLabel->Font->Size;
}
// Cambia la orientación del papel dependiendo del ancho del texto
if (pos <bandDetail>Width)
qr->Page->Orientation = poPortrait;
else
qr->Page->Orientation = poLandscape;
qr->ReportTitle = titulo;
// Mostramos el report
qr->Preview();
} |
Un ejemplo de como usarla:
| Código: | TStringList* campos = new TStringList;
campos->Append("Nombre");
campos->Append("Provincia");
campos->Append("Fax");
GenerarInforme(Table1, "prueba", campos);
delete campos; |
También esta probada con DBExpress:
GenerarInforme(SQLTable1, "prueba", campos);
con Interbase:
GenerarInforme(IBTable1, "prueba", campos);
con ADO:
GenerarInforme(ADOQuery1, "prueba", campos);
...teóricamente debería funcionar con cualquier descendiente de TDataSet.
-----------------------------------------------------------------------
Bueno, lo anterior era como ejemplo de TQRExpr, la versión con TQRDBText quedaría así:
| Código: | void GenerarInforme(TDataSet* dataset, String titulo, TStrings* campos)
{
if (campos->Count <1>DataSet = dataset;
TQRBand* bandPageHeader = qr->CreateBand(rbPageHeader);
TQRBand* bandPageFooter = qr->CreateBand(rbPageFooter);
TQRBand* bandColumnHeader = qr->CreateBand(rbColumnHeader);
TQRBand* bandDetail = qr->CreateBand(rbDetail);
qr->Units = MM;
bandPageHeader->Size->Height = 10;
bandPageHeader->Frame->DrawBottom = true;
bandPageHeader->Frame->Color = clSilver;
bandPageHeader->Frame->Width = 2;
bandPageFooter->Size->Height = 15;
bandPageFooter->Frame->DrawTop = true;
bandPageFooter->Frame->Color = clSilver;
bandPageFooter->Frame->Width = 2;
bandColumnHeader->Color = clSilver;
TQRSysData* QRSysData = new TQRSysData(bandPageHeader);
QRSysData->Parent = bandPageHeader;
QRSysData->Data = qrsReportTitle;
QRSysData->AlignToBand = true;
QRSysData->Alignment = taCenter;
QRSysData->Font->Style = TFontStyles() <<fsBold>Top += 10;
QRSysData = new TQRSysData(bandPageFooter);
QRSysData->Parent = bandPageFooter;
QRSysData->Data = qrsPageNumber;
QRSysData->AlignToBand = true;
QRSysData->Alignment = taCenter;
QRSysData->Text = "Página ";
QRSysData->Top += 4;
// Calcula el alto y el ancho medio de una letra
TForm* mainForm = Application->MainForm;
mainForm->Canvas->Font->Assign(bandDetail->Font);
int charWidth = mainForm->Canvas->TextWidth("x");
int charHeight = mainForm->Canvas->TextHeight("Xg");
mainForm->Canvas->Font->Assign(mainForm->Font);
// Definimos la altura de las bandas de cabecera y detalle
bandColumnHeader->Height = charHeight + 6;
bandDetail->Height = charHeight + 2;
// Añade el texto
TQRLabel *QRLabel;
TQRDBText *QRDBText;
int pos = 0;
for (int i=0; i<campos>Count; i++)
{
String fieldName = campos->Strings[i];
TField* field = qr->DataSet->Fields->FieldByName(fieldName);
QRLabel = new TQRLabel(bandColumnHeader);
QRLabel->Parent = bandColumnHeader;
QRLabel->AutoSize = false;
QRLabel->Transparent = true;
QRLabel->Caption = fieldName;
QRLabel->Width = field->DisplayWidth * charWidth;
QRLabel->Left = pos;
QRLabel->Top = 2;
QRDBText = new TQRDBText(bandDetail);
QRDBText->Parent = bandDetail;
QRDBText->AutoSize = false;
QRDBText->Color = bandDetail->Color;
QRDBText->Left = pos;
QRDBText->Top = 2;
QRDBText->Width = QRLabel->Width;
QRDBText->DataSet = dataset;
QRDBText->DataField = fieldName;
// Justificar a la derecha si es un campo numerico
switch(field->DataType)
{
case ftSmallint:
case ftInteger:
case ftAutoInc:
case ftLargeint:
QRDBText->Alignment = taRightJustify;
}
pos += QRLabel->Width + QRLabel->Font->Size;
}
// Cambia la orientación del papel dependiendo del ancho del texto
if (pos <bandDetail>Width)
qr->Page->Orientation = poPortrait;
else
qr->Page->Orientation = poLandscape;
qr->ReportTitle = titulo;
// Mostramos el report
qr->Preview();
} |
... es solo un ejemplo sencillo, habría que mejorarlo para que funcione bien con cualquier tipo de campo, etc. |
leo, yo estoy tratando de hacer una Historia clinica, pero necesito que los datos vallan muy parejos, por ejemplo tengo dos campos una de enfermedad actual, y uno de examen fisico, el de enfermedad actual son como 1000 caracteres, y lo tengo en un lambel y el examen fisico son 400 caracteres y lo tengo en otro lambel la idea es que no todos los pacientes ocupa los 1000 caracteres y me queda un super espacio, y no se lograr que empalme cuando termina una comienze la otra gracias de antemano |
|
| Volver arriba |
|
 |
Carlos J. Fernandez Master


Registrado: 27 Oct 2004Mensajes: 574
|
Publicado: Jue 28 Jul, 2016 3:33 pm Asunto: |
|
|
Hola a todos,
Os seria muy complicado hacer esta misma función pero para un StringGrid?
Quiero decir que los datos no vengan de un DataSet sino de un StringGrid.
Lo cierto es que seria comodisimo, tengo algunos listados en StringGrid y resulta muy engorroso cuando hay que hacer el QuickReport.
Un saludo a todos.
Carlos _________________ Carlos J. Fernandez |
|
| Volver arriba |
|
 |
|
|
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
|
© 2002–2026 Club Builder · Funciona con phpBB.
|