Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   RXDBGrid.OnDrawColumnCell (https://www.clubdelphi.com/foros/showthread.php?t=27367)

Cabanyaler 18-11-2005 15:32:45

RXDBGrid.OnDrawColumnCell
 
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.

Código Delphi [-]
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).

Cita:

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
Cita:

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

Cita:

Empezado por Cabanyaler
...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


Cita:

Empezado por Cabanyaler
...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.

Código Delphi [-]
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


La franja horaria es GMT +2. Ahora son las 15:57:07.

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