![]() |
![]() |
| Paypal | FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
|||||||
| Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
![]() |
|
|
Herramientas | Buscar en Tema | Desplegado |
|
|
|
#1
|
||||
|
||||
|
Hola borlandpablo.
No comentaste que condición debe cumplirse para que la celda se pinte. Pero por tu código del mensaje #5, deduzco que es cuando la fecha que está en la celda del StringGrid es igual (exíste) en determinado campo de la tabla en que realizas la búsqueda. Si es así, de este modo hará lo que buscas: Código:
...
#define COL_DATE 0 // Columna correspondiente a la fecha
...
void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol,
int ARow, TRect &Rect, TGridDrawState State) {
TCanvas *CV = static_cast<TCanvas*>(StringGrid1->Canvas);
TDate FechaCell;
if (ACol == COL_DATE && TryStrToDate(StringGrid1->Cells[COL_DATE][ARow],FechaCell)) {
QryTmp->Close();
QryTmp->SQL->Text = "SELECT FECHA FROM TABLA WHERE FECHA = :VALUE";
QryTmp->ParamByName("VALUE")->AsString = StringGrid1->Cells[COL_DATE][ARow];
QryTmp->Open();
if (!QryTmp->IsEmpty()) {
CV->Brush->Color = clLime;
CV->FillRect(Rect);
CV->TextOut(Rect.Left+1 ,Rect.top+1, StringGrid1->Cells[ACol][ARow]);
}
}
}
La sintáxis del query (QryTmp) puede variar de acuerdo a los componentes que estas usando y que desconozco por que tampoco encontré mención a ellos en tus mensajes. Revisando a fondo el código del mensaje #5, no sólo recorre la tabla por cada celda ¡ Sino que por cada celda recorre todas las celdas leyendo secuencialmente la tabla cada vez ! de allí que el programa se volvía "loco"... Este código sólo realiza una consulta (muchísimo mas veloz que una busqueda secuencial) cuando se va a pintar una celda de la columna COL_DATE (fecha) y su contenido es una fecha válida. De todas formas no es lo óptimo, pienso que un TDBGrid cumpliría mejor con el cometido... pero para asegurarlo tendría que entender bién la lógica de lo que estas intentando hacer. Saludos.
__________________
Daniel Didriksen Guía de estilo - Uso de las etiquetas - La otra guía de estilo .... |
|
#2
|
|||
|
|||
|
Buenas ecfisa, lo quiero hacer es un control de las promociones de los catálogos. Esas promociones tienen una fecha de inicio y una fecha final. En cada columna me aparecerá la fecha de hoy hasta el tiempo que yo quiera mostrar (solo necesito dos meses mostrados). Y en las filas quiero que me muestre el nombre del cátalogo. Entonces, quiero que por medio de una tabla visual (en este caso un StringGrid), quiero que me rellene en color aquellas celdas en que las fechas sean iguales. Por ejemplo:
Código:
Catálogo Fecha_inicio Fecha_fin Renuevate 10/11/2012 10/12/2012 Navidades 15/11/2012 30/12/2012 PD: Con la solución que me diste no me hace nada. Me compila bien pero no entra en la primera condición (He cambiado lo que me dijiste en el mensaje anterior a este). Un saludo. |
|
#3
|
||||
|
||||
|
Hola Pablo.
La situación sigue sin quedarme clara: Cita:
Cita:
Saludos.
__________________
Daniel Didriksen Guía de estilo - Uso de las etiquetas - La otra guía de estilo .... |
|
#4
|
|||
|
|||
|
Buenas ecfisa. Te he adjuntado una imagen para que veas lo que quiero que muestre. Las fechas de los catálogos están asignadas en la base de datos. Tienen una fecha de inicio y una fecha fin para que me rellene de color las fechas comprendidas entre esas dos comparándola con las fechas que tengo creadas en el StringGrid. La tabla la creé de esta manera:
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++) //Rellena meses, columnas
{
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++) //Rellena catalogos, filas
{
while(!XDatos->QCatalogos->Eof)
{
StringGrid1->Cells[0][j] = XDatos->QCatalogosTitulo->Value;
XDatos->QCatalogos->Next();
j = j + 1;
}
}
}
}
Un saludo. Última edición por borlandpablo fecha: 07-11-2012 a las 10:13:12. |
|
#5
|
||||
|
||||
|
Hola Pablo.
Ahora viendo el gráfico pude entender lo que buscas hacer. La fecha a comparar entre las del archivo es la que esta en la fila cero del StringGrid y el nombre a buscar en la tabla está en la columna cero de la misma. Entonces, esta es la prueba que realicé y funciona bién: Código:
...
#include <DateUtils.hpp>
...
void __fastcall TForm1::FormCreate(TObject *Sender) {
TStringGrid *sg = static_cast<TStringGrid*>(StringGrid1);
TDate dt = Date();
AnsiString s;
sg->ColCount = 31;
sg->Cells[0][1] = "Renuevate";
sg->Cells[0][2] = "Navidades";
sg->Cells[0][3] = "Ocasion";
for(int c =DayOf(Date()); c<= DaysInMonth(Date()); c++) {
sg->Cells[c-DayOf(Date())+1][0] = DateToStr(dt);
dt=IncDay(dt,1);
}
sg->Col = 1;
sg->Row = 1;
/* Asignar evento OnSelectCell por código */
sg->OnSelectCell = StringGrid1SelectCell;
}
void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol,
int ARow, TRect &Rect, TGridDrawState State) {
TStringGrid *sg = static_cast<TStringGrid*>(StringGrid1);
if (ACol > 0 && ARow > 0 && sg->Cells[ACol][ARow] != "") {
QryTmp->Close();
QryTmp->SQL->Clear();
QryTmp->SQL->Add("SELECT * FROM CATALOG");
QryTmp->SQL->Add("WHERE NOMBRE_CATALOGO = :PNOMBRE");
QryTmp->SQL->Add("AND :PFECHA >= FECHA_DESDE AND :PFECHA <= FECHA_HASTA");
// En columna 0 estan los nombres
QryTmp->ParamByName("PNOMBRE")->AsString = sg->Cells[0][ARow];
// En fila 0 estan las fechas
QryTmp->ParamByName("PFECHA")->AsString = sg->Cells[ACol][0];
QryTmp->Open();
if (!QryTmp->IsEmpty()) {
sg->Canvas->Brush->Color = clLime;
sg->Canvas->FillRect(Rect);
sg->Canvas->TextOut(Rect.Left+1 ,Rect.top+1, sg->Cells[ACol][ARow]);
}
}
}
/* Impedir que seleccionen columna 0 o fila 0 */
void __fastcall TForm1::StringGrid1SelectCell(TObject *Sender, int ACol,
int ARow, bool &CanSelect) {
CanSelect = ACol > 0 && ARow > 0;
}
...
void __fastcall TForm1::FormDestroy(TObject *Sender) {
StringGrid1->OnSelectCell = NULL;
}
Código:
NOMBRE_CATALOGO | FECHA_DESDE | FECHA_HASTA ----------------+-------------+------------ Renuevate | 07.11.2012 | 08.11.2012 Navidades | 09.11.2012 | 10.11.2012 Ocasion | 08.11.2012 | 10.11.2012 Como verás en el resultado, el pintado considera las fechas límites de la tabla en relación a la columna y de acuerdo al nombre de la fila: ![]() No olvides quitar el evento OnSelectCell desde el Object Inspector, lo asigno por código para que permita el posicionamiento en Col = 1, Row = 1. Saludos. Edito: Me olvidaba... Y si deseas que se pinten las celdas aún estando vacías, cambiá: Código:
if (ACol > 0 && ARow > 0 && sg->Cells[ACol][ARow] != "") {
// por:
if (ACol > 0 && ARow > 0) {
__________________
Daniel Didriksen Guía de estilo - Uso de las etiquetas - La otra guía de estilo .... Última edición por ecfisa fecha: 07-11-2012 a las 14:55:12. Razón: agregar comentario |
|
#6
|
|||
|
|||
|
Qué maquina ecfisa! Muchísimas gracias! es lo que ando buscando! Yo lo acabo de hacer de otra manera, sin utilizar consulta. Lo hago con bucles y pienso que es mucho mas lento que como tu lo tienes. Voy a cambiarlo!
Un saludo! |
|
#7
|
|||
|
|||
|
Buenas ecfisa, acabo de cambiarlo y no me lo pinta. Parece extraño porque compila bien. He copiado el código tal cual está y solo he modificado el nombre de la query y los campos. Creo que la consulta no me lo está haciendo bien. En la consulta en vez ->Add no sería ->Text = "consulta"; ? No que sea de otro error.
Un saludo. |
![]() |
| Herramientas | Buscar en Tema |
| Desplegado | |
|
|
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 |
|