Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - FileListBox-Verhalten bei Mask-Änderung


hRb - Mo 10.12.18 18:28
Titel: FileListBox-Verhalten bei Mask-Änderung
Hallo Freunde,
hänge an einem neuen Problem. Ich möchte Dateien in einer Stringgridliste und als Listview anzeigen und dabei nach Dateiendungen selektieren. Für einen einzigen Ordner ist alles gelöst.
Nun will ich die Programmfunktion auf mehrere Ordner erweitern.
Mein Lösungsansatz war wie folgt:
1. Ich wähle per FileOpenDialog einen Ordner aus und erhalte in einer FileListBox2 die Dateinamen des Verzeichnises.
2. Diese Dateinamen kopiere ich inklusive dem kompletten Pfad in eine zentrale FileListBox1

Delphi-Quelltext
1:
2:
   for j:=0 to FileListbox2.Items.Count-1 do    // Pfad + Dateien in Box1 hinzufügen
     FileListbox1.Items.Add(vAktuPfad + '\' + FileListbox2.Items.Strings[j]);
3. Den Pfadname vom aktuell gewählten Ordner (vAktuPfad) merke ich mir in einer ListBox
4. Aus der FileListBox1 heraus bereite ich die StringGridliste und die Listview auf.
5. Diesen Vorgang wiederhole ich für alle gewünschten Ordner.

Meine FileListbox1 ist also der "Sammelbehälter" und enthält in den einzelnen Strings nicht nur den Dateinamen, sondern den komplett langen Pfad+Dateinamen. So weit so gut - funktioniert.
Nun mein Problem:
Selektiere ich über Parameter FileListBox1.Mask meine Dateien, dann werden die "unerwünschten" Dateien nicht nur ausgeblendet, sondern FileListBox1 wird automatisch komplett neu gefüllt. Da jedoch FileListBox1.Drive und FileListBox1.Directory nicht vorbesetzt werden können (mehrere unterschiedliche Pfade), ist mein "Sammelbehälter" weg und ich erhalte nur noch die Dateien aus meinem Programmpfad. Ich hoffe das Problem verständlich erläutert zu haben.

Welche Lösungsmöglichkeiten gibt es hier? Ich habe eine zweite FileListBox (1) gewählt, um per Mask-Befehl einfach zu selektieren - was bei einer normalen ListBox nicht der Fall ist. Hatte allerdings nicht damit gerechnet, dass bei Mask-Änderung der gesamte Ordner neu eingelesen wird (Denkfehler).
Eine Möglichkeit wäre nach einer Mask-Änderung in einer Schleife über alle gemerkten Ordner (siehe Pkt.3 ListBox) alle Ordner und Dateien neu einlesen (scheint mir jedoch aufwändig, da dahinter noch einiges mehr abläuft). Wie bearbeitet man mehrere Ordner?
Guter Rat ist willkommen.
hRb


Delete - Mo 10.12.18 19:54

- Nachträglich durch die Entwickler-Ecke gelöscht -


hRb - Mi 12.12.18 01:03

Hallo Frühlingsrolle,
Genannte Funktionen kenne ich alle, nutze auch viele davon im Programm, hilft aber nicht zur einfachen DateiSelection, z.B. aller Grafikdatei-Typen - es sei denn ich schreibe eine eigene Mask-Routine. Und selbst wenn, welches Objekt sollte Deiner Meinung nach der Container für alle Dateien sein? Letztlich muss auch dieses bei *.* wieder mit den Dateien aller Verzeichnisse gefüllt werden. Nachdem mein Programm für ein einziges Verzeichnis fertig programmiert ist und funktioniert, scheint mir eine Schleife (wie angedeutet) schneller realisiert. Geht eben bei vielen Dateien nur auf die Laufzeit. Fragt da heut noch jemand danach?
hRb


Narses - Mi 12.12.18 01:49

Moin!

Du hast bereits festgestellt, dass die von dir missbrauchten visuellen Komponenten für den gewünschten Zweck mindestens ungeeignet, wenn nicht gar völlig falsch sind. Andererseits hast du dich aber auch bereits entschieden, den angefragten und erhaltenen, guten Rat nicht anzunehmen. Also worüber diskutieren wir hier eigentlich?! :nixweiss:

cu
Narses


jasocul - Mi 12.12.18 08:46

Wie Narses schon schrieb und du auch festgestellt hast, ist dein Ansatz mit den Komponenten "ungünstig". Du musst offensichtlich einen Teil deiner Anforderungen selbst im Programm verwalten.

Leider steht in deinem Profil nicht, welche Delphi-Version du hast.

Es gibt schon seit ein paar Jahren die Klasse TDirectory mit der Klassen-Methode GetFiles.
Mit dieser kannst du auch rekursiv und mit Filter-Maske die Verzeichnisse durchsuchen lassen.

Weitere Klassen, die für dich in diesem Zusammenhang interessant sein könnten, sind TFile und TPath.


hRb - Mi 12.12.18 18:24

Tut mir Leid, wenn ich mit meinem Einwand den "heiligen Zorn" der Experten erregt habe.
Hätte ja sein können, dass es an der FileListbox ein unbekanntes "Schräubchen" gibt, das die automatische Aktualisierung zeitweise unterbindet. Bei soviel fachlichem Gegenwind werde ich wohl meinen Ansatz neu überdenken. Danke jedenfalls für alle bisherige und hoffentlich auch künftige Hilfe.
PS: arbeite mit Delphi Berlin 10.2
hRb


jasocul - Do 13.12.18 08:58

user profile iconhRb hat folgendes geschrieben Zum zitierten Posting springen:
Tut mir Leid, wenn ich mit meinem Einwand den "heiligen Zorn" der Experten erregt habe.

Ich denke, weder Narses noch ich wollten, dass das so bei dir ankommt.
An sich ist es ja auch richtig, dass du erstmal bei deinem eingeschlagenen Weg nach einer Lösung suchst. Es klappt nur leider so nicht. Und mehr sollte unsere "Kritik" auch nicht aussagen.