![]() |
Cambiar color en panel de DBCtrlGrid segun valor de un atributo
Hola buenas noches!
Estoy programando una aplicación para un restaurante utilizando Delphi6 y Paradox. Mi problema es el siguiente: Estoy utilizando un DBCtrlGrid para visualizar en un formulario todas las mesas de la tabla mesas. Dentro del DBCTrlGrid he dibujado un panel para dar la impresión de que sea un botón....y dentro de este panel tengo un DBText en el que muestro el nombre 'descripción' de la mesa. Además, la tabla mesas tiene un atributo llamado estado en el que guardo si la mesa está libre u ocupada. Si está libre quiero que el panel aparezca en verde y si no en rojo. Bien, entonces en el evento onPaintPanel he implementado el siguiente código: Código:
if (DBCtrlGrid1.DataSource.DataSet.FieldByName ('estado').AsString)='Libre' then Alquien tiene alguna idea de como solucionarlo? O si es posible hacer algo, u debería utilizar otro componente? No sé, cualquier idea es bien recibida... Un saludo, |
Mas que usar el evento OnPaintPanel que sólo se ejecuta cuando el
DBCtrlGrid necesita ser "repintado", probaría a utilizar el evento del DataSource: OnDataChange (que se ejecuta cada vez que cambian los datos, ya sea por que se produjo un desplazamiento, etc.), de esta manera te asegurarías siempre de que los paneles se mostrarán en el color correcto. Por ejemplo, si tienes el componente DataSource en el mismo formulario:
(En caso de que lo tengas en un módulo de datos podrías crearte en el módulo una propiedad pública de tipo "evento", TNotifyEvent, que se ejecutara cada vez que cambiaran los datos, y capturar, luego, esta propiedad en el formulario) Otra solución, tal vez más simple, sería probar a invocar al método Repaint del DBCtrlGrid cada vez que el panel recibe el foco (evento OnEnter) y ver si funciona. (Repaint obliga al DBCtrlGrid a "repintarse", así que, en teoría, tendría que funcionar). Saludos! |
Gracias, pero no ha habido suerte.....
Hola, muy buenas. Antes de nada, muchas gracias por la respuesta.
Primeramente he probado con la última sugerencia de invocar al método Repaint en el evento OnEnter del Panel, pero no funciona. Seguidamente he probado a usar el método OnDataChange del DataSource, quitando el código de OnPaintPanel, pero misteriosamente...hace cosas muy raras. Finalmente, dejando el código que tenía OnPaintPanel y además añadiendolo también en OnDataChange, funciona bien para todos los casos menos para el primer registro. (Que debería de salir rojo, pero se pinta en verde hasta que clickeo en él). Antes de este cambio, además de ésto en las demás mesas rojas, al clickear por primera vez en ellas se pintaban en verde. Cosa que al añadir el código de OnDataChange ya no. No sé si me he explicado bien o no.... Alguna sugerencia? |
de otra forma....
Hola, bueno, creo que me voy a volver loca!!
A ver, ahora he probado sólo con el siguiente código en el evento OnPaintPanel del DBCtrlGrid:
En vez de colorear el Panel, como antes, coloreo el DBCtrlGrid. Y cual es el resultado? Pues que si tienen que aparecer las mesas 1,2,3 y 15 en rojo. Aparecen en rojo las mesas 2,3,4 y 16. Alguna idea de por qué pasa ésto? Un saludo, |
Una posible solución
Hola a todos! Tras un paseillo por foros y otros lugares de Internet, lo que he conseguido es lo siguiente:
He quitado el Panel de antes, y el DBText lo pongo directamente. Entonces con poner el siguiente código en el evento OnPaintPanel, funciona correctamente. (En vez de cambiar el color del panel, cambiamos el color del canvas, y luego lo dibujamos, ' o eso es lo que entiendo, vamos').
Lo dejo, aquí por si a alguien le sirve de algo. Aúnque lo haya solucionado de esta forma, si a alguien se le ocurre como arreglar el problema que tenía antes, o por qué pasaba eso, pues que lo comente. Más que nada, porque me he quedado con curiosidad.... Saludos, |
La franja horaria es GMT +2. Ahora son las 09:47:46. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi