![]() |
Files suchen und sortieren
Ich ermittle einige PDF-Dateien und sortiere die nach dem Erstellungsdatum.
Das funktioniert, ich bin aber nicht sicher, ob ich die einfachste Lösung habe. Würde es jemand anders machen? Muss nicht mit Generics sein. Würde eine anonyme Methode etwas vereinfachen?
Delphi-Quellcode:
type
TsrComparer = class(TComparer<TSearchRec>) function Compare(const sr1, sr2: TSearchRec): Integer; override; end; implementation { TMeleePairComparer } function TsrComparer.Compare(const sr1, sr2: TSearchRec): Integer; begin Result := 0; if Result = 0 then Result := -CompareValue(sr1.TimeStamp, sr2.TimeStamp); if Result = 0 then Result := CompareStr(sr1.Name, sr2.Name); end; ... procedure TFormOlympic.TabSheetReportShow(Sender: TObject); procedure GetFiles; var sr: TSearchRec; srList: TList<TSearchRec>; F: Boolean; // ergänzt begin srList := TList<TSearchRec>.Create(TsrComparer.Create); if PathReport <> '' then begin F := FindFirst(PathReport + '*.pdf', (faAnyFile and not faDirectory), sr); while F = 0 do begin if ExtractFileExt(sr.Name) = '.pdf' then srList.Add(sr); F := FindNext(sr); end; FindClose(sr); end; srList.Sort; ListBoxReport.Clear; for sr in srList do ListBoxReport.Items.Add(sr.Name); FreeAndNil(srList); end; begin GetFiles; ListBoxReport.ItemIndex := 0; ListBoxReportClick(Sender); end; PS: Auf ein TsShellListView (AlphaControls) hatte ich verzichtet, da ein umsortieren dort nicht möglich war. |
AW: Files suchen und sortieren
Könnte man auch so machen:
Delphi-Quellcode:
lst:=TList<TSearchRec>.create; lst.Sort(TComparer<TSearchRec>.Construct(function (const sr1,sr2 : TSearchRec):integer begin Result := 0; if Result = 0 then Result := -CompareValue(sr1.TimeStamp, sr2.TimeStamp); if Result = 0 then Result := CompareStr(sr1.Name, sr2.Name); end)); |
AW: Files suchen und sortieren
Resourcenscchutz?
FreeAndNil ist, bei Variablen, welche eh nicht geprüft werden und nur lokal genutzt werden, etwas übertrieben. Wieso ist das lokale
Delphi-Quellcode:
global deklariert, bzw. wo wurde es eigentlich deklariert?
F
Und jupp, an die anonymen Methoden gewöhne ich mich auch so langsam, aber ob es hier wirklich sinnvoll/nötig ist, ist eine andere Frage :D (aber oftmals machen sie den Code schon lesbarer, da der Code dann zwar nicht wiederverwendbar ist, aber wenigenstens, bei linearen Funktionen, im Kontext des aufrufenden Codes bleibt und man nicht erst suchen/umblättern muß ... z.B. bei Synchronize-Aufrufen ist das eine geile Angelegenheite und auch kleinere Thread-Prozeduren erstelle ich heutzutage anonym :angle: ) Da man FindClose eh nur aufrufen muß, wenn FindFirst erfolgreich war, ist die Repeat-Schleife (aus dem OH-Beispiel) keine schlechte Idee. Zitat:
Delphi-Quellcode:
PS: Leider hat man in TDirectory.GetFiles (Unit IOUtils) die Sortierung vergessen, aber sonst könnte man diese neue Unit sich schonmal ansehn, auch wenn ich persönlich diese Unit für total Mißlungen halte.
procedure GetFiles;
var sr: TSearchRec; srList: TList<TSearchRec>; begin srList := TList<TSearchRec>.Create(function(const sr1, sr2: TSearchRec): Integer begin Result := 0; if Result = 0 then Result := -CompareValue(sr1.TimeStamp, sr2.TimeStamp); if Result = 0 then Result := CompareStr(sr1.Name, sr2.Name); end)); try if (PathReport <> '') and (FindFirst(PathReport + '*.pdf', (faAnyFile and not faDirectory), sr) = 0) then begin repeat //if SameText(ExtractFileExt(sr.Name), '.pdf') then if EndsText('.pdf', sr.Name) then //Unit StrUtils srList.Add(sr); until FindNext(sr) <> 0; FindClose(sr); end; srList.Sort; ListBoxReport.Clear; for sr in srList do ListBoxReport.Items.Add(sr.Name); finally srList.Free; end; end; Aber zumindestens die Methoden, um über nur einen Befehl auf bestimmte Dateieigenschaften zuzugreifen, ist manchmal recht praktisch. |
AW: Files suchen und sortieren
Ich würde da noch Refacoring ansetzen:
Delphi-Quellcode:
Übersichtlich, einfach zu lesen.
Function FileList (aPath : String) : TSearchRecList;
Begin Result := TSearchRecList.Create; Try ReadDirectory (aPath, Result); SortListByCreationData(Result); Except Result.Free; Result := Nil; Raise; End; End; So praktisch Generics auch sind, so 'häßlich' finde ich sie. Ich kapsele lieber bzw. lasse sie nur in den untersten Ebenen ihr wahres Gesicht zeigen. Denn vielleicht ist eine 'TList<TSearchRec>' ja irgendwann nicht mehr das Gelbe vom Ei. |
AW: Files suchen und sortieren
Zitat:
Zitat:
Zitat:
Zitat:
Wobei ich mir noch nicht sicher bin, was nun wirklich übersichtlicher ist. Für meinen vorliegenden Anwendungszweck bleibe ich wohl besser bei meiner Lösung. Ich finde das dann doch etwas strukturierter. Außerdem kann man so in übersichtlicher Weise ggf. verschiedene Comparer für verschiedene Zwecke zuweisen. Zitat:
Danke. EDIT: @FredFesl Da schließe ich mich mal nicht an. Die Lösung mit den Generics ist schon ganz nett. |
AW: Files suchen und sortieren
Delphi-Quellcode:
Ist das nicht pfui bah wegen möglicher Speicherleks?
Function FileList (aPath : String) : TSearchRecList;
Begin Result := TSearchRecList.Create; Try ReadDirectory (aPath, Result); SortListByCreationData(Result); Except Result.Free; Result := Nil; Raise; End; End; Gruß K-H |
AW: Files suchen und sortieren
Ich meine auch,
Delphi-Quellcode:
wäre besser, Beispiele hatten wir doch letztens erst.
procedure FileList(aPath : String; DestList: TSearchRecList);
|
AW: Files suchen und sortieren
Klar, geht auch. Hier ging es je eher um das Refactoring.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:05 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 by Thomas Breitkreuz