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 в случае сбоя функции. Полная реализация, возможно, придется иметь дело с этим.

Другие вопросы по тегам