不知道各位有没有用过Foxmail,单击“发件人”或者其他标题,就
能进行自动排序。我也想实现类似的功能,不知道怎么做。

解决方案 »

  1.   

    呵呵~~~ 不是 DBGrid ,用的是 ListView,这有代码:====================================================================
    SortAZ       是一个 Boolean 的类型,代表现在是处于顺序还是反序
    actSortAZ    和 actSortZA 是顺序和反序
    ColumnToSort 是一个 integer 类型,表示目前处于哪一列的排序
    actSort1...7 是七个排序的菜单,分别是按 ListView 的七个列排序procedure TFrmMain.SortClick(id:Integer);
    begin
      actSort1.Checked := False;
      actSort2.Checked := False;
      actSort3.Checked := False;
      actSort4.Checked := False;
      actSort5.Checked := False;
      actSort6.Checked := False;
      actSort7.Checked := False;
      case id of
        0: actSort1.Checked := True;
        1: actSort2.Checked := True;
        2: actSort3.Checked := True;
        3: actSort4.Checked := True;
        4: actSort5.Checked := True;
        5: actSort6.Checked := True;
        6: actSort7.Checked := True;
      end;  actSortAZ.Checked := False;
      actSortZA.Checked := False;
      if SortAZ then actSortAZ.Checked := True 
                else actSortZA.Checked := True;  ColumnToSort := id;
      ListView1.AlphaSort
    end;procedure TFrmMain.ListView1ColumnClick(Sender: TObject;
      Column: TListColumn);
    begin
      if ColumnToSort = Column.Index then
      begin
       if SortAZ then SortAZ:=False else SortAZ:=True;
      end;
      SortClick(Column.Index);
    end;procedure TFrmMain.ListView1Compare(Sender: TObject; Item1,
      Item2: TListItem; Data: Integer; var Compare: Integer);
    var
      ix: Integer;
    begin
      if SortAZ then
      begin
        if ColumnToSort = 0 then
          Compare := CompareText(Item1.Caption,Item2.Caption)
        else begin
         ix := ColumnToSort - 1;
         Compare := CompareText(Item1.SubItems[ix],Item2.SubItems[ix]);
        end
      end else
      begin
        if ColumnToSort = 0 then
          Compare := -CompareText(Item1.Caption,Item2.Caption)
        else begin
         ix := ColumnToSort - 1;
         Compare := -CompareText(Item1.SubItems[ix],Item2.SubItems[ix]);
        end
      end;
    end;
    自己好好理解
      

  2.   

    欲实现点击DBGrid的Title对查询结果排序,想作一个通用程序,不是一事一议,
    例如不能在SQL语句中增加Order by ...,因为SQL可能原来已经包含Order by ...,
    而且点击另一个Title时又要另外排序,目的是想作到象资源管理器那样随心所欲。
    procedure TFHkdata.SortQuery(Column:TColumn);
    var
      SqlStr,myFieldName,TempStr: string;
      OrderPos: integer;
      SavedParams: TParams;
    begin
      if not (Column.Field.FieldKind in [fkData,fkLookup]) 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 pos(myFieldName,SqlStr)=0 then exit;
        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;
      

  3.   

    多谢各位,这个问题我刚刚解决了。
    我用的是DevExpress ExpressQuantumGrid Pro v3.2.1 Suite for Delphi6
    中的TdxDBGrid控件,需要把egoLoadAllRecords属性加上,看了帮助才知道的。
    不过,楼上的提供的代码我另外有用。
    请各位接分!