Delphi 字符串变量比较是否使用 loInvariantLocale?如何在本地启用 loUserLocale?

问题描述 投票:0回答:1

我的问题源于DevExpress TcxGrid默认比较(用于数据排序),归结为代码(在

cxVariants.pas
中实现):

  if VarIsEmpty(V1) then
    if VarIsEmpty(V2) then
      Result := 0
    else
      Result := -1
  else
    if VarIsEmpty(V2) then
      Result := 1
    else
      if V1 = V2 then
        Result := 0
      else
        if V1 < V2 then
          Result := -1
        else
          Result := 1;

我的测试确保

V1 < V2
可以用作
CompareStr(V1, V2, loInvariantLocale)
,但通常人们会希望
V1 < V2
应该用作
CompareStr(V1, V2, loUserLocale)

这也反映在 cxGrid 的排序结果中:通常东欧语言期望变音字符紧跟在其原始字符之后,但

loInvariantLocal
将所有变音字符放在所有非变音字符的末尾。人们期望订单
aā .. zž
,但 cxGrid 的排序类似于
a .. z, ā .. ž

所以:是否可以要求某些代码片段使用

loUserLocale
进行变体比较?

当然,我会覆盖

cxGrid.cxGridDBTableView.Controller.OnCompare()
,但我对一般情况有点不安,我是否可以或不能影响变体压缩。

sorting delphi comparator variant tcxgrid
1个回答
0
投票

默认是比较字符的序数值。要根据区域设置进行比较,请启用 DataController 的选项 dcoAnsiSort (

cxGrid1DBTableView1.DataController.Options.dcoAnsiSort
)。

dcoAnsiSort

如果处于活动状态,网格控件将使用 Windows 区域设置进行排序 记录。当网格单元包含母语时,此选项很有用 文字。

否则,将根据每个字符的 8 位序数值来比较字符串。

文档有点过时 - 对于宽字符,比较 16 位序数值。 (参考:TcxDataControllerOption 枚举

© www.soinside.com 2019 - 2024. All rights reserved.