cxGrid Unicode 排序
cxGrid Unicode sorting
如何让 cxGrid 进行排序
Latin-2 (ISO-8859-2) 编码 ?
我不希望网格依赖于 Windows 的区域设置。
问题是我在斯洛文尼亚,但我需要用克罗地亚语进行分类。
(现在 Ć,Č,Š 排序不正确)
可以做到吗?
您可以挂钩由 DBTableView 的 DataController 为 cxGrid 公开的 OnCompare-event 并实现类似这样的处理程序:
procedure TMyForm.cxGrid1DBTableView1DataControllerCompare(
ADataController: TcxCustomDataController;
ARecordIndex1, ARecordIndex2, AItemIndex: Integer;
const V1, V2: Variant;
var Compare: Integer );
var
S1, S2 : String;
CompareResult: Integer;
begin
S1 := V1;
S2 := V2;
CompareResult := CompareStringW( LANG_CROATIAN, 0, pWideChar( S1 ), -1,
pWideChar( S2 ), -1 );
case CompareResult of
CSTR_LESS_THAN : Compare := -1;
CSTR_EQUAL : Compare := 0;
CSTR_GREATER_THAN : Compare := 1;
end;
end;
如果 S1 = 'Ć,Č,Š' 且 S2 = 'Ç,Ć,Š' 那么 S1 > S2,我认为这是预期的。如果切换到 LOCALE_NEUTRAL,则会得到相反的结果。
将 V1 和 V2 转换为字符串时应小心,因为并非所有列都可以按所需方式进行转换。日期 - 例如 - 可能需要特殊处理。
另请注意,如果函数失败,CompareStringW return 0。完整的实施可能必须解决这个问题。
如何让 cxGrid 进行排序 Latin-2 (ISO-8859-2) 编码 ?
我不希望网格依赖于 Windows 的区域设置。 问题是我在斯洛文尼亚,但我需要用克罗地亚语进行分类。 (现在 Ć,Č,Š 排序不正确)
可以做到吗?
您可以挂钩由 DBTableView 的 DataController 为 cxGrid 公开的 OnCompare-event 并实现类似这样的处理程序:
procedure TMyForm.cxGrid1DBTableView1DataControllerCompare(
ADataController: TcxCustomDataController;
ARecordIndex1, ARecordIndex2, AItemIndex: Integer;
const V1, V2: Variant;
var Compare: Integer );
var
S1, S2 : String;
CompareResult: Integer;
begin
S1 := V1;
S2 := V2;
CompareResult := CompareStringW( LANG_CROATIAN, 0, pWideChar( S1 ), -1,
pWideChar( S2 ), -1 );
case CompareResult of
CSTR_LESS_THAN : Compare := -1;
CSTR_EQUAL : Compare := 0;
CSTR_GREATER_THAN : Compare := 1;
end;
end;
如果 S1 = 'Ć,Č,Š' 且 S2 = 'Ç,Ć,Š' 那么 S1 > S2,我认为这是预期的。如果切换到 LOCALE_NEUTRAL,则会得到相反的结果。
将 V1 和 V2 转换为字符串时应小心,因为并非所有列都可以按所需方式进行转换。日期 - 例如 - 可能需要特殊处理。
另请注意,如果函数失败,CompareStringW return 0。完整的实施可能必须解决这个问题。