Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi FileListBox sortieren (https://www.delphipraxis.net/49115-filelistbox-sortieren.html)

maximus Caesar 5. Jul 2005 17:52


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

Khabarakh 5. Jul 2005 18:01

Re: FileListBox sortieren
 
Spricht etwas dagegen, den Algorithmus schnell selberzumachen :| ? Spricht etwas dagegen, schnell mal nach "Natürliche Sortierung" zu suchen :roll: ?
http://www.delphipraxis.net/internal...=235558#235558

maximus Caesar 5. Jul 2005 18:03

Re: FileListBox sortieren
 
hab unter den falschen stichworten gesucht... :oops:

Khabarakh 5. Jul 2005 18:04

Re: FileListBox sortieren
 
SortierungSortierung hätte es schon getan :wink: .

maximus Caesar 5. Jul 2005 18:11

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

marabu 5. Jul 2005 18:38

Re: FileListBox sortieren
 
Vielleicht kommst du ja hiermit zurecht:

Delphi-Quellcode:
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;
Grüße vom marabu

maximus Caesar 5. Jul 2005 18:44

Re: FileListBox sortieren
 
Ergebnis sieht so aus:
Test0
test1
test10
test2
.
.
.

Khabarakh 5. Jul 2005 18:54

Re: FileListBox sortieren
 
Zitat:

Zitat von maximus Caesar
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.

Kann der Fall bei dir überhaupt auftreten? Wie sollten die Strings dann sortiert werden?
Zitat:

Zitat von maximus Caesar
Und wie ich den Zweiten auf FileListBox1.Items anwende kapier ich net

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.

marabu 5. Jul 2005 19:02

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