FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
|||
|
|||
Cita:
Mi gustaria saber como mostrar una pequeña flecha en el título de la columna de un DBGrid para indicar el sentido de orden (Des/Asc), pero SIN librerías externas, tambien. |
#2
|
||||
|
||||
No... nadie me ha ayudado.
__________________
Gracias de antemano por vuestra ayuda. ·.:*:.·Yako·.:*:.· |
#3
|
|||
|
|||
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) . . . 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; 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; Gracias a todos y perdon por el español. Saludos! |
|
|
|