Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Columnas del DBGrid (https://www.clubdelphi.com/foros/showthread.php?t=2938)

hgiacobone 13-08-2003 15:22:05

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?

__cadetill 13-08-2003 16:38:29

en mi web tienes una demo del RxDBGrid (DbGrid de las RX) que muestra precisamente eso

hgiacobone 13-08-2003 16:56:25

Cita:

Posteado originalmente por cadetill
en mi web tienes una demo del RxDBGrid (DbGrid de las RX) que muestra precisamente eso
Gracias CADE... siempre tan atento.
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.

le4br 20-11-2004 02:40:09

Cita:

Empezado por hgiacobone
...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.

hgiacobone, ya sabes como hacer para mostrar una imagem en el titulo de la columna?

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.

hgiacobone 23-11-2004 20:51:55

No... nadie me ha ayudado.

le4br 24-11-2004 23:44:40

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!


La franja horaria es GMT +2. Ahora son las 20:00:54.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi