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) |
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 |
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. |
AW: Wie genau sortiert CompareText
Zitat:
AsArray[0]...AsArray[12] Danke |
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