Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 21-01-2006
akinom38 akinom38 is offline
Miembro
 
Registrado: ene 2006
Posts: 15
Poder: 0
akinom38 Va por buen camino
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
           Panel1.Color :=clGreen
    else
               Panel1.Color :=clRed;
end;
Entonces, en principio, pues las pinta de ese color, pero en cuanto pasa el foco (o en el primer click) a una de las mesas de las que se suponen están en rojo, se ponen en verde por un momento y no sé como arreglarlo. Lo peor es si la primer mesa está en rojo, como en principio tiene el foco, pues aparece en verde.

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,
Responder Con Cita
  #2  
Antiguo 21-01-2006
Avatar de jmariano
jmariano jmariano is offline
Miembro
 
Registrado: jul 2005
Posts: 376
Poder: 19
jmariano Va por buen camino
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:
Código Delphi [-]
procedure TForm1.DataSource1DataChange(Sender: TObject; Field: TField);
begin
  if (DataSource1.DataSet.FieldByName('estado').AsString) = 'Libre' then
    Panel1.Color :=clGreen
  else Panel1.Color :=clRed;
end;

(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!

Última edición por jmariano fecha: 21-01-2006 a las 23:39:51.
Responder Con Cita
  #3  
Antiguo 22-01-2006
akinom38 akinom38 is offline
Miembro
 
Registrado: ene 2006
Posts: 15
Poder: 0
akinom38 Va por buen camino
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?
Responder Con Cita
  #4  
Antiguo 22-01-2006
akinom38 akinom38 is offline
Miembro
 
Registrado: ene 2006
Posts: 15
Poder: 0
akinom38 Va por buen camino
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:

Código Delphi [-]
begin
    if (DBCtrlGrid1.DataSource.DataSet.FieldByName('estado').AsString)='Libre' then
        DBCtrlGrid1.Color:=clGreen
  else
       DBCtrlGrid1.Color :=clRed;    
end;

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,
Responder Con Cita
  #5  
Antiguo 23-01-2006
akinom38 akinom38 is offline
Miembro
 
Registrado: ene 2006
Posts: 15
Poder: 0
akinom38 Va por buen camino
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').

Código Delphi [-]
procedure TFSituacionMesas.DBCtrlGrid1PaintPanel(DBCtrlGrid: TDBCtrlGrid;
  Index: Integer);
var
  r: TRect;
begin
  r := Rect(0,0,DBCtrlGrid1.PanelWidth-3,DBCtrlGrid1.PanelHeight-3);
 
  // determinamos el color del panel
  if DBCtrlGrid1.DataSource.DataSet.FieldByName('estado').AsString = 'Libre' then
    DBCtrlGrid1.Canvas.Brush.Color := clGreen
  else
    DBCtrlGrid1.Canvas.Brush.Color := clRed;
     
// rellenar panel
  DBCtrlGrid1.Canvas.FillRect(r);
    
// Dibujar el rectangulo del foco
  if DBCtrlGrid1.PanelIndex = Index then
    DBCtrlGrid1.Canvas.DrawFocusRect(r);
end;

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,
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


La franja horaria es GMT +2. Ahora son las 23:13:41.


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