//==============================================================================
//点击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;

解决方案 »

  1.   

    不用SQL语句可以实现吗,我想利用数据库的index...来进行逻辑排序,但不知如何实验,请指教....
      

  2.   

    在建数据库中建立一个索引,
    在delphi中放置一个table/query/adotable/adoquery控件。
    将table/query/adotable/adoquery控件属性中的indexname设为在建数据库时的数据库别名。
      

  3.   

    但这个控件要求connect to 一个数据库才行...
    而且adoquery控件属性中我找不到indexname这一项...
    请高手再指点一下,感激不尽....
      

  4.   

    可以参考:
    TTable.IndexFieldNames
    TTable.IndexName
    TADOTable.IndexFieldNames
      

  5.   

    ok啦......thank you very much.........