Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Wie genau sortiert CompareText (https://www.delphipraxis.net/207786-wie-genau-sortiert-comparetext.html)

v2afrank 3. Mai 2021 08:23

Delphi-Version: 5

Wie genau sortiert CompareText
 
In einer meiner Anwendung sortiere ich ein Treeview mit Hilfe der Funktion CompareText. Es sind dabei Strings in der Art AsArray[0] ... AsArray[12]
Eigentlich würde ich hoffen das die Variablen auch so sortiert werden, das ist aber nicht so. in Delphi kommt folgendes dabei rum
AsArray[0]
AsArray[10]
AsArray[11]
AsArray[12]
AsArray[1]
AsArray[2]
AsArray[3]
AsArray[4]
AsArray[5]
AsArray[6]
AsArray[7]
AsArray[8]
AsArray[9]

Wenn ich dieses Array in Excel sortiere kommt folgendes dabei rum
AsArray[0]
AsArray[1]
AsArray[10]
AsArray[11]
AsArray[12]
AsArray[2]
AsArray[3]
AsArray[4]
AsArray[5]
AsArray[6]
AsArray[7]
AsArray[8]
AsArray[9]


AsArray[1] ist also vor AsArray[10]. Eigentlich hätte ich das auch in Delphi erwartet. Warum macht Delphi das so ? Ich habe auch einmal ein Natural Sort hier aus dem Forum getestet aber damit keinen Erfolg gehabt. Zumindest bei der Implementierung hat die Sortierung ewig gebraucht (ich habe mehrere 100000 Einträge)

Gausi 3. Mai 2021 08:58

AW: Wie genau sortiert CompareText
 
CompareText ist ja eine Delphi-interne Funktion, Excel wird vermutlich auf die Windows-API zurückgreifen, die in Delphi per AnsiCompareText zu erreichen ist. Dort werden dann ein paar fixe Parameter für den Aufruf von CompareString gesetzt.

Ich hatte vor einiger Zeit auch mal ein ähnliches Sortierproblem. Da hat mir der Hinweis von jaenicke in diesem Beitrag gut weitergeholfen:
https://entwickler-ecke.de/viewtopic.php?t=118089
Ich habe mir dann eine andere Version von AnsiCompareText geschrieben, die andere Flags setzt. Vielleicht hilft das bei dir auch weiter. :-D

himitsu 3. Mai 2021 09:05

AW: Wie genau sortiert CompareText
 
CompareText ist wie CompareStr, bloß dass quasi noch ein AnsiLowerCase integriert ist,
also Str vergleich mit Groß-/Kleinschreibung und Text ignoriert die Groß-/Kleinschreibung (a und A stehen zusammen).

Str/Text ist bei all diesen Funktionen, auch AnsiSameText/Str und Co. (Achtung SameText, ohne Ansi, arbeitet Anders)

Intern wird eine WinAPI verwendet, welche die lokalen Spracheinstellungen des Windows nutzt. (Ä liegt mit bei A, im deutschen Windows)


"NaturalSort" wäre eine andere Möglichkeit (aber es wird auch oftmals anders genannt),
da wird praktisch der Text zerlegt und Teile einzeln ausgewertet.
z.B. Ziffern als "ein" Teil als Zummer ausgewertet, womit es dann als 1 2 ... 8 9 10 11 sortiert würde.

v2afrank 3. Mai 2021 09:28

AW: Wie genau sortiert CompareText
 
Zitat:

Zitat von Gausi (Beitrag 1488463)
CompareText ist ja eine Delphi-interne Funktion, Excel wird vermutlich auf die Windows-API zurückgreifen, die in Delphi per AnsiCompareText zu erreichen ist. Dort werden dann ein paar fixe Parameter für den Aufruf von CompareString gesetzt.

Ich hatte vor einiger Zeit auch mal ein ähnliches Sortierproblem. Da hat mir der Hinweis von jaenicke in diesem Beitrag gut weitergeholfen:
https://entwickler-ecke.de/viewtopic.php?t=118089
Ich habe mir dann eine andere Version von AnsiCompareText geschrieben, die andere Flags setzt. Vielleicht hilft das bei dir auch weiter. :-D

Treffer versenkt. Jetzt funktioniert es so wie man es eigentlich erwartet. Also
AsArray[0]...AsArray[12]
Danke

lxo 3. Mai 2021 10:31

AW: Wie genau sortiert CompareText
 
Ich weiß nicht ab welcher Delphi-Version das drin ist, aber es gibt auch noch Compare-Funktionen im System.SysUtils - TStringHelper

Da kann man auch CompareOptions und LocaleID angeben.

Code:
TCompareOption = (coLingIgnoreCase, coLingIgnoreDiacritic, coIgnoreCase,
                  coIgnoreKanatype, coIgnoreNonSpace, coIgnoreSymbols, coIgnoreWidth,
                  coLingCasing, coDigitAsNumbers, coStringSort);

    class function Compare(const StrA: string; const StrB: string; Options: TCompareOptions; LocaleID: TLocaleID): Integer; overload; static; inline;


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:56 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz