//==============================================================================
//点击DBGrid标题栏对查询结果排序************************************************
//==============================================================================
procedure DBGridTitleOrder(Column: TColumn);
var
  SQLStr, OrderFieldName, TempStr: string;
  i, OrderPos: integer;
  SavedParams: TParams;
begin
  if not (TQuery(TDBGrid(Column.Grid).DataSource.DataSet).State in [dsBrowse]) then Exit;
  SavedParams := nil;
  for i:=0 to Column.Grid.FieldCount-1 do
  begin
    {TDBGrid(Column.Grid).Columns[i].Font.Color := clBlack;}
    TDBGrid(Column.Grid).Columns[i].Title.Caption := TDBGrid(Column.Grid).Columns[i].Field.DisplayName;
  end;
  if not (Column.Field.FieldKind in [fkData,fkLookup]) then Exit;
  if Column.Field.FieldKind=fkData
  then OrderFieldName := LowerCase(Column.Field.FieldName)
  else OrderFieldName := LowerCase(Column.Field.KeyFields);
  while Pos(OrderFieldName,';')<>0 do OrderFieldName := copy(OrderFieldName,1,Pos(OrderFieldName,';')-1)+','+copy(OrderFieldName,Pos(OrderFieldName,';')+1,100);
  with TQuery(TDBGrid(Column.Grid).DataSource.DataSet) do
  begin
    SQLStr := LowerCase(SQL.Text);
    if ParamCount>0 then
    begin
      SavedParams := TParams.Create;
      SavedParams.Assign(Params);
    end;
    OrderPos := pos('order',SQLStr);
    if (OrderPos=0) or (pos(OrderFieldName,copy(SQLStr,OrderPos,100))=0) then
    begin
      TempStr := ' order by ' + OrderFieldName + ' asc';
      Column.Title.Caption := Column.Title.Caption + '(▲)';
      {Column.font.Color := clRed;}
    end else if pos('asc',SQLStr)=0 then
    begin
      TempStr := ' order by ' + OrderFieldName + ' asc';
      Column.Title.Caption := Column.Title.Caption + '(▲)';
      {Column.font.Color := clRed;}
    end else
    begin
      TempStr := ' order by ' + OrderFieldName + ' desc';
      Column.Title.Caption := Column.Title.Caption + '(▼)';
      {Column.font.Color := clGreen;}
    end;
    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;