У меня есть простой TStringList. Я делаю TStringList.Sort на нем.
Затем я замечаю, что подчеркивание "_" сортируется перед заглавной буквой "A". Это было в отличие от стороннего пакета, который сортировал один и тот же текст и сортировал _ после A.
В соответствии с набором символов ANSI, A-Z являются символами 65 - 90 и _ равно 95. Таким образом, похоже, что сторонний пакет использует этот порядок, а TStringList.Sort - нет.
Я просверлился в кишки TStringList.Sort и сортировка с помощью AnsiCompareStr (Case Sensitive) или AnsiCompareText (без учета регистра). Я попробовал это в обоих направлениях, установив для значения StringList CaseSensitive значение true, а затем false. Но в обоих случаях "_" сортируется первым.
Я просто не могу представить, что это ошибка в TStringList. Поэтому здесь должно быть что-то еще, чего я не вижу. Что это может быть?
Мне действительно нужно знать, как я могу получить свой TStringList для сортировки, чтобы он был в том же порядке, что и другой пакет.
Для справки, я использую Delphi 2009, и я использую строки Unicode в своей программе.
Итак, окончательный ответ здесь - переопределить Ansi, сравнивая с тем, что вы хотите (например, не ansi):
type
TMyStringList = class(TStringList)
protected
function CompareStrings(const S1, S2: string): Integer; override;
end;
function TMyStringList.CompareStrings(const S1, S2: string): Integer;
begin
if CaseSensitive then
Result := CompareStr(S1, S2)
else
Result := CompareText(S1, S2);
end;