Ordenar columna ascendente/descentente dbgrid


ordenar-dbgrid

Cómo ordenar una columna en Lazarus

Código fuente para ordenar la columna de un dbgrid al pulsar sobre el título de la cabecera. Comprobará si estaba ordenado de forma ascendente, si es así ordenará la columna de forma descendente y si está ordenado de forma descendente ordenará la columna de forma ascendente.

Con solo cuatro líneas de código lo tenemos desarrollado.

¡¡¡OjO!!! hay que añadir la clase “ZAbstractRODataset”.

También he puesto un label para saber los registros que tenemos y el registro en el que nos encontramos, cambiando cada vez que cambie el datasource.

 

unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, db, FileUtil, ZConnection, ZDataset, Forms, Controls,
  Graphics, Dialogs, DbCtrls, DBGrids, StdCtrls, ZAbstractRODataset;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    DataSource1: TDataSource;
    DBGrid1: TDBGrid;
    DBNavigator1: TDBNavigator;
    Label1: TLabel;
    ZConnection1: TZConnection;
    ZReadOnlyQuery1: TZReadOnlyQuery;
    procedure DataSource1DataChange(Sender: TObject; Field: TField);
    procedure DBGrid1TitleClick(Column: TColumn);
  private
    { private declarations }
  public
    { public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.DBGrid1TitleClick(Column: TColumn);
var
  st:zabstractrodataset.TSortType;
begin
  st:=zreadonlyquery1.SortType;
  zreadonlyquery1.SortedFields:=column.FieldName;
  if st=stAscending then
     zreadonlyquery1.SortType:=stDescending
  else
      zreadonlyquery1.SortType:=stAscending;
  datasource1.DataSet.First;
end;
 
procedure TForm1.DataSource1DataChange(Sender: TObject; Field: TField);
begin
  label1.Caption:='Registro ' +inttostr(zreadonlyquery1.RecNo)+' de '+inttostr(zreadonlyquery1.RecordCount);
end;
 
end.