Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Pintar filas de un DBGrid

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Pintar filas de un DBGrid Responder citando

Cómo puedo pintar las filas enteras de un DBGrid dependiendo del valor de uno de los campos?? O sea, DrawColumnCell no me sirve porque al ir pintando por columnas no hace lo que yo necesito.

Si quiero pintar varias filas seguidas de un DBGrid del mismo color dependiendo del valor de uno de los campos ¿cómo puedo hacerlo?

Muchas gracias ...
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Alguien sabe cómo hacer ésto??, es que necesito que queden varias filas de un DBGrid pintadas del mismo color para que el usuario diferencia a primera vista unos datos en bloque... uy, si es que no se me ocurre como hacerlo porque no sé como acceder a cada una de las filas del DBGrid para poder pintarlas. Como puedo posicionarme en la primera fila y después ir bajando una a una para pintarlas??
Volver arriba
Mensaje    Asunto: Responder citando

Hola te dejo un ejemplo: Si el valor del campo "Cancelado" es true, pintar la fila de rojo.

Espero sea lo que necesitas.

Código:

void __fastcall TForm1::DBGrid1DrawColumnCell(TObject *Sender,
const TRect Rect, int DataCol, TColumn *TColumn,
TGridDrawState State)
{
      TDBGrid *grid = static_cast<TDBGrid*>(Sender);
      if (TuTabla->FieldValues["Cancelado"] )
                grid->Canvas->Font->Color = clRed;

      grid->DefaultDrawColumnCell(Rect, DataCol, Column, State);
}


Saludos
_________________
Quien hace una pregunta teme parecer un ignorante durante cinco minutos, quien no pregunta se mantiene ignorante toda la vida.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Muchas gracias buildero, pero aunque no es exactamente lo que necesito, creo que podré acoplarlo. La única cosa es que en el DBGrid muestro el resultado de una ADOQuery y no una tabla, entonces lo que había pensado es:
Código:
 if (Data1->ADOQuery2->FieldValues["BLOQUE"])
        grid->Canvas->Font->Color = clRed;

o también:
Código:
if (grid->DataSource->DataSet->FieldValues["BLOQUE"])
              grid->Canvas->Font->Color = clRed;


pero, tanto accediendo de estas 2 formas a los datos, como accediendo a la ADOTable (que tambien lo he probado), me sale el siguiente error:

EVariantTypeCastError with Message 'Could not convert variant of type (Null) into type (boolean)'

Y no sé qué hacer para solucionarlo, se te ocurre algo??

Muchas gracias por tu respuesta, aunque he tardado un poco en leerla... Razz
[/code]
Volver arriba
Mensaje    Asunto: Responder citando

si tuvieras que el campo Bloque es numerico, puedes hacer esto
existe
AsInteger
AsDate
AsString etc.

Código:

if (Data1->ADOQuery2->FieldByName("BLOQUE")->AsInteger == 1)
        grid->Canvas->Font->Color = clRed;

_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Pero eso es lo extraño, el campo BLOQUE es un booleano, por eso no sé como puedo solucionar ese error, en teoría está bien, no??

Muchas gracias por el interés...
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

En teoría está bien....por lo que puedo ver en el mensaje de error el problema puede ser porque se está tratantado de evaluar un valor de tipo Null, es decir que el valor del campo en tu tabla no existe ni True ni False.

Verifica si tienes asignados valores válidos para el campo y nos cuentas.

Saludos
_________________
Quien hace una pregunta teme parecer un ignorante durante cinco minutos, quien no pregunta se mantiene ignorante toda la vida.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Vale, pues resulta que cuando se abre el formulario donde está el DBGrid, el usuario debe elegir unos valores y a partir de éstos se realiza la consulta a la base de datos (Access). Creo que por eso, en el momento que se abre el formulario, cuando se dibuja el DBGrid y salta el evento OnDrawColumnCell, como aún no hay ningún DataSource asociado al DBGrid, pues por eso está evaluando un campp Null. He probado a darle unos valores iniciales a la consulta y realizarla en el evento OnActivate del Form, y entonces dibuja bien el DBGrid, aunque tampoco me pinta las filas de rojo, y en cuanto intento cambiar los parámetros para realizar de nuevo la consulta vuelve a salir el dichoso error del los datos de tipo Null.

No sé que narices hago mal, pero tengo que solucionarlo como sea. Si se os ocurre cualquier cosa, contestadme por favor. Os seguiré contando más cosas.
Muchas gracias por todo. Rolling Eyes


Un saludo.... Rolling Eyes Rolling Eyes Rolling Eyes Twisted Evil
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Lo primero que se me ocurre es verificar si la fuente de datos( DataSource->DataSet ) esta abierto.

Código:

void __fastcall TForm1::DBGrid1DrawColumnCell(TObject *Sender,
const TRect Rect, int DataCol, TColumn *TColumn,
TGridDrawState State)
{
      TDBGrid *grid = static_cast<TDBGrid*>(Sender);
     
      if ( TuQuery->Active )
      {
              if (TuTabla->FieldValues["Cancelado"] )
                     grid->Canvas->Font->Color = clRed;

              grid->DefaultDrawColumnCell(Rect, DataCol, Column, State);
     }
}


Porque no nos explicas un poco mas la logica que estas aplicando y como estas enlazando los objetos, tal vez podamos dar más rapido con tu problema.

Saludos
_________________
Quien hace una pregunta teme parecer un ignorante durante cinco minutos, quien no pregunta se mantiene ignorante toda la vida.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Vale, os explico, a ver, utilizo componentes ADO para conectarme a una BD Access. En dicha BD hay una tabla en la que la información puede ir en "bloques" o no, si va en bloque, cada una de las filas pertenecientes a él posee el mismo nombre, o sea:
Código:


ID  |  BLOQUE   | NOMBRE
1   | False     |
2   | True      | 1
3   | True      | 1
4   | False     |
5   | True      | 2
6   | True      | 2
7   | True      | 2


Esta sería una simplificación de la tabla. Lo que quiero conseguir es que las filas que pertenezcan a un mismo "bloque" (o sea que tienen el mismo nombre) estén pintadas de un mismo color, para que así al usuario de un simple vistazo le quede clara la información.

La consulta la hago con ADOQuery, almaceno el resultado en un DataSource, y eso es lo que le paso al DBGrid. En cuanto se abre el formulario (creado dinámicamente) el usuario debe elegir 2 valores y entonces con estos 2 valores realizo la ADOQuery a la BD.

Pero debo tener algo enlazado que está mal, porque aún después de haber cerrado la ADOQuery en el OnCreate del Form, cuando hago la comprobación de si la ADOQuery está activa (como decía buildero) entra en el bucle if.

Voy a seguir probando cosas, pero ya sabéis, si se os ocurre algo avisadme por favor....

No hay otro modo de pintar las filas sin que sea en el evento OnDrawColumnCell ¿no puedo acceder a cada una de ellas?

Código:

 Posicionarme 1ª fila
 mientras no sea la última fila
     si es en bloque
         si nombre = nombre anterior
             pinto mismo color
         sino
             cambio color
         nombre anterior = nombre
     Paso a la fila siguiente


Así es como quería hacerlo, pero no lo consigo, es un rollo si sólo puedo acceder por columnas al DBGrid?? Podría hacer lo que quiero con otro componente??

Muchas gracias por todo, aunque no sé si lo he dejado claro...

Un saludo.... Rolling Eyes
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mostrar mensajes de anteriores:   
Cambiar a:  
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


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.