Как я могу получить TStringList для сортировки по-разному в Delphi

У меня есть простой TStringList. Я делаю TStringList.Sort на нем.

Затем я замечаю, что подчеркивание "_" сортируется перед заглавной буквой "A". Это было в отличие от стороннего пакета, который сортировал тот же текст и сортировал _ после A.

В соответствии с набором символов ANSI, A-Z - это символы 65 - 90, а _ - 95. Таким образом, похоже, что сторонний пакет использует этот порядок, а TStringList.Sort - нет.

Я углубился в кишки TStringList.Sort, и это сортировка с использованием AnsiCompareStr (с учетом регистра) или AnsiCompareText (без учета регистра). Я попробовал это обоими способами, установив значение CaseSensitive моего StringList в 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;

Ответы на вопрос(3)

Ваш ответ на вопрос