<p>で、そのプログラム方法なんですが、ExcelライクにTDBGridのカラムクリック時(TCustomDBGrid.TitleClick)イベントで処理することとします。<br />
ソートを指定する関数を作ります。(便宜上TClientDataSet固定にしてます。)</p>
<pre class="brush: delphi;" title="関数部分">
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;
</pre>
<p>この関数を下記の用にTDBGridのカラムクリック時(<a href="http://docs.embarcadero.com/products/rad_studio/radstudio2007/RS2007_helpupdates/HUpdate4/JA/html/delphivclwin32/DBGrids_TCustomDBGrid_TitleClick.html">TCustomDBGrid.TitleClick</a>)イベント書くだけでOKです。</p>
<pre class="brush: delphi;" title="使うところ">
procedure TForm1.dbgrid1TitleClick(Column: TColumn);
begin
  AddIndexCds(Column);
end;</pre>
<p>ただし、この方法が有効なのはソートの項目が1つだけ、複数サポートしようと思うと、ソートの一括クリアやポップアップでのソート順序の入れ替えなどまで凝らないと、ユーザーから追加要望が来そうですね～。</p>
<p>現在のインデックスの状況は、公式サイト内の<a href="http://docs.embarcadero.com/products/rad_studio/radstudio2007/RS2007_helpupdates/HUpdate4/JA/html/devwin32/5datasetobtaininginformationaboutindexes_xml.html">インデックス情報の取得</a>を参考にすれば取得可能ですね。<br />
ポップアップのリストは&hellip;TJDBGridで作ったけど2010には、元からコンポーネントがあったような気もするな&hellip;。</p>
<p>あっ、拙作のTJDBGridにその機能を盛り込んじゃうのも手なのかな&hellip;<br />
すでに更新しなくなってから久しいTJDBGridですが、未だに利用していただいてる方は居られるのでしょうか？</p>