PDA

Ver la Versión Completa : Problema al Pintar DBGrid


MaMu
08-06-2007, 23:32:36
Yo hago lo siguiente, y me funciona perfecto, pero es como si temblara la grilla del DBGrid, como si todo el tiempo estuviera pintándose, y queda feo, como lo puedo solucionar???


procedure TBuscar.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
const
clPaleMacho = TColor($00F1E8DE);
clPaleHembra = TColor($00E1C4FF);
begin
If Column.Field.Dataset.FieldbyName('sexo').AsString = 'MACHO'
then dbgrid1.Columns[3].color := clPaleMacho
else dbgrid1.Columns[3].color := clPaleHembra;
DBGrid1.DefaultDrawColumnCell(rect,DataCol,Column,State)
end;

xEsk
09-06-2007, 03:15:11
Prueba con DBGrid1.DoubleBuffered:=True; (Con asignarlo en el OnCreate ya te vale).

Saludos.

MaMu
09-06-2007, 21:12:47
Prueba con DBGrid1.DoubleBuffered:=True; (Con asignarlo en el OnCreate ya te vale).

Saludos.

Lo hice, pero no hay ningun cambio. Si yo en el procedimiento consulto por el estado o el foco de la selección, deja de parpadear, pero no me respeta la condicion, es decir, me pinta todos iguales.

gluglu
10-06-2007, 11:07:20
Me temo que estés buscando el fallo en el sitio que no es.

Creo casi con toda seguridad que debes de tener un procedimiento en algún lado de tu aplicación que provoque o bien un cambio constante del puntero en la base de datos asociada que provoque el repintado continuo del DBGrid, o alguna otra rutina que te influya en dicho repintado.

Por eso se producirá el parpadeo. Porque por la rutina OnDrawColumnCell que has puesto no debería hacértelo.

Permíteme preguntarte si el código expuesto es la rutina OnDrawColumnCell completa. Puede ser también que dentro del propio OnDrawColumnCell tengas alguna parte de código que te provoque la llamada recursiva al propio método.

MaMu
11-06-2007, 05:43:17
Permíteme preguntarte si el código expuesto es la rutina OnDrawColumnCell completa. Puede ser también que dentro del propio OnDrawColumnCell tengas alguna parte de código que te provoque la llamada recursiva al propio método.

Esta completa, tal cual la uso. Y lo raro es que en ningun otro evento de la aplicacion hay algo que llame al pintado del dbgrid, puesto a que el Query que realiza la consulta, solo se abre en el OnShow del formulario, y se cierra al salir. No se por donde buscar el error.

Saludos

gluglu
11-06-2007, 09:53:36
... mmmm, discreparía contigo de poner la consulta en el OnShow, ya que dicha consulta se ejecutará cada vez que, por ejemplo, pases de una aplicación a otra del propio windows, y tu form se 'oculte'. Al volver se ejecuta de nuevo el evento OnShow y se volverá a ejecutar la consulta sin ser necesario.

Pero esa sería otra discusión diferente. Aun así, no sé si eso puede o no tener influencia en tu 'parpadeo'. Sólo por probar, deberías sacar esa consulta del evento OnShow y colocarla por ejemplo en el OnCreate, que sólo se ejecutará una vez, al crear el Form.

Hay varios temas en el foro sobre orden de llamada a los diferentes eventos OnShow, OnCreate, OnActivate y parecidos.

Respecto a tu afirmación de que no haya nada en tu aplicación que llame al repintado del Grid, ese es precisamente el problema. Que no es que lo llames tu. Sino que el OnDrawColumnCell se ejecuta muchísimas veces sin tu ser consciente de ello. Lo llama el propio delphi cada vez que tenga que repintarse algo del Grid. Por ejemplo, al mover una ventana cualquiera de tu propia aplicación por encima del DBGrid, es necesario repintarlo, y por tanto se llama al evento OnDrawColumnCell.

Por eso, seguramente sin darte cuenta, se estará llamando por algún lado a dicho evento, y es lo que te provoca el parpadeo del mismo.