FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
|||
|
|||
Rellenar StringGrid con base de datos
Buenas, estoy intentando llevar un control de catalogos de forma visual. Me he creado un calendario personalidazo donde me aparecen en cada fila el nombre del catálogo y en cada columna la fecha. La fecha de inicio siempre empieza en la fecha actual. Ahora quiero rellenar de color verde desde la fecha de inicio de un catalogo hasta la fecha final. Esto es lo que tengo hecho, pero no me rellena nada.
Código:
void __fastcall TXVista::FormShow(TObject *Sender) { XDatos->QDistribuidor->Open(); XDatos->QTienda->Open(); XDatos->QCatalogos->Open(); TDate fecha = Date(); for(int i=1; i<=63; i++) //Meses, columnas { bool encontrado = false; StringGrid1->ColCount = i; StringGrid1->Cells[i][0]= fecha; fecha = fecha + 1; StringGrid1->RowCount = XDatos->QCatalogos->RecordCount + 1; for(int j=1; j<=XDatos->QCatalogos->RecordCount; j++) //catalogos, filas { while(!XDatos->QCatalogos->Eof) { StringGrid1->Cells[0][j] = XDatos->QCatalogosTitulo->Value; if(StringGrid1->Cells[i][0] == XDatos->QCatalogosTitulo->Value && StringGrid1->Cells[0][j] == XDatos->QCatalogosFecha_ini->Value) encontrado = true; if(encontrado) StringGrid1->Color = clLime; XDatos->QCatalogos->Next(); j = j + 1; } } } } Última edición por borlandpablo fecha: 29-10-2012 a las 11:06:42. |
#2
|
||||
|
||||
Hola.
Es que para rellenar las celdas con color, vas a tener que usar el evento OnDrawCell del StringGrid. Como para darte una idea, te pongo un ejemplo que pinta las filas cuyas celdas [0][n] tengan una fecha comprendida entre otras dos. Código:
... void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol, int ARow, TRect &Rect, TGridDrawState State) { TCanvas *CV = static_cast<TCanvas*>(StringGrid1->Canvas); TDate FechaCell = StrToDate(StringGrid1->Cells[0][ARow]); if (FechaCell >= FechaInicio && FechaCell <= FechaFin) { CV->Brush->Color = clLime; CV->FillRect(Rect); CV->TextOut(Rect.Left+1,Rect.top+1,StringGrid1->Cells[ACol][ARow]); } } ...
__________________
Daniel Didriksen Guía de estilo - Uso de las etiquetas - La otra guía de estilo .... Última edición por ecfisa fecha: 29-10-2012 a las 21:13:18. Razón: ortografía |
#3
|
|||
|
|||
Buenas, he puesto eso que me dices, he cambiado algunas cosillas porque las fechas están en la base de datos y hago la llamada al campo de la tabla. Me da un error que no sé solucionar. El error dice:
Proyect Promociones.exe raised exeception class EConvertError with message "' is not valid date'. Process stopped. Use Step or Run to continue. La modificación que hice: Código:
void __fastcall TXVista::StringGrid1DrawCell(TObject *Sender, int ACol, int ARow, TRect &Rect, TGridDrawState State) { TCanvas *CV = static_cast<TCanvas*>(StringGrid1->Canvas); TDate FechaCell = StrToDate(StringGrid1->Cells[0][ARow]); while(!XDatos->QCatalogos->Eof) { if (FechaCell >= XDatos->QCatalogosFecha_ini->Value && FechaCell <= XDatos->QCatalogosFecha_fin->Value) { CV->Brush->Color = clLime; CV->FillRect(Rect); CV->TextOut(Rect.Left+1,Rect.top+1,StringGrid1->Cells[ACol][ARow]); } XDatos->QCatalogos->Next(); } } |
#4
|
||||
|
||||
Hola.
El error se produce, con seguridad, en la línea: Código:
TDate FechaCell = StrToDate(StringGrid1->Cells[0][ARow]); Una solución es: Código:
void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol, int ARow, TRect &Rect, TGridDrawState State) { TCanvas *CV = static_cast<TCanvas*>(StringGrid1->Canvas); TDate FechaCell; if (TryStrToDate(StringGrid1->Cells[0][ARow],FechaCell)) if (FechaCell >= FechaInicio && FechaCell <= FechaFin) { CV->Brush->Color = clLime; CV->FillRect(Rect); CV->TextOut(Rect.Left+1,Rect.top+1,StringGrid1->Cells[ACol][ARow]); } } Saludos.
__________________
Daniel Didriksen Guía de estilo - Uso de las etiquetas - La otra guía de estilo .... Última edición por ecfisa fecha: 30-10-2012 a las 17:39:08. |
#5
|
|||
|
|||
Buenas, tuve que variar el código porque seguía dándome errores. También donde me mencionaste. Ahora tengo otro problema. Ahora parece que rellena, pero solo el ultimo registro de la base de datos. Pero si hago un while (para que recorra la base de datos) y poniéndolo en first(primer registro), se vuele loco el programa me lo va a rellenando hipersupermegalento (podría tardar horas en rellenarse el stringgrid). Pienso que a lo mejor no está bien colocado el while o algo, pero no sé donde queda el fallo. Dejo lo que tengo hecho de código.
Código:
void __fastcall TXVista::StringGrid1DrawCell(TObject *Sender, int ACol, int ARow, TRect &Rect, TGridDrawState State) { TRect Casilla; for(int ACol=1; ACol<=StringGrid1->ColCount; ACol++) { for(int ARow=1; ARow<=StringGrid1->RowCount; ARow++) { XDatos->QCatalogos->First(); while(!XDatos->QCatalogos->Eof) { if(StringGrid1->Cells[ACol][0] == DateToStr(XDatos->QCatalogosFecha_ini->Value) && StringGrid1->Cells[0][ARow] == XDatos->QCatalogosTitulo->Value) { StringGrid1->Canvas->Brush->Color=clLime; Casilla= StringGrid1->CellRect(ACol, ARow); StringGrid1->Canvas->FillRect(Casilla); } XDatos->QCatalogos->Next(); } } } } |
#6
|
||||
|
||||
Hola.
Cita:
Resumiendo, el código del mensaje #4, no elevará una excepción fuere cuál fuere el valor almacenado en la columna 0 del StringGrid. Ya que si el valor de la celda no se puede convertir TryStrToDate devuelve false y no se ejecuta alteración alguna. El error sin dudas se produce en otra parte de tu código. Cita:
El evento OnDrawCell se dispara cada vez que una celda del StringGrid necesita ser pintada. No es buena idea recorrer una tabla o consulta dentro de este evento, imagina la cantidad de veces que realizará ese recorrido... Como verás, en el código que te puse, los valores FechaInicio y FechaFin toman valores fuera de este evento y no se realiza búsqueda alguna dentro del mismo. Saludos.
__________________
Daniel Didriksen Guía de estilo - Uso de las etiquetas - La otra guía de estilo .... |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Conectar base de datos Firebird con base de datos Oscommerce 2.3.3 | Adriadob | Firebird e Interbase | 11 | 31-10-2012 11:28:46 |
Ordenar datos en un StringGrid | gilberto_1126 | Varios | 2 | 22-12-2010 18:34:29 |
StringGrid rellenar rapidamente. | byfali | Varios | 10 | 25-03-2008 00:25:19 |
Rellenar una grilla con datos generados por el usuario | maco2007 | .NET | 11 | 05-12-2007 02:53:00 |
Rellenar datos de tablas | sur-se | Firebird e Interbase | 1 | 11-11-2004 11:14:44 |
|