¿Qué tal estáis…?

Volvemos tras un verano de calor… Esta misma noche fue una de las mas calurosas que recuerdo. De hecho, ayer mismo, el termómetro se acerco a los 44º y la tarde fue asfixiante. La disfruté visitando una exposición temporal sobre arqueología Egipcia que se celebra en Alicante, en el Museo Arqueológico Marq, y aunque la capital mantiene unas temperaturas bastantes suaves y agradables por la cercanía del mar, hacía calor. Muy recomendable esta exposición si estáis en la zona, ya que no es demasiado habitual para nosotros ver de cerca una momia y conocer los ritos funerarios de la fascinante y enigmática civilizacion egipcia (El enigma de la momia). Aunque, para ser justos, el visitante se queda con ganas de mas, y no imagino lo agradable y enriquecedor que puede ser conocer el total de lo expuesto en el Louvre, puesto que lo visto en Alicante es tan solo una parte pequeña.

Pero dejemos las momias por el momento y permitid que me remonte varios días atrás, durante la semana anterior, cuando estaba pensando con qué iba a abrir el blog, tras las vacaciones…  😉

Mentiría si os dijera que no me sobresaltó el móvil. Mientras estamos concentrados en resolver nuestras tareas rutinarias,  a veces perdemos la  noción temporal y espacial, abstraídos en seguir el hilo al código escrito y entender lo que en ese momento falla, o no hace lo que deseamos, que también sucede. Así que al volver a la realidad, tras la sacudida de la melodía marchosa que había alertado a media oficina, lo primero que se escuchó a medida que iba acercándome el auricular a mi oreja, era una serie de gruñidos ininteligibles que iban creciendo, hasta obligarme a retirarlo prudencialmente. No estaba demasiado contento el interlocutor desconocido o quizás se hubiera atragantado en un almuerzo improvisado. 😕

-grrrrrrrrr… me cago en su p. madre….  me cago en tooo… en tooooo… grrrrrrrrrrr… -iba adivinando en el tumultuoso sonido de mi auricular. Se oían de fondo como golpes secos que yo imaginaba eran los puños de aquella persona contra alguna mesa…

-¿si..? ¿Pero quién eres… ?- pregunté esperando quizás que fuera alguna equivocación o malentendido o cruce de lineas.

-¡Manuel!… -respondió atropelladamente el desconocido- ¡qué soy yo!… Manuel… -¿Dónde estás ahora? ¿Puedes hablar?

-Joder… -asentí con la cabeza como si Manuel pudiera verme- Sí puedo hablar. ¿qué pasa?

-Nada tío… ¡Que estoy intentando cambiar el color del título de una columna del dbgrid y me dice que naranjas de la china… ¡Qué asco…!. Cuatro horas perdí ayer en la empresa con esta tontería. ¡Increible! Si tuviera cerca a esos de la Barca les… (ruido de fondo, ggggggererereerttweqwqfgafsdsfoooofsdfoafodrrgrgrgrgrgrgrgr)…

Manuel aumentaba su indignación a medida que me narraba sus cuitas.

-¡No jodas! -exclamé con aspavientos.

Y ahí se quedó la cosa…

Así que tras colgar, mi curiosidad por ver cual era el problema iba creciendo. Revisé la nota que había escrito y la guarde en la cartera hasta que al llegar a casa pudiera ver de cerca el problema. Con independencia de que no tenga mayor importancia, pues a fin de cuentas es trivial que el usuario no pueda cambiar el color del titulo de la columna de un tdbgrid, no parece algo de vida o muerte. Eso si, sí parece cierto que la mayoría de las veces, resolvemos cosas de esa forma. Otras veces ni siquiera se resuelven y nos vemos obligados a tomar atajos o parchear para evitar los problemas, o buscamos componentes que resuelvan eso que el que tenemos en las manos no nos da. A veces somos nosotros los que estamos a un lado de la linea y en ocasiones estamos en el otro lado. Y los foros y las relaciones de amistad cubren para ser justos, muchos de estos problemas que o bien no están bien documentados ni registrados o bien forman parte de expedientes X, dignos de Iker Jimenez en 4º Milenio…  😀

(por cierto… y hablando de otra cosa y ya que estáis aquí:  ya veis que se ha cambiado el tema de wordpress en el blog… en mi pensamiento: el móvil y los posibles conexiones al blog desde éstos, en un Mundo donde cada vez tiene mas peso esta posibilidad. Ha supuesto perder algo de estética. El tema anterior me gustaba). También ha tenido peso intentar conseguir menor tiempo de carga de la página. Eliminar pluggins que retrasaban la carga de la página: ¿seguridad frente a velocidad?, etc. etc. Aunque ni yo mismo me lo crea, llevo varias semanas con estos detalles. ¡Increible, che!. También y ya para acabar, ando en el intento de enlazar mi FaceBook con el blog, que me permitirá compartir las entradas también desde la cuenta que he abierto a tal efecto. Ya he visto que existen bastantes pluggins aunque por problemas puntuales de Facebook todavía no he podido crear una aplicación para activar el conector).
Veamos… ¿por dónde iba? Ahhh. Sí.

Lo del color del título de la columna en el componente TDBGrid debe ser una tontería pero por lo que he podido ver funcionaba hasta Delphi 2007. No lo he probado en Delphi 2009, pero lo que es en Delphi 2010 parece que da problemas. Introdujeron algunos cambios para incorporar los temas de windows y los gradiantes, con el fin de mejorar la estética de la rejilla de datos, pero lo que se consigue es que con el flag gdsClassic todas las columnas se repinten del color fijo y no del color persistente individual.

Cuando llegué a casa, y con ánimo de echarle una mano a Manuel, escribí unas lineas muy sencillas de código para reproducir el problema, y las probé tanto en Delphi 2007 como en Delphi 2010.

Descargar el código: Aquí.

Esta es una imagen que aparecen las dos ventanas que estaba contrastando.

captura_problema_color_titulo


procedure TForm1.bnColorClick(Sender: TObject);
begin
Rejilla.Columns[0].Title.Color:= clRed;
end;

Pues lo dicho. Algo tan sencillo como eso, no funcionaba en Delphi 2010 tras los cambios. O por lo menos, yo tampoco lo sabía corregir, si es que era un tema de cambiar alguna de las opciones del componente.

Lo siguiente… ir poniendo puntos de parada para intentar comprender cual era el problema y de lo visto, creo entender que una de las lineas introduce a piñon el color fijo (fixedcolor), error que se produce al invocar la siguiente llamada:

DrawCellBackground(TitleRect, FixedColor, AState, ACol, ARow – FTitleOffset);

dentro del código del procedimiento

procedure DrawTitleCell(ACol, ARow: Integer; Column: TColumn; var AState: TGridDrawState);

Éste (DrawTitleCell), declarado en el interior del método  TCustomDBGrid.DrawCell, queda acotado al ámbito local del mismo.

A lo tonto a lo tonto (expresión que expresa que aunque parezca increible sucedió  :-D) me zampé parte de la tarde y de la noche jugueteando con esta tontería.  😉  Acompañado de un vaso grande de Horchata, muy rica, extraordinariamente rica, y de varios fartons y congrets, deliciosos… Ummmmmmmm.. (me puse como el tio quico!!!!!!) .

(*) Fartons (una imagen para que sepais que es un farton)  😉

Y resolví finalmente por crear un descendiente de la clase TDBGrid añadiendo un método que  pudiera redefinir DrawCellBackground y poder así cambiar el comportamiento, ya que parecía entre las distintas posibilidades la mas sencilla . El crear un descendiente era simplemente porque este método es declarado como protegido.

Escribí unas lineas de código, que veis a continuación.

unit ColorearColumnaD2010;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids, DBGrids, ADODB, DB, DBClient, TConnect, Provider, StdCtrls,
  ExtCtrls, DBCtrls;

const
  kseparacion = 5;
type
  TRejilla = class(TDBGrid)
  protected
    procedure DrawCellBackground(const ARect: TRect; AColor: TColor;
  AState: TGridDrawState; ACol, ARow: Integer); override;
  end;

  TForm1 = class(TForm)
    dsData: TDataSource;
    Button1: TButton;
    data: TClientDataSet;
    dataID: TIntegerField;
    Navegador: TDBNavigator;
    procedure RejillaTitleClick(Column: TColumn);
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    Rejilla: TRejilla;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  Rejilla.Columns[0].Title.Color:= clGreen;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  fColumn: TColumn;
begin
  Rejilla:= TRejilla.Create(self);
  Rejilla.Parent:= self;
  Rejilla.Top:= Navegador.Top + Navegador.Height + Kseparacion;
  Rejilla.Left:= Navegador.Left;
  Rejilla.DataSource:= dsData;
  Rejilla.DrawingStyle:= gdsClassic;
  Rejilla.OnTitleClick:= RejillaTitleClick;
  data.Open;
  fColumn:= Rejilla.Columns.Add;
  fColumn.FieldName:= 'ID';
  fColumn.Title.Color:= clRed;
end;

procedure TForm1.RejillaTitleClick(Column: TColumn);
begin
  ShowMessage('Pulsaste la columna '+ IntToStr(Column.ID));
end;

{ TRejilla }

procedure TRejilla.DrawCellBackground(const ARect: TRect; AColor: TColor;
  AState: TGridDrawState; ACol, ARow: Integer);
begin
  if ACol < 0 then
    inherited DrawCellBackground(ARect, AColor, AState, ACol, ARow)
  else inherited DrawCellBackground(ARect, Columns[ACol].Title.Color, AState, ACol, ARow);
end;

end.

Para aclarar un poco, simplemente comentar que dado que no lo tenía instalado en la paleta de componentes, existen esas lineas de creación y asignación de propiedades en el evento de OnCreate del formulario. Otra opción sencilla, hubiera sido interponer la clase. Ya lo vimos en uno de los capítulos de la serie de los mayores, cuando hablábamos de la unidad UGrids.

Respecto al método sobrescrito, solo si el índice del parámetro que representa a la columna (ACol) es menor que cero se deja el color por defecto (estaríamos dibujando sobre la columna de indicadores). En caso contrario, entregamos el color del título de la columna, para que se repinte de la forma deseada.

Ahhh… la conversación figurada que he descrito con mi amigo es como podéis imaginar figurada… 🙂 para darle un poco de emoción y vida a esta entrada. Pero sí es cierto que él andaba molesto por la perdida de tiempo que suponen este tipo de problemas. Lo cual nos lleva a reflexionar sobre algo que quizás pase desapercibido pero que en mi opinión nos está afectando y es el mantenimiento y mejora de la propia VCL. A nadie se le escapa que a pesar de los esfuerzos que se han podido hacer en ese sentido, existen todavía muchos trabajo que hacer.

Este tema sí me parece importante. Tanto como lo pueda ser que el día de mañana aparezca Delphi para 64 bits o para multiplataforma. Seguro que vosotros tenéis opinión formada sobre eso. En la mía quedan preguntas en el aire que son dificiles de responder…

¿Seguir avanzando y dotar al entorno de nueva funcionalidad sin reforzar el mantenimiento de lo construido a la fecha?

¿Qué papel juega la comunidad realmente en todo esto?

¿Qué responsabilidad moral de la empresa sobre lo que sabe que no funciona?

Se me ocurren mil preguntas, a cada cual más difícil de responder…

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s