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

xwmevbvl  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(107)

我的问题来自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(),但我有点不安的一般情况下,我是否可以或我不能影响变种dm1x。

2w2cym1i

2w2cym1i1#

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

dcoAnsiSort

如果处于活动状态,则网格控件使用Windows区域设置对记录进行排序。当网格单元格包含本机语言文本时,此选项很有用。
否则,将基于每个字符的8位序数值比较字符串。
文档有点过时-对于宽字符,比较的是16位有序值。(参考:TcxDataControllerOption枚举)

相关问题