Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   TStringList Dateinamen sortierten, geht das besser? (https://www.delphipraxis.net/211231-tstringlist-dateinamen-sortierten-geht-das-besser.html)

DieDolly 18. Aug 2022 18:14

TStringList Dateinamen sortierten, geht das besser?
 
Ich habe eine StringList und lese mit FindFirst/FindNext Dateien nicht-rekursiv eines Verzeichnisses aus.
Die Dateinamen in der Liste sind anders als die im Windows-Explorer nicht sortiert. Sorted und Sort der StringList bringt nix.

Dateinamen 1 bis 15 ergibt mit Sorted und Sort dann sowas wie 1, 10, 11..15, 2, 3 usw.

Meine Idee jetzt
Delphi-Quellcode:

function StrCmpLogicalW(const psz1, psz2: PWideChar): Integer; stdcall; external 'Shlwapi.dll';

var
 FormMain: TFormMain;

implementation

function CustomSort(List: TStringList; Index1, Index2: Integer): Integer;
begin
 Result := StrCmpLogicalW(PChar(List[Index1]), PChar(List[Index2]));
end;

procedure TForm1.Button2Click(Sender: TObject);
var
 sl: TStringList;
begin
 sl := TStringList.Create;
 try
  GetFilesInDirectory('TEST\', '*.*', sl, False);
  sl.CustomSort(CustomSort);
  showmessage(sl.Text);
 finally
  sl.Free;
 end;
end;
Geht sowas ohne viel Aufwand schöner?

juergen 18. Aug 2022 18:32

AW: TStringList Dateinamen sortierten, geht das besser?
 
Sorry, falsche Antwort… —-gelöscht—-

himitsu 18. Aug 2022 18:38

AW: TStringList Dateinamen sortierten, geht das besser?
 
Hier im Forum suchennatural sort, Hier im Forum suchennaturalsort usw.
https://www.faqcode4u.com/faq/265084...ndows-explorer
https://www.delphipraxis.net/201913-...ml#post1445547
https://www.delphipraxis.net/29910-n...n-strings.html

achja, Winapi.ShLwApi und TDirectory.GetFiles aus System.IOUtils

DieDolly 18. Aug 2022 18:51

AW: TStringList Dateinamen sortierten, geht das besser?
 
Ich habe das jetzt mal so übernommen, aber sind die Sort-Parameter coStringSort und coDigitAsNumbers richtig?
Delphi-Quellcode:
function NaturalCompareText(List: TStringList; Index1, Index2: Integer): Integer;
begin
 Result := string.Compare(List[Index1], List[Index2], [coStringSort, coDigitAsNumbers]);
end;

Uwe Raabe 18. Aug 2022 18:59

AW: TStringList Dateinamen sortierten, geht das besser?
 
Zitat:

Zitat von DieDolly (Beitrag 1510278)
Geht sowas ohne viel Aufwand schöner?

Eine abgeleitete Stringliste mit eigener CompareStrings Funktion. Dann geht auch einfach
Delphi-Quellcode:
Sort
bzw.
Delphi-Quellcode:
Sorted := True
.
Delphi-Quellcode:
type
  TFileNameList = class(TStringList)
  protected
    function CompareStrings(const S1: string; const S2: string): Integer; override;
  end;

function TFileNameList.CompareStrings(const S1, S2: string): Integer;
begin
  Result := string.Compare(S1, S2, [coDigitAsNumbers]); // bei Bedarf noch weitere Optionen
end;

DieDolly 18. Aug 2022 19:04

AW: TStringList Dateinamen sortierten, geht das besser?
 
Ich habe mich total verguckt ich hätte nach Datum sortieren sollen nicht nach Name. Hat sich erledigt sorry.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:49 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