Wie kann ich TStringList dazu bringen, in Delphi anders zu sortieren?

Ich habe eine einfache TStringList. Ich mache eine TStringList.Sort darauf.

Dann bemerke ich, dass der Unterstrich "_" vor dem Großbuchstaben "A" steht. Dies stand im Gegensatz zu einem Drittanbieterpaket, das denselben Text sortierte und _ nach A sortierte.

Entsprechend dem ANSI-Zeichensatz sind A-Z die Zeichen 65 - 90 und _ ist 95. Es sieht also so aus, als ob das Drittanbieterpaket diese Reihenfolge verwendet und TStringList.Sort nicht.

Ich habe mich in die Eingeweide von TStringList.Sort vertieft und es wird mit AnsiCompareStr (case sensitive) oder AnsiCompareText (case insensitive) sortiert. Ich habe es in beide Richtungen versucht, indem ich den CaseSensitive-Wert meiner StringList auf true und dann auf false gesetzt habe. In beiden Fällen wird das "_" zuerst sortiert.

Ich kann mir nicht vorstellen, dass dies ein Fehler in TStringList ist. Es muss also noch etwas geben, das ich nicht sehe. Was könnte das sein?

Was ich wirklich wissen muss, ist, wie ich meine TStringList sortieren lassen kann, damit sie in der gleichen Reihenfolge wie das andere Paket ist.

Als Referenz verwende ich Delphi 2009 und verwende Unicode-Zeichenfolgen in meinem Programm.

Die abschließende Antwort hier ist, die Ansi-Vergleiche mit den gewünschten Werten zu überschreiben (z. B. Nicht-Ansi-Vergleiche), und zwar wie folgt:

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;

Antworten auf die Frage(3)

Ihre Antwort auf die Frage