Hola amigos,
Yo no desisto nunca y como en Delphi nadia es impossible, aqui hay una solucion que ordena los datos de la tabla, atraves del metodo Sort, y agrega una imagem bmp, en el titulo de la columna del DBGrid, que indicaran la ordem de los registros (ASC / DESC).
El codigo es de Luiz Fernando Severnini y adaptado por mim.
- Vamos utilizar um TImageList (Win32 Component Palette). Doble clique en el ImageList1 para añadir las imagens bmp (Puedes crear las imagens en Paint del Windows o obtener en la carpeta de imagens en el diretorio Borland Shared). Seta arriba indica la ordem DESC y seta abajo ASC.
Ahora devemos añadir la declaracion TDBGrid = class(DBGrids.TDBGrid) en la linea seguinte al type:
Código:
type
TDBGrid = class(DBGrids.TDBGrid);
TForm1 = class(TForm)
.
.
.
Declaramos Indice como variable global
Código:
var
Form1: TForm1;
.
.
.
// Adquiri la columna clicada, para mostrar la imagem.
Indice: Integer;
En el evento OnTitleClick do DBGrid:
Código:
procedure TForm1.DBGrid1TitleClick(Column: TColumn);
begin
// Ordena los datos ASC o DESC
if DBGrid1.DataSource.DataSet is TCustomADODataSet then
with TCustomADODataSet(DBGrid1.DataSource.DataSet) do
if (Pos(Column.FieldName, Sort) = 1) and (Pos(' ASC', Sort)= 0) then
begin
// Sort specifies the sort order of the recordset.
Sort := Column.FieldName + ' ASC';
end
else
begin
Sort := Column.FieldName + ' DESC';
end;
Indice := Column.Index; { Returns the item’s position in the Items array of TCollection. Atribue la columna clicada a variable global}
end;
Ahora en el evento OnDrawColumnCell del DBGrid1:
Código:
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
Bmp : TBitMap; // variable del tipo TBitMap que recibi la figura de lo ImageList1
// Funcion local al evento OnDrawColumnCell, para obtener la anchura de las columnas:
function GetColsWidth: Integer;
var
I : Integer;
begin
Result := 0;
for I := 0 to Column.Index do
begin
Result := Result + TDBGrid(Sender).Columns.Items[i].Width;
end;
Result := Result + 10 + (Column.Index);
end;
begin
// Hacemos el acesso a los membros protegidos de la classe TDBGrid
with TDBGrid(Sender) do
begin
// Determina la columna clicada...
if Column.Index = Indice then
begin
// ...Creamos la variable Bmp
Bmp := TBitMap.Create;
with Bmp do // Configuracion de color transparente
begin
TransparentColor := clWhite;
Transparent := True;
TransparentMode := tmAuto
end;
try
// Determina la imagem mostrada de acuerdo com la ordem de los registros
if DBGrid1.DataSource.DataSet is TCustomADODataSet then
with TCustomADODataSet(DBGrid1.DataSource.DataSet) do
if (Pos(Column.FieldName, Sort) = 1) and (Pos(' ASC', Sort)= 0) then
ImageList1.GetBitmap(0, Bmp) // Seta abajo
else
ImageList1.GetBitmap(1, Bmp); // Seta arriba
// Determina se la altura del titulo es suficiente para recibir la imagem
if RowHeights[0] < Bmp.Height+4 then
RowHeights[0] := Bmp.Height+4;
// Muestra la imagem el titulo de acuerdo com la posição
Canvas.Draw((GetColsWidth-Bmp.Width),(RowHeights[0] - Bmp.Height) div 2, Bmp);
finally
Bmp.Free; // Liberamos la variable Bmp de la memoria
end;
end
else
// Si no es la columna clicada, entonces nadia acontece...
DefaultDrawColumnCell(Rect,DataCol,Column,State);
end;
end;
Que tal?
Gracias a todos y perdon por el español.
Saludos!