 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
shackletta Lt JG

Registrado: 01 Dic 2004Mensajes: 68
|
Publicado: Mie 25 May, 2005 4:43 pm Asunto: Pintar filas de un DBGrid |
|
|
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 |
|
 |
Invitado
|
Publicado: Jue 26 May, 2005 5:12 pm Asunto: |
|
|
| 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 |
|
 |
Buildero Master


Registrado: 23 Dic 2003Mensajes: 523Ubicación: Puebla, México
|
Publicado: Jue 26 May, 2005 7:12 pm Asunto: |
|
|
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 |
|
 |
Invitado
|
Publicado: Dom 29 May, 2005 12:22 pm Asunto: |
|
|
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...
[/code] |
|
| Volver arriba |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Dom 29 May, 2005 4:05 pm Asunto: |
|
|
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; |
_________________
 |
|
| Volver arriba |
|
 |
shackletta Lt JG

Registrado: 01 Dic 2004Mensajes: 68
|
Publicado: Dom 29 May, 2005 5:32 pm Asunto: |
|
|
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 |
|
 |
Buildero Master


Registrado: 23 Dic 2003Mensajes: 523Ubicación: Puebla, México
|
Publicado: Lun 30 May, 2005 2:54 pm Asunto: |
|
|
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 |
|
 |
shackletta Lt JG

Registrado: 01 Dic 2004Mensajes: 68
|
Publicado: Lun 30 May, 2005 9:54 pm Asunto: |
|
|
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.
Un saludo....  |
|
| Volver arriba |
|
 |
Buildero Master


Registrado: 23 Dic 2003Mensajes: 523Ubicación: Puebla, México
|
Publicado: Lun 30 May, 2005 10:29 pm Asunto: |
|
|
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 |
|
 |
shackletta Lt JG

Registrado: 01 Dic 2004Mensajes: 68
|
Publicado: Mie 01 Jun, 2005 8:34 am Asunto: |
|
|
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....  |
|
| Volver arriba |
|
 |
|
|
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
|
© 2002–2026 Club Builder · Funciona con phpBB.
|