Endlich ist sie da, die langersehnte Dateisuche mit Fortschrittsanzeige.
Erstmal der Code (siehe Anhang, inkl. Demo), dann die Erklärungen.
Erstmal zur Prozedur
FindAllFiles: Ich wollte möglichst ohne die
Unit Classes auskommen und habe mich deshalb entschieden die Dateien nicht in eine StringListe zu schreiben, sondern eine Nachricht zu schicken, welche den Dateinamen bzw. den Ordner und den wievielten Ordner enthält.
Die Idee: Will man den Fortschritt anzeigen, muss man irgendwie einen Maximalwert haben. Ich habe mich dafür entschieden die Anzahl der Ordner zu nehmen. Die Anzahl der Ordner wird mit der Prozedur
CountFolders ermittelt und in der globalen Variable
CntFolders gespeichert. In der Prozedur
FindAllFiles wird nun bei jedem gefundenen Ordner die Variavle
NumFolder erhöht, damit man weiß, wie viele Ordner man schon durchsucht hat.
Da ich mit globalen Variablen arbeite, ist es wichtig diese entsprechend zu initialisieren. Dies geschieht mit der Prozedur
FindAllFilesInit. Hier werden die Variablen mit 0 initialisiert. Es ist also erstmal wichtig diese Prozedur aufzurufen und dann mit
CountFolders die Anzahl der Ordner zu ermitteln, wenn man einen Fortschritt haben will. Durchsucht man nicht gerade die ganze Systempartition, ist der Performanceverlust eigentlich noch akzeptabel. Natürlich kann man die Prozedur
FindAllFiles auch nutzen ohne den Fortschritt anzuzeigen, wenn man auf die Performance wertlegt.
Legt man keinen Wert darauf
nonVCL kompatibel zu sein, kann man natürlich alles in eine Klasse packen und elegant mit Eregnissen arbeiten.
Auf die Idee bin ich gekommen, als ich mich gefragt habe, wie TuneupUtilities das macht und ich gesehen habe, wie Tuneup Utilities vor der eigentlichen Suche in einem Label "Initialisieren..." anzeigt. Da habe ich mich gefagt, "was initialisiert der da wohl?" Nun ja, ich habe mir dann überlegt, dass er eigentlich nur einen maximal Wert für den Fortschritt ermitteln kann in dieser Zeit.
Sollte jemand eine bessere Idee haben, dann bin ich für jeden Verbesserungsvorschlag offen.
Im Anhang noch ein Demo Projekt.