Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

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

Última edición por borlandpablo fecha: 29-10-2012 a las 11:06:42.
Responder Con Cita
  #2  
Antiguo 29-10-2012
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
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.

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]);
  }
}
...
Saludos.
__________________
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
Responder Con Cita
  #3  
Antiguo 30-10-2012
borlandpablo borlandpablo is offline
Miembro
NULL
 
Registrado: oct 2012
Posts: 37
Poder: 0
borlandpablo Va por buen camino
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();
  }
}
Responder Con Cita
  #4  
Antiguo 30-10-2012
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
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.

El error se produce, con seguridad, en la línea:
Código:
    TDate FechaCell = StrToDate(StringGrid1->Cells[0][ARow]);
En algún punto, el contenido de Cells[0][ARow] no es un valor susceptible de ser convertido a fecha, situación que sucedería por ejemplo, si en la fila 0 existiesen títulos para las columnas.

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]);
    }
}
(Siempre suponiendo que en la columna 0 del StringGrid haya un contenido de fecha válido.)

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.
Responder Con Cita
  #5  
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
  #6  
Antiguo 31-10-2012
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
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
Respuesta



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 18:43:39.


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
Copyright 1996-2007 Club Delphi