![]() |
Dateiliste sortieren
Ich habe in einer Stringliste links zu Dateipfaden.
C:\Temp1\abc10.txt C:\Temp1\abc1.txt C:\Temp1\abc5.txt C:\Temp10\7.txt C:\Temp10\10.txt C:\Temp10\1.txt Rauskommen soll eine nach Ordnern und Dateien sortierte Liste: C:\Temp1\abc1.txt C:\Temp1\abc5.txt C:\Temp1\abc10.txt C:\Temp10\1.txt C:\Temp10\7.txt C:\Temp10\10.txt Mit der Standard Sort Methode der Stringlist funktioniert das nicht.. |
AW: Dateiliste sortieren
Du kannst auch einfach eine eigene Sortiermethode schreiben und diese der TStringList bekannt machen:
Delphi-Quellcode:
procedure TStringList.CustomSort(Compare: TStringListSortCompare); virtual;
Delphi-Quellcode:
function TForm1.DoSort(List: TStringList; Index1, Index2: Integer): Integer; var s1, s2 : String; begin s1:=List[Index1]; s2:=List[index2]; if s1>s2 then result:=1 else if s2>s1 then result:=-1 else result:=0; end; |
AW: Dateiliste sortieren
Das weiß ich allerdings weiß ich nicht wie ich das CustomSort für diesen Zweck korrekt umsetze
|
AW: Dateiliste sortieren
Du bekommst ja die beiden Indices der String, die vergliechen werden. Dann vergleichst du die nach deinen Kriterien. Du könntest nun z.b. die beiden Strings Stück für Stück vergleichen. Probier das CustomSort doch mal aus und denk nach, wie du die vergleichen willst
|
AW: Dateiliste sortieren
Die Standarsortierung bekomme ich auch hin (so wie Tstringlist.Sort):
Delphi-Quellcode:
Probleme gibt es allerdings wenn ich Dateien nach diesem Muster habe:
function DoSort(List: TStringList; Index1, Index2: Integer): Integer;
var s1, s2 : String; begin s1:=List[Index1]; s2:=List[index2]; //wenn s1 ordner == s2 ordner if ExtractFilePath(s1)=ExtractFilePath(s2) then Result:=AnsiCompareStr(ExtractFileName(s1),ExtractFileName(s2)) else Result:=AnsiCompareStr(ExtractFilePath(s1),ExtractFilePath(s2)) end; aaa01 aaa09 aaa010 => in diesem Fall wird nämlich folgendes ausgegeben: aaa01 aaa010 aaa09 |
AW: Dateiliste sortieren
Wundern tut das ja nicht, so arbeitet auch die interne Sortierung der StringList ;)
Da hilft wohl nur parsen oder einen Mac kaufen (die sortieren so wie du das willst) ;) Hole dir aus den Dateinamen den String/Zahlenteil und den Rest
Code:
Jetzt vergleichen wir den String und Zahlenteil. Sind diese gleich, dann arbeiten wir nur mit dem Reststring weiter.
'aaa010\test1' => 'aaa',10,'\test1'
'aaa01\test2' => 'aaa',1,'\test2' Also brauchen wir folgende Funktion:
Delphi-Quellcode:
procedure( const AStr : string; out OStr : string; out OInt : integer; out RStr : string );
|
AW: Dateiliste sortieren
|
AW: Dateiliste sortieren
Zitat:
Code:
Aber so wolltest du das nicht (oder am Anfang wenigstens nicht)
C:\Temp1\abc1.txt
C:\Temp1\abc10.txt C:\Temp1\abc5.txt C:\Temp10\1.txt C:\Temp10\10.txt C:\Temp10\7.txt |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:29 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