FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
||||
|
||||
Columnas del DBGrid
Bien, supongo que esto tambien se aplicaría a un simple Grid.
Si bien puedo ordenar los datos mostrados en un DBGrid al hacer clic sobre el nombre de la columna, Uds. sabrán que en la mayoría de estos componentes (como en el Explorardor de Archivos, en el WinZip, etc) se muestra con una pequeña flecha el sentido de orden [Des/Ascendente]. La pregunta es: ¿Cómo se puede mostrar esta flecha o gráffico similar en el título de la columna de un DBGrid en que el usuario hace el clic?
__________________
Gracias de antemano por vuestra ayuda. ·.:*:.·Yako·.:*:.· |
#2
|
|||
|
|||
en mi web tienes una demo del RxDBGrid (DbGrid de las RX) que muestra precisamente eso
|
#3
|
||||
|
||||
Cita:
De todas formas, lo interesante sería tratar de hacer SIN librerías externas. Eso es lo que busco. Tal vez alguien sepa cómo hacerlo; de hecho alguine una vez me ha comentado que con alguna metodología del Canvas era posible, pero no logro desculalrlo.
__________________
Gracias de antemano por vuestra ayuda. ·.:*:.·Yako·.:*:.· |
#4
|
|||
|
|||
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. |
#5
|
||||
|
||||
No... nadie me ha ayudado.
__________________
Gracias de antemano por vuestra ayuda. ·.:*:.·Yako·.:*:.· |
#6
|
|||
|
|||
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! |
|
|
|