TStringList. Сортировка и системная locale
Автор: Alexander Ilyin
При разработке CGI-программы, отображающей иерархическую структуру в виде
дерева, возникла следующая проблема: под административным логином все работало
правильно, под другим - ветки дерева перемешивались.
Оказалось, дело в текущем locale. Так работает сортированный TStringList,
использованный для хранения структур отображаемых данных. Дело в том, что там
для упорядочивания элементов списка по ключам использована функция
AnsiCompareText (а не AnsiCompareStr, как указано в хелпе). ТИПОВЫЕ
РЕШЕНИЯ.
- В ранних версиях Дельфи это поведение изменить можно, только переписав часть
модуля Classes.
- В 5-й версии Борланд добавил к TStringList метод CustomSort (работающий,
когда Sorted = False), который позволяет решить проблему путем подстановки своей
функции сравнения строк.
- Сделать класс TStrList, в котором для упорядочивания использовать простую
CompareStr.
КОММЕНТАРИЙ
Действительно, в справке Delphi по TStringList указано, что для сортировки используется AnsiCompareStr, и порядок сортировки зависит от текущей локали во время работы программы. Анализ текста Classes.pas показывает, что все операции сравнения строк в списках (при сортировке по-умолчанию, при поиске, а также при IndexOf) производятся при помощи AnsiCompareText. Последняя отличается от AnsiCompareStr тем, что выполняет сравнение без учета регистра символов, и, следовательно, результат иным образом зависит от текущей локали.
|