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!