我的问题源于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()
,但我对一般情况有点不安,我是否可以或不能影响变体压缩。
默认是比较字符的序数值。要根据区域设置进行比较,请启用 DataController 的选项 dcoAnsiSort (
cxGrid1DBTableView1.DataController.Options.dcoAnsiSort
)。
dcoAnsiSort
如果处于活动状态,网格控件将使用 Windows 区域设置进行排序 记录。当网格单元包含母语时,此选项很有用 文字。
否则,将根据每个字符的 8 位序数值来比较字符串。
文档有点过时 - 对于宽字符,比较 16 位序数值。 (参考:TcxDataControllerOption 枚举)