cxGrid Unicode сортировка
Как получить cxGrid для сортировки преформ в кодировке Latin-2 (ISO-8859-2)?
Я не хочу, чтобы сетка зависела от региональных настроек Windows. Проблема в том, что я нахожусь в Словении, но мне нужна сортировка на хорватском языке. (Сейчас now,Č,Š не отсортированы должным образом)
Это можно сделать?
1 ответ
Вы можете перехватить событие OnCompare, предоставляемое DataController из DBTableView для cxGrid, и реализовать обработчик примерно так:
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 возвращает 0 в случае сбоя функции. Полная реализация, возможно, придется иметь дело с этим.