PDA

Ver la Versión Completa : RXDBGrid.OnDrawColumnCell


Cabanyaler
18-11-2005, 15:32:45
Hola amigos, una consulta más.

Quiero visualizar en un DBGrid datos referentes a tuplas de una tabla. Entre otros existen campos de tipo fecha y algunas tuplas continen en fecha almacenado el dato '01/01/1900'.
Mi objetivo es no visualizar esas fechas en la columna destinada a este atributo, pero si todas aquellas que tengan fecha diferente a 01/01/1900.

Para ello he hecho este código.


procedure TFPrincipal.RxDBGridAlbaranDrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumn;
State: TGridDrawState);
begin
if (RxDBGridAlbaran.Columns[4] = Column) then
if(DMInstalgas.ADOSP_AlbaranesFecAlb_Alb.AsString = '01/01/1900') then
begin
DMInstalgas.ADOSP_Albaranes.Edit;
RxDBGridAlbaran.Fields[4].Value := NULL;
end;
end;


Pero el programa se me queda como colgado y como parpadeante dicho RXDBGrid.

¿Sabríais decirme porqué? o ¿como hacerlo?.
;)
Gracias.

Neftali [Germán.Estévez]
18-11-2005, 15:53:45
Se te queda colgado porque te está entrando en un buble; Me da la impresión de que al pintar el DBGrid estás modificando el registro, cosa que seguramente te volverá a repintar el DBGrid y así sucesivamete. Creo que no es el lugar ni el modo de hacerlo.

Si lo que quieres es que la fecha no se vea, pues modifica "el pintado" de la celda, pero no modifiques el registro. Y si lo que quieres es modificar el registro, no creo que un evento de pintado de celdas sea el más adecuado.

Haz una búsqueda en los foros por el evento OnDrawColumnCell y seguro que encuentras ejemplos de cómo pintar la celda, pero repito creo que modificar el registro ahí es un grave error.

roman
18-11-2005, 17:43:32
No creo que ésta sea una cuestión que se resuelva con dibujo. Yo me fijaría quizá en el evento OnGetText del TField correspondiente, o bien hacer un campo calculado que devuelva la fecha si es distinta de '01/01/1900' y blanco en caso de coincidir.

// Saludos

Cabanyaler
18-11-2005, 18:07:43
Ufff, Viernes y calentándome el coco..., menos mal que cobro una pasta!!! (No hay emoticono de descojono tirado por el suelo).


Si lo que quieres es que la fecha no se vea, pues modifica "el pintado" de la celda, pero no modifiques el registro. Y si lo que quieres es modificar el registro, no creo que un evento de pintado de celdas sea el más adecuado


He estado mirando como hacer eso y no lo he averiguado, ¿me puedes decir como escribir el dato que yo quiera en la columna del DBGrid que quiera?.

Gracias. :)

Cabanyaler
18-11-2005, 18:25:15
Tambien he intentado esto propuesto

Yo me fijaría quizá en el evento OnGetText del TField

pero, no sé :rolleyes:
He mirado el evento asociado a los campos del Grid, pero no existe ese evento.
¿Sobre que objeto se aplica ese evento?
Gracias y buen fin de semana.

Neftali [Germán.Estévez]
18-11-2005, 18:39:59
...He estado mirando como hacer eso y no lo he averiguado, ¿me puedes decir como escribir el dato que yo quiera en la columna del DBGrid que quiera?.
Una simpe búsqueda en los foros y llegas aquí (por ejemplo, a éste, porque hay muchos más...)
http://www.clubdelphi.com/foros/showthread.php?t=16818


...He mirado el evento asociado a los campos del Grid, pero no existe ese evento. ¿Sobre que objeto se aplica ese evento?

En el TTable/TQuery/... asociado al DbGrid, pulsa click derecho y obtén los campos del DataSet. En el campo que deses programa el evento comentado.

Cabanyaler
18-11-2005, 22:34:53
Gracias, el próximo Lunes tomo el asunto.
Buen fin de semana y a descansar. :D

Cabanyaler
21-11-2005, 09:17:03
Ya está, a veces las cosas son más sencillas de lo que parecen:
No he escrito lo que queria en el DBGrid, ya que esto suponia escribir en los datos directamente del Dataset, simplemente para no ver lo que no quiero igualo el color de la fuente con el del fondo, de ese modo no se vé.
Gracias a todos y un saludo.


procedure TFPrincipal.RxDBGridPagosObraDrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumn;
State: TGridDrawState);
begin
if (RxDBGridPagosObra.Columns[8] = Column) then
if(DMInstalgas.ADOSP_PagosRegFac_Pag.AsString = '01/01/1900') then
begin
RxDBGridPagosObra.Canvas.Font.Color := RxDBGridAlbaran.Color;
end;
RxDBGridPagosObra.DefaultDrawColumnCell(rect,DataCol,Column,State);
end;

Neftali [Germán.Estévez]
21-11-2005, 10:50:07
Aunque hay un viejo provervio informático que dice "...si funciona, ¡¡NO LO TOQUES!!", creo que vale la pena que pruebes el método que te comenta Roman del GetText (aunque el que comentas ya te funciona); Es más eficiente, que no volver a dibujar toda la celda.

Cabanyaler
22-11-2005, 08:56:46
Si, gracias, ya lo he mirado, pero aplicaré el corolario ;)
La ventaja que presenta el evento OnGetText frente a tratamiento del Canvas, es que el campo se visualizará del modo establecido en el evento OnGetText en cualquier lugar donde lo visualices, mientras en el OnDrawColumnCell, sólo se aplicará al Grid que lo posee.
Gracias a todos. :p