cxGrid Unicode排序

时间:2017-02-02 15:10:49

标签: delphi devexpress tcxgrid

如何让cxGrid进行预先排序? Latin-2(ISO-8859-2)编码?

我不希望网格依赖于Windows的区域设置。 问题是我在斯洛文尼亚,但我需要用克罗地亚语进行排序。 (现在Ć,Č,Š没有正确分类)

可以吗?

1 个答案:

答案 0 :(得分:2)

您可以挂钩由DBTableView的DataController为cxGrid公开的OnCompare事件,并实现类似这样的处理程序:

procedure TMyForm.cxGrid1DBTableView1DataControllerCompare( 
                ADataController: TcxCustomDataController;
                ARecordIndex1, ARecordIndex2, AItemIndex: Integer;
                const V1, V2: Variant;
                var Compare: Integer );
var
  S1, S2       : String;
  CompareResult: Integer;

begin
  S1 := V1;
  S2 := V2;
  CompareResult := CompareStringW( LANG_CROATIAN, 0, pWideChar( S1 ), -1,
                                                     pWideChar( S2 ), -1 );
  case CompareResult of
    CSTR_LESS_THAN    : Compare := -1;
    CSTR_EQUAL        : Compare := 0;
    CSTR_GREATER_THAN : Compare := 1;
  end;
end;

如果S1 ='Ć,Č,Š'且S2 ='Č,Ć,Š',则S1> S2,我认为是预期的。如果切换到LOCALE_NEUTRAL,则会得到相反的结果。

在将V1和V2转换为字符串时应小心,因为并非所有列都可以以所需方式进行转换。日期 - 例如 - 可能需要特殊处理。

另请注意,如果函数失败,CompareStringW将返回0。完整的实施可能必须处理这个问题。