这里有一过程;
procedure Tform1.SortQuery(column:TColumn);
var
SqlStr,myFieldName,TempStr: string;
OrderPos: integer;
SavedParams: TParams;
begin
if not(Column.Field.FieldKind in [fklookup,fkdata]) then
exit;
if column.Field.FieldKind = fkdata then
myFieldName := UpperCase(column.Field.FieldName)
else
myFieldName := UpperCase(column.Field.KeyFields);
while Pos(myFieldName,'')<>0 do
myFieldName := Copy(myFieldName,1,pos(myFieldName,'')-1) +
','+Copy(myFieldName,Pos(myFieldName,'')+1,100);
with TQuery(TDBGrid(Column.Grid).DataSource.DataSet) do
begin
SqlStr := UpperCase(SQL.Text);
if ParamCount > 0 then
begin
SavedParams := TParams.Create;
SavedParams.Assign(Params);
end;
OrderPos := pos('ORDER',SqlStr);
if (OrderPos = 0) or (pos(myFieldName,copy(SqlStr,OrderPos,100)) = 0) then
TempStr := ' order by ' + myFieldName + ' Asc'
else
if pos('Asc',SqlStr) = 0 then
TempStr := ' order by ' + myFieldName + ' Asc'
else
TempStr := ' order by ' + myFieldName + ' Desc';
if OrderPos <> 0 then
SqlStr := copy(SqlStr,1,OrderPos - 1);
SqlStr := SqlStr + TempStr;
Active := False;
SQL.Clear;
SQL.Text := SqlStr;
if ParamCount > 0 then
begin
Params.AssignValues(SavedParams);
SavedParams.Free;
end;
Prepare;
Open;
end;
end;
procedure TForm1.DBGrid1TitleClick(Column: TColumn);
begin
SortQuery(Column);
end;
再titleclick事件中//如果选用AdoDataSet(AdoTable,AdoQuery等)可以使用
with Column do
if Field <> nil then
if Field.DataSet is Tadodataset then
with Field.DataSet as Tadodataset do
if active then
begin
if tag = 0 then
begin
sort := '';
tag := 1;
end
else if tag = 1 then
begin
sort := column. fieldname + ' DESC';
tag := 2;
end
else
begin
sort := Column.FieldName + ' ASC';
tag := 0;
end;
end;
procedure tfrom1.dbgrid1columnmoved(sender: tobject;fromindex,toindex:integer);
var
i : integer;
fname: string;
begin
with dbgrid1.datasource.dataset as ttable do
for i:=0 to indexdefs.count-1 do
begin
fname:=dbgrid1.field[0].fieldname;
if copy(indexdefs[i].fields,1,length(fname))=fname then
indexname:=indexdefs[i].name;
end;
end;