DBGirdのソート後の表示

解決


久美子  2009-11-10 05:37:11  No: 36128  IP: 192.*.*.*

DBGirdのタイトルクリックに対応したエベントで、DataSet.SortまたはClientDataSet1のインデックスでデータをソートしたとき、ソート後の列の表示が一番左になります。そのままの列の表示を維持する方法はありませんでしょうか。

編集 削除
igy  2009-11-10 13:22:54  No: 36129  IP: 192.*.*.*

これは、
例えば、「フィールドA」「フィールドB」「フィールドC」「フィールドD」
があり、「フィールドC」でソートした時、

並びが
「フィールドC」「フィールドA」「フィールドB」「フィールドD」
になるのですか?

それともDBGridで横にスクロールしてしまい、
(「フィールドA」「フィールドB」が隠れて)
「フィールドC」「フィールドD」が表示するのですか?

編集 削除
久美子  2009-11-10 13:32:05  No: 36130  IP: 192.*.*.*

説明不足ですみません。
例えば、「フィールドA」「フィールドB」「フィールドC」「フィールドD」があり、初期画面では「フィールドD」が隠れいているとします。
横スクロールで隠れいていた「フィールドD」のタイトルをクリックしてソートした後に、横スクロールでまた「フィールドD」が隠れてしまいますが、これを回避したいと苦労しています。よろしくお願いします。

編集 削除
igy  2009-11-10 13:46:43  No: 36131  IP: 192.*.*.*

>これを回避したいと苦労しています。

とのことなので、すでにいろいろ試されていると思いますが、

SelectedField プロパティ
SelectedIndex プロパティ
あたりを指定して、

(ソート前と全く同じにはならないかもしれませんが)
希望する列を表示するように調節などは、できますか?

# 試していませんので、うまくいくかわかりませんが・・

編集 削除
Mr.XRAY  2009-11-10 18:40:51  No: 36132  IP: 192.*.*.*

こんにちは.Mr.XRAYです.

横スクロールの位置を記憶しておいて,ソートしたら記憶しておいた分だけ横
スクロールさせる,という考え方はどうでしょう.

var
    APos : Integer;
begin
    //現在の横スクロールバーの位置を記憶しておく
    APos := GetScrollPos(DBGrid1.Handle,SB_HORZ);

    //表示コントロールの更新停止
    Query1.DisableControls;
    
    //ソートやDBGrid1に対する操作
    
    //表示コントロールの表示再開
    Query1.EnableControls;

    //記憶しておいた位置まで横スクロール
    SetScrollPos(DBGrid1.Handle,SB_HORZ,APos,True);
end;

環境が書いてないので,とりあえず,
WindowsXP(SP3) + Delphi6,7,2007,2009,2010で動作確認しました.

参考ページ
http://mrxray.on.coocan.jp/Halbow/Chap14.html

編集 削除
久美子  2009-11-11 04:44:11  No: 36133  IP: 192.*.*.*

皆さん、ありがとうございました。
Mr.XRAY さんの、方法でもうまくいかず、いろいろと試行錯誤したら、
DBGrid1.Options で [dgRowSelect]を設定していたためでした。
これをはずしたら、うまくいきました。
今後ともよろしくお願いします。

編集 削除