我的问题来自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。
1条答案
按热度按时间2w2cym1i1#
默认值是比较字符的序号值。要根据区域设置进行比较,请启用DataController的选项dcoAnsiSort(
cxGrid1DBTableView1.DataController.Options.dcoAnsiSort
)。dcoAnsiSort
如果处于活动状态,则网格控件使用Windows区域设置对记录进行排序。当网格单元格包含本机语言文本时,此选项很有用。
否则,将基于每个字符的8位序数值比较字符串。
文档有点过时-对于宽字符,比较的是16位有序值。(参考:TcxDataControllerOption枚举)