6

我想反转 TClientDataSet 中索引的顺序,下面的代码看起来应该可以解决问题,但什么也没做。有没有一种很好的方法来反转索引的顺序?

procedure TForm8.Button1Click(Sender: TObject);
var
  index: TIndexDef;
begin
  index := ClientDataSet1.IndexDefs.Find('LengthIndex');
  if ixDescending in index.Options then
    index.Options := index.Options - [ixDescending]
  else
    index.Options := index.Options + [ixDescending];
end;
4

2 回答 2

9

TIndexDef.Options在创建索引时使用。它们不能用于尝试和影响现有索引。请参阅文档强调我的):

创建新索引时,使用 Options 指定索引的属性。选项可以包含零个或多个 TIndexOption 常量 ixPrimary、ixUnique、ixDescending、ixCaseInsensitive 和 ixExpression。

检查现有索引的定义时,请阅读选项以确定用于创建索引的选项。

您需要使用ixDescending值集创建一个单独的索引。IndexName然后,您只需更改属性即可来回切换。

于 2012-10-29T22:52:39.847 回答
1

这是我最终确定的双向排序方法。基本上它只是创建和释放索引,不是很漂亮但可以工作。使用TFDMemTable更容易做到(如果您可以访问 FireDAC)

type
  TSortByFieldOption = (ForceAscending, ForceDescending);
  TSortByFieldOptions = set of TSortByFieldOption;

procedure SortClientDataSetByField(cds : TClientDataSet; FieldName : String; Options : TSortByFieldOptions = []);
const
  IndexName = 'GridSort';
var
  i: integer;
  index: TIndexDef;
  OldOrder: string;
  IndexOptions : TIndexOptions;
begin
  cds.DisableControls;
  try
    i := cds.IndexDefs.IndexOf(IndexName);
    if i <> - 1  then
    begin
      index := cds.IndexDefs.Find(IndexName);
      OldOrder := index.Fields;
      try
        cds.DeleteIndex(IndexName);
      except;
        OutputDebugString('no index?');
        //there seem to be conditions where the index does not exist but
      end;
      index.Free; //delete index for some reason does not free the index
      indexOptions := index.Options;
    end else
      IndexOptions := [ixDescending];

    index := cds.IndexDefs.AddIndexDef;
    index.Name := IndexName;
    index.Fields := FieldName;
    if ForceAscending in Options then
      index.Options := []
    else if ForceDescending in Options then
      index.Options := [ixDescending]
    else if OldOrder = FieldName  then
    begin
      if (IndexOptions = [ixDescending]) then
        index.Options := []
      else
        index.Options := [ixDescending];
    end;
    cds.IndexName := IndexName;
  finally
    cds.EnableControls;
  end;
end;
于 2017-06-26T19:39:47.410 回答