Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 31-10-2012
borlandpablo borlandpablo is offline
Miembro
NULL
 
Registrado: oct 2012
Posts: 37
Poder: 0
borlandpablo Va por buen camino
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();
         }

      }
   }
}
Un saludo.
Responder Con Cita
  #2  
Antiguo 31-10-2012
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 38
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.

Cita:
tuve que variar el código porque seguía dándome errores
Los errores se van a producir en la medida que los valores evaluados en las celdas no sean aptos para ser convertidos al tipo TDate. Con la función TryStrToDate esto se evita, pero de no ser posible la conversión no se pintará la celda del color buscado.

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:
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...
Y no es para menos...

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 ....
Responder Con Cita
  #3  
Antiguo 04-11-2012
borlandpablo borlandpablo is offline
Miembro
NULL
 
Registrado: oct 2012
Posts: 37
Poder: 0
borlandpablo Va por buen camino
Cita:
Empezado por ecfisa Ver Mensaje
Hola.


Los errores se van a producir en la medida que los valores evaluados en las celdas no sean aptos para ser convertidos al tipo TDate. Con la función TryStrToDate esto se evita, pero de no ser posible la conversión no se pintará la celda del color buscado.

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.


Y no es para menos...

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.
Buenas, la cosa es que necesito los valores que tengo en la base de datos. De qué manera puedo hacerlo para que me lo pinte con las fechas de la base de datos?

Un saludo
Responder Con Cita
  #4  
Antiguo 05-11-2012
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 38
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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]);
    }
  }
}
En la consulta SQL tenes que cambiar "TABLA" por el nombre de tu tabla y "FECHA" por el nombre del campo a consultar.
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 ....
Responder Con Cita
  #5  
Antiguo 06-11-2012
borlandpablo borlandpablo is offline
Miembro
NULL
 
Registrado: oct 2012
Posts: 37
Poder: 0
borlandpablo Va por buen camino
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
Con esto quiero que me coloree todas las celdas que coincidan entre esas dos fechas en cada registro.

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.
Responder Con Cita
  #6  
Antiguo 06-11-2012
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 38
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola Pablo.

La situación sigue sin quedarme clara:
Cita:
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
Pero en la tabla visual que mostras, ¿ Donde se hubicaría la fecha de hoy ? ¿ Que límite desempeña en el rango fecha_inicio/fecha_fin ?

Cita:
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
¿ Que sean iguales a que ?
  • Una fecha ingresada
  • Entre dos fechas de la misma columna
  • O, como mencionas mas arriba, que esten comprendidas entre dos fechas, y si es así ¿ Estas serían los valores de las columnas Fecha_inicio y Fecha_fin ?

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #7  
Antiguo 07-11-2012
borlandpablo borlandpablo is offline
Miembro
NULL
 
Registrado: oct 2012
Posts: 37
Poder: 0
borlandpablo Va por buen camino
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;
         }
      }
   }
}
PD: Te mandé un mensaje privado.

Un saludo.
Imágenes Adjuntas
Tipo de Archivo: jpg tabla_opt.jpg (31,7 KB, 15 visitas)

Última edición por borlandpablo fecha: 07-11-2012 a las 10:13:12.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

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


La franja horaria es GMT +2. Ahora son las 15:31:14.


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