データセットをソートする (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.
|