Archivo de la etiqueta: TJvDBGrid

Mejorando el evento OnBeforePaint

¡Hola nuevamente a todos! Lamentablemente he tenido un poco desatendido el blog por unos largos meses. Pero ahora vuelvo con la intensión de liberar una ligera modificación hecha al código de  JVLC. La licencia Mozilla me obliga a liberar mis aportaciones y/o modificaciones hechas a un código liberado originalmente con esta licencia. Es por esta razón que siendo un ciudadano muy respetuoso de la ley hago la público mi código. Sinceramente no solo lo hago porque la licencia me obliga, sino porque espero que otros desarrollares se beneficien de esta pequeña, pero muy útil modificación.

Primero quiero hacer una breve reseña sobre el origen de esta modificación. Resulta que últimamente me he vuelto un poco paranoico con la cuestión del Custom Drawing en el DBGrid. Es por eso que llegué a la necesidad de querer pintar toda la apariencia, no sólo de una simple celda, sino la de un Grid entero. En mi búsqueda de una solución eficiente y sencilla, trabajando con el componente TJvDBGrid me encontré con el evento “OnBeforePaint“. Me pareció una genial idea que alguien halla incluido tan útil evento a este componente. Lamentablemente, parece que a la persona que se le ocurrió esta idea no pensó en algunas posibilidades más que se le podrían dar a este evento, pues simplemente era un evento de tipo TNotifyEvent. En mi caso, lo que necesitaba era cancelar el pintado normal del DBGrid y proceder a mi manera si se daba el caso. Sin embargo, el evento tal y como estaba no me permitía cancelar el pintado normal que inevitablemente siempre ocurriría después. Es por la gracia y libertad del código abierto que pude indagar en el código fuente de dicho componente y modificar la declaración e implementación del evento OnBeforePaint.

Lo que hice fue lo siguiente:

1. Declare un nuevo tipo de evento llamado TJvBeforePaintEvent, que sería una extención del tipo TNotifyEvent, pero que contendría un último parámetro DoDefaultDrawing que cuando sea devuelto como False detendrá la consecutiva pintada estándar del Grid.:

TJvBeforePaintEvent = procedure(Sender: TJvDBGrid; var DoDefaultDrawing: Boolean) of object;

2. Cambié el tipo de la variable de FOnBeforePaint y propiedad OnBeforeEvent de la clase TJvDBGrid para que fuera del nuevo tipo TJvBeforePaintEvent .

TJvDBGrid = class(TJvExDBGrid, IJvDataControl)
    .....
    FOnBeforePaint: TJvBeforePaintEvent;
    .....
    property OnBeforePaint: TJvBeforePaintEvent read FOnBeforePaint write FOnBeforePaint;

3. El último paso fue cambiar ligeramente la implementación del procedimiento Paint de la clase TJvDBGrid para que hiciera uso del nuevo parámetro DoDefaultDrawing en TJvBeforePaintEvent.

procedure TJvDBGrid.Paint;
var
    DoDefaultDrawing: Boolean;
begin
    DoDefaultDrawing := True;
if Assigned(FOnBeforePaint) then
 FOnBeforePaint(Self, DoDefaultDrawing);
if not DoDefaultDrawing then
 exit;

.....

Esta simple modificación me ha permitido, en mi caso, darle más funcionalidades al DBGrid. Por ejemplo, pintar unas breves instrucciones en el formulario dónde está la rejilla. O pintar un mejor mensaje cuando por ejemplo no hay registros en la consulta realizada, por ejemplo:

En donde dice “Ningún registro coincide con su búsqueda…” pareciera algún tipo de TPaintBox, pero en realidad es un TJvDBGrid que ocupa casi todo el formulario. El texto y el degradado mostrado lo pinto en el evento OnBeforePaint con la ayuda de la modificación que os he expuesto. Esta es la ventana donde se muestran los registros de pacientes para un sistema que he estado desarrollando llamado Biolab.

Etiquetado , , ,