Ver Mensaje Individual
  #6  
Antiguo 24-11-2004
le4br le4br is offline
Miembro
 
Registrado: nov 2004
Posts: 17
Reputación: 0
le4br Va por buen camino
Solucion encontrada!

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!
Responder Con Cita