DBGridのカラムをクリックでソート

先日、お客様にExcelのように任意の順番でソートできないの?って聞かれました。
なので、「DBGridのカラムをクリックした時にソートの順序を指定するようにプログラムすれば出来るので、その方向で進めますね~。」って話をしていたら、それって毎回データベースを読みに行くの?Delphiってキャッシュできるんでしょ?と言われてキャッシュしてても操作できないよな~と思いつつ…。今思い出す限り出来ないですね~><;また調べておきます~。って返答しちゃいました。

TQueryでは出来ないのですが、TTableやMIDASのTClientDataSetを利用すると出来ちゃうんですね。

※MIDASを利用して多層アプリケーションを構築するとMIDASライセンスが別途必要ですが、クライアントにTClientDataSetを配置する2層アプリケーションでは不要でした。(2010やXEではMIDASライセンスって要らないらしいですね。)

で、そのプログラム方法なんですが、ExcelライクにTDBGridのカラムクリック時(TCustomDBGrid.TitleClick)イベントで処理することとします。
ソートを指定する関数を作ります。(便宜上TClientDataSet固定にしてます。)

procedure CdsAddIndex(Column: TColumn);
const
  cASC = '_ASC';
  cDESC = '_DESC';
var
  s, sFielsName: string;
begin
  if (Column.Grid.DataSource.DataSet = nil)
    or (Column.Grid.DataSource.DataSet = nil) then exit;
  if (Column.Grid.DataSource.DataSet.RecordCount = 0) then exit;

  if not (Column.Grid.DataSource.DataSet is TClientDataSet) then exit;

  sFielsName := Column.FieldName;

  with TClientDataSet(Column.Grid.DataSource.DataSet) do
  begin
    if (IndexName = sFielsName + cASC) then
    begin      // 昇順の時には降順にする。
      s := sFielsName + cDESC';
      AddIndex(s, sFielsName, [ixDescending]);
    end
    else
    begin      // 未指定の時&降順の時には昇順にする。
      s := sFielsName + cASC;
      AddIndex(s, sFielsName, []);
    end;
    IndexName := s;
  end;
end;

この関数を下記の用にTDBGridのカラムクリック時(TCustomDBGrid.TitleClick)イベント書くだけでOKです。

procedure TForm1.dbgrid1TitleClick(Column: TColumn);
begin
  AddIndexCds(Column);
end;

ただし、この方法が有効なのはソートの項目が1つだけ、複数サポートしようと思うと、ソートの一括クリアやポップアップでのソート順序の入れ替えなどまで凝らないと、ユーザーから追加要望が来そうですね~。

現在のインデックスの状況は、公式サイト内のインデックス情報の取得を参考にすれば取得可能ですね。
ポップアップのリストは…TJDBGridで作ったけど2010には、元からコンポーネントがあったような気もするな…。

あっ、拙作のTJDBGridにその機能を盛り込んじゃうのも手なのかな…
すでに更新しなくなってから久しいTJDBGridですが、未だに利用していただいてる方は居られるのでしょうか?

コメント (0件)


くろねこ研究所
https://www.blackcat.xyz/article.php/ProgramingFAQ_del0072