![]() |
FileListBox sortieren
Hallo!
Ich brauche einen Algorythmus, mit dem ich den Inhalt einer FileListBox sortieren kaann (wenn es bei einer FileListBox nicht geht, dann brauche ich den Algorythmus für ein Memo). Es soll auf natürliche Art sortiert werden. Beispiel: Einträge: test2 test10 test1 Normale sortierung: test1 test10 test2 natürliche sortierung: test1 test2 test10 Kann mir jemand helfen? Wenn es geht bitte ein fertiger Algorythmus |
Re: FileListBox sortieren
Spricht etwas dagegen, den Algorithmus schnell selberzumachen :| ? Spricht etwas dagegen, schnell mal nach "Natürliche Sortierung" zu suchen :roll: ?
![]() |
Re: FileListBox sortieren
hab unter den falschen stichworten gesucht... :oops:
|
Re: FileListBox sortieren
![]() |
Re: FileListBox sortieren
Wie kann ich das den jetzt anwenden?
Bei dem ersten Algorithmus heißt es ja, dass er net richtig funktioniert, wenn keine Ziffern da sind. Und wie ich den Zweiten auf FileListBox1.Items anwende kapier ich net |
Re: FileListBox sortieren
Vielleicht kommst du ja hiermit zurecht:
Delphi-Quellcode:
Grüße vom marabu
type
THackedFileListBox = class(TFileListBox); function PrefixLength(s: string): integer; begin Result := Length(s); while (Result > 0) and (s[Result] in ['0'..'9']) do Dec(Result); end; function NaturalSortCompare(list: TStringList; index1, index2: integer): integer; var prefix1, prefix2, suffix1, suffix2: string; n1, n2: integer; begin suffix1 := AnsiUppercase(list[index1]); prefix1 := Copy(suffix1, 1, PrefixLength(suffix1)); Delete(suffix1, 1, Length(prefix1)); if not TryStrToInt(suffix1, n1) then n1 := -1; suffix2 := AnsiUppercase(list[index2]); prefix2 := Copy(suffix2, 1, PrefixLength(suffix2)); Delete(suffix2, 1, Length(prefix2)); if not TryStrToInt(suffix2, n2) then n2 := -1; if prefix1 < prefix2 then Result := -1 else if prefix1 > prefix2 then Result := 1 else if n1 < n2 then Result := -1 else if n1 > n2 then Result := 1 else Result := 0; end; procedure TDemoForm.ButtonClick(Sender: TObject); var sl: TStringList; begin sl := TStringList.Create; sl.Assign(FileListBox.Items); sl.CustomSort(NaturalSortCompare); THackedFileListBox(FileListBox).Sorted := false; // das hilft... FileListBox.Items.Assign(sl); sl.Free; end; |
Re: FileListBox sortieren
Ergebnis sieht so aus:
Test0 test1 test10 test2 . . . |
Re: FileListBox sortieren
Zitat:
Zitat:
MSDN The string pointed to by the lpString1 parameter is less in lexical value than the string pointed to by the lpString2 parameter.The string pointed to by lpString1 is equivalent in lexical value to the string pointed to by lpString2. The two strings are equivalent for collating purposes, though not necessarily identical.The string pointed to by lpString1 is greater in lexical value than the string pointed to by lpString2. Wenn also das Ergebnis von NatCompareText kleiner 0 ist, ist der Inhalt von S1 kleiner, bei Result = 0 sind beide gleich groß und wenn Result größer 0 ist, ist S2 größer. Das Ganze musst du nun noch in einen Quicksort o.Ä. einbauen. |
Re: FileListBox sortieren
Sorry, meinen Code hatte ich nur syntaktisch geprüft. Habe noch eine kleine Änderung angebracht und nun geht das.
marabu |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:46 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz