My problem arises from DevExpress TcxGrid default comparison (used for the sorting of data), which boils down to the code (implemented in 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;
My tests assure that V1 < V2 works as CompareStr(V1, V2, loInvariantLocale), but usually one would like that V1 < V2 should work as CompareStr(V1, V2, loUserLocale).
And this is also reflected in the sorting results of cxGrid: usually Eastern European languages expect that diacritical characters follow immediately their original characters, but loInvariantLocal puts all the diacritical characters at the end of all non-diacritical characters. One expects orders aā .. zž, but cxGrid sorts like a .. z, ā .. ž.
So: is it possible to ask some code fragment to use loUserLocale for variant comparison?
Of course, I will just override cxGrid.cxGridDBTableView.Controller.OnCompare(), but I am a bit uneasy about the general situation whether I can or I can not affect variant comprison.
The default is to compare the ordinal values of the characters. To compare based on the locale enable the DataController's option dcoAnsiSort (
cxGrid1DBTableView1.DataController.Options.dcoAnsiSort).The docs are a bit dated - for wide characters the 16-bit ordinal values are compared. (Ref:TcxDataControllerOption Enum)