データセットをソートする (ADO)

 Delphiの ADO Express を使って、グリッド上に表示しているデータセットを実行時に (Requeryせずに) ソートする方法です。

 以下のようにコンポーネントを配置し、DBGridに ADOQueryの内容を表示します。DBGrid のカラムをクリックされたらその列でソートするようにします。ソートには TCustomADODataSet の、Sort メソッドじゃなくて Sort プロパティを使います。 このプロパティにフィールド名を渡すとその列でソートされます。フィールド名の後ろに DESC をつけると降順にソートされます。

 以下のコードでは、グリッドのカラムをクリックするとその列でソートし、同じ列をもう一度クリックしたら今度は降順でソートします。 

■ ソートの例
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, ADODB, Grids, DBGrids, StdCtrls;

type
  TForm1 = class(TForm)
    ADOConnection1: TADOConnection;
    ADOQuery1: TADOQuery;
    DataSource1: TDataSource;
    DBGrid1: TDBGrid;
    procedure FormCreate(Sender: TObject);
    procedure DBGrid1TitleClick(Column: TColumn);
  private
    { Private 宣言 }
    FOldField: string;  // <-- ソート制御用の変数
    FSortAsc: boolean;   // <-- ソート制御用の変数
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  FOldField :=  '';
  FSortAsc  :=  True;
end;

procedure TForm1.DBGrid1TitleClick(Column: TColumn);
begin
  if  (FOldField = Column.FieldName)  then  begin
    //前回と同じ列をクリックされた場合は昇順降順を切り替える
    FSortAsc  :=  not FSortAsc;
  end else begin
    FOldField :=  Column.FieldName;
    FSortAsc  :=  True;
  end;
  if  (FSortAsc)  then  begin
    //昇順ソート
    ADOQuery1.Sort := FOldField;
  end else begin
    //降順ソート
    ADOQuery1.Sort := FOldField + ' DESC';
  end;
end;

end.