うーん、これは少しトリッキーに思えます (不可能ではないにしても)。列のタイトルをクリックして、DBGrid でデータを並べ替えようとしています。
問題は、私が (悲しいことに) Delphi 3 で作業していることです。私は ADO DataSets を使用しておらず、クエリは多くの行を取得するため、order by
クリックの句を変更して TQuery を再度開くことはできません。
誰かがこのようなものを実装しましたか?
これは実際にはデータセットを並べ替えることで行われ、グリッドに変更が反映されます。その列のデータセット フィールドにインデックスを作成することで、簡単に実行できます。もちろん、これは などのインデックスの並べ替えをサポートするデータセットでのみ実行できますTClientDataset
。
TDBGrid の OnTitleClick メソッドでは、次のようなことができます...
procedure TfmForm1.DBGrid1TitleClick(Column: TColumn);
var
i: Integer;
begin
// apply grid formatting changes here e.g. title styling
with DBGrid1 do
for i := 0 to Columns.Count - 1 do
Columns[i].Title.Font.Style := Columns[i].Title.Font.Style - [fsBold];
Column.Title.Font.Style := Column.Title.Font.Style + [fsBold];
with nxQuery1 do // the DBGrid's query component (a [NexusDB] TnxQuery)
begin
DisableControls;
if Active then Close;
for i := 0 to SQL.Count - 1 do
if (Pos('order by', LowerCase(SQL[i])) > 0) then
//NOTE: ' desc' The [space] is important
if (Pos(' desc',LowerCase(SQL[i])) > 0) then
SQL[i] := newOrderBySQL
else
SQL[i] := newOrderBySQL +' desc';
// re-add params here if necessary
if not Active then Open;
EnableControls;
end;
end;
これを最適化する方法はたくさんありますが、使用するコンポーネントの機能によって異なります。上記の例ではクエリ コンポーネントを使用していますが、テーブル コンポーネントを使用した場合は、'order by' 句の代わりに使用するインデックスを変更します。
ここでの SQL の処理は、非常に基本的なバージョンです。SQL バッチ ステートメントなどを処理しないため、複数の 'order by..' 句またはコメント化された SQL ステートメントが発生する可能性があります。つまり、角かっこで囲まれたコメント "{..}" や単一行コメント "//" は無視されます。
よろしく
Delphi3にはがありTClientDataset
ます。またTQuery
、データベースに明示的に作成されたインデックスを使用して、プロパティのデータを並べ替えることができIndexName
ます。
これを行う方法の例を次に示します。列のタイトルをクリックして、Delphi DBGrid でレコードを並べ替える。
TClientDataSet
すでに述べたように、 (cds.IndexFieldNames := Column.FieldName
の でOnTitleClick
)を使用している場合、並べ替えは非常に簡単ですTDBGrid
。ただし、これができない場合は、クエリを再生成するか (やりたくないことを述べています)、Express Quantum Grid (ソートできると思います) などのより高度なデータ グリッドを取得できます。
TDBGrid の OnTitleClick メソッドで、次の簡単なコードを記述できます。
procedure TForm1.DBGrid3TitleClick(Column: TColumn);
var
cFieldName:string;
begin
cFieldName:= DBGrid3.SelectedField.FieldName;
AdoDataset1.Sort:=cFieldName;
end;