Entwickler-Ecke

Dateizugriff - "Ordner Suchen"-Dialog


tommie-lie - Mi 04.09.02 18:16
Titel: "Ordner Suchen"-Dialog
Hallo,

Es gibt bei einigen Programmen einen Dialog, der sich "Verzeichnis Suchen" nennt.
Er enthält eine Baumstruktur, die sämtliche Ordner enthält. Quasi nur das rechte Fenster vom Win95-Explorer (auch Win98 und folgende, aber ohne Hintergrundbild). Man kann dort einen Ordner auswählen und sämtliche Dateien und die der Unterverzeichnisse werden zurückgegeben. Mit dem OpenFile-Dialog von Delphi6 (PE) kann man aber nur die Dateien auswählen, aber keine Ordner.
Wie kann ich so einen Dialog, bei dem mn nur den Ordner angeben muss, auch in Delphi realisieren?

Tschüß
Thomas


DeCodeGuru - Mi 04.09.02 18:30

hi tommie-lie,

ab delphi 6 gibt es dir Komponente TShellTreeView, welche eine Baumstruktur darstellt. Das dürfte eigentlich sein, was du suchtest. Achja, die Kompo findest du unter Beispiele.


bis11 - Mi 04.09.02 18:38

Hi,

vielleicht meinst Du ja sowas:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
uses Filectrl;  
{....} 
procedure TForm1.Button1Click(Sender: TObject);  
var  
  Dir: String;  
begin  
  SelectDirectory('Select a directory', '', Dir);  
  ShowMessage(Dir);  
end;


Moderiert von user profile iconTino: Inhalt von SwissDelphiCenter eingefügt.


tommie-lie - Mi 04.09.02 19:26

Jungs, ich muss euch was beichten:
Ich hab' die englische Version.

Aber unter Samples findet sich in der 6er PE nur ein TDirectoryOutline, was allerdings gar nicht nach dem aussieht, was ich suche, auch wenn es vielleicht die richtige Funktion erfüllt. Das Ding sieht aus, als wäre es noch von Windows3.11 übriggeblieben, und ich habe keine Einstellmöglichkeit für den Style gefunden.

Aber das, was bis11 verlinkt hat, ist genau das, was ich brauche.

THX
Thomas


DeCodeGuru - Mi 04.09.02 19:33

Zitat:
Aber das, was bis11 verlinkt hat, ist genau das, was ich brauche.


Ist auch kürzer :mrgreen: Um ehrlich zu sein, kannte ich den Befehl bis eben noch nicht.


Tino - Mi 04.09.02 23:43

Die Suchfunktion von AUQ hätte Dir min. zwei Ergebnisse geliefert. Hier einen: http://www.auq.de/viewtopic.php?t=1670

Gruß
TINO


S - tefano - Mo 09.09.02 21:56

Hi,

ich hab im PSDK und auf anderen Seiten auch solche Methoden gefunden.
Aber auf Screenshots dazu war der Dialog immer in Englisch.
Ist der immer englisch oder hängt das von der aktuell eingestellten Systemsprache ab?

Bis denn

S - tefano


bis11 - Di 10.09.02 06:38

Hi s - tefano,

nimm mal meinen Link, den ich etwas weiter oben gepostet habe. Der ruft den Dialog direkt vom System auf und zeigt Ihn auch in der aktuellen Systemsprache an. Installierst Du Dein Programm auf ein System wo die Sprache englisch ist wird auch dieser Dialog in englisch angezeigt, genau so ist es auch für die anderen Sprachen.


Tino - Di 10.09.02 09:44

bis11 hat folgendes geschrieben:
nimm mal meinen Link, den ich etwas weiter oben gepostet habe. Der ruft den Dialog direkt vom System auf und zeigt Ihn auch in der aktuellen Systemsprache an.

Das sollte der Beitrag den ich oben verlinkt angegeben habe auch machen!

Gruß
TINO


tommie-lie - Fr 13.09.02 20:17

Okay, soweit so gut, jetzt habe ich das Verzeichnis.

Aber Tino:
Ich habe bei meiner Suche ncihts gefunden. Und ich habe sogar nur nach Ordner gesucht, ohne weitere Einschränkungen.
Aber das, auf das du da verlinkt hast ist doch nicht das was ich meinte. Das öffnet doch den "normalen" Datei-Öffnen-Dialog, oder?!? Ich wollte eben diesen Baum haben...

Tschüß
Thomas


tommie-lie - Fr 13.09.02 20:39

Ich habe jetzt Tino's Prozedur ausprobiert.
Die zeigt nciht nur die Dateien sondern auch die Verzeichnisnamen an. Wie kann ich das denn so machen, daß ich nur die Dateinamen habe? Einfach die löschen, die keine Extension haben? Und was ist dann mit den Dateien, die keine Extension haben?

Tschüß
Thomas


Tino - Fr 13.09.02 21:41

Hallo Tommie,

tommie-lie hat folgendes geschrieben:
Das öffnet doch den "normalen" Datei-Öffnen-Dialog, oder?!? Ich wollte eben diesen Baum haben...

In dem Link den ich Dir gepostet habe meine ich besonders den Beitrag von Deykin11. In diesem wird eine Code-Beispiel gezeigt mit dem man den "Ordner suchen"-Dialog anzeigen lassen kann.

tommie-lie hat folgendes geschrieben:
Die zeigt nciht nur die Dateien sondern auch die Verzeichnisnamen an.

Das kann ich mir nicht vorstellen. Die sollte nur die Verzeichnisstruktur (inkl. Desktop und so) anzeigen.

tommie-lie hat folgendes geschrieben:
Wie kann ich das denn so machen, daß ich nur die Dateinamen habe?

Wieso Dateien? Du wolltest doch ein Verzeichnis vom User auswählen lassen, oder?

Gruß
TINO


tommie-lie - Sa 14.09.02 11:49

Ja. Ich wollte, daß der User ein Verzeichnis auswählt. Dann braucht das Programm die Pfade aller DATEIEN in diesem Verzeichnis. Dein Codebeispiel (findFiles) listet aber (zumindest bei mir) in der Listbox auch die Verzeichnisnamen auf.
Beispiel:
Er sagt:
C:\Windows
C:\Programme\
C:\autoexec.bat
...
C:\Windows\progman.exe
...

Er soll aber sagen:
C:\autoexec.bat
...
C:\Windows\progman.exe

Also einfach ohne Verzeichnisse, sondern nur die Dateien. Aber die Dateien in den Unterverzeichnissen soll er trotzdem aklappern.

Tschüß
Thomas


S - tefano - Sa 14.09.02 12:40

Hi,

naja, du kannst ja wenn die Liste gefüllt ist (also wenn dein Prog mit dem Auflisten fertig ist) die Einträge, die nur Verzeichnisnamen darstellen manuell rausnehmen.
So würd ichs jedenfalls machen...

Bis denn

S - tefano


tommie-lie - Sa 14.09.02 13:16

Und wie sieht das dann aus?
Alle Einträge ohne Extension, also ohne Teil hinter dem Punkt sind Verzeichnisse?
Und was ist dnn mit den Dateien ohne Extension?

Tschüß
Thomas


Tino - Sa 14.09.02 13:22

tommie-lie hat folgendes geschrieben:
Ja. Ich wollte, daß der User ein Verzeichnis auswählt.

Ich hoffe das hast Du jetzt mit dem richtigen Dialog remacht. Also z. B. mit dem Code den Deykin11 hier [http://www.auq.de/viewtopic.php?t=1670] gepostet hat. Damit hast Du ja erstmal einen Teil Deiner Aufgabe gelöst.

tommie-lie hat folgendes geschrieben:
Dein Codebeispiel (findFiles) listet aber (zumindest bei mir) in der Listbox auch die Verzeichnisnamen auf.

Welches Codebeispiel meinst Du? Wenn Du diesen FAQ-Beitrag [http://www.auq.de/viewtopic.php?t=1107] meinst dann ja. Allerdings wusste ich gar nicht das es um diesen Beitrag ging :?

tommie-lie hat folgendes geschrieben:
Also einfach ohne Verzeichnisse, sondern nur die Dateien. Aber die Dateien in den Unterverzeichnissen soll er trotzdem aklappern.

Dann schau Dir doch noch mal den FAQ-Beitrag genauer an. Dann wirst Du dort eine Stelle finden wo die gefundenen Dateien/Verzeichnisse in die Stringliste eingefügt werden:

Quelltext
1:
2:
// ...Ergebnis in die Stringlist einfügen 
aResult.Add (aPath + FindRec.Name);

Diese Stelle müsstest Du ein bissel erweitern und eine IF-THEN-Abfrage einbauen und prüfen ob es sich nicht um ein Verzeichnis handelt!

Gruß
TINO

PS: Ich würde Dir vorschalgen das Du in Zukunft für jede Frage (1. Frage: Verzeichnis suchen Dialog; 2. Frage: nur Dateien bei dem FAQ-Beitrage) ein eigenes Topic erstellen :wink:


tommie-lie - Sa 14.09.02 13:40

Hallo Tino,

Ich habe den Link von bis11 aus dem Delphicenter genommen, der aber das gleiche ist wie das von deykin11. Also ist ds schonmal gelöst.

Dann zu Sache mit deinem FAQ-Eintrag:
Ich habe gar nicht gemerkt, daß ich in diesem Thread nichts dvon geschrieben habe. Da ich den Mozilla nutze und regen gebrauch des Tabbed-Browsings mache, scheint das wohl irgendwo untergegangen zu sein. Aber ich meine deinen FAQ-Beitrag. Ich galube, ich habe ihn irgendwo mit der Suchen-Funktion gefunden. Aber von dem Augenblick an, an dem ich geschrieben habe, daß ich "Tino's Prozedur ausprobiert! habe, meinte ich den FAQ-Beitrag.

Verzeichnisse filtern:
Also meinst du ,daß ich schon vor dem eintragen in die Listbox überprüfen soll, ob's ein Verzeichnis ist, oder nicht, und nciht erst, wenn die Liste schon fertig ist? Aha. Und das mache ich dann mit der Atrributüberprüfung, richtig?

Tschüß
Thomas


S - tefano - Sa 14.09.02 21:29

Also ich würd gucken, ob ein Eintrag mit nem Backslash aufhörht.
Wenn ja, dann raus.
Hm, ich guck mal ob mir was eleganteres einfällt...


Delete - Sa 14.09.02 22:02

ExtractFilePath müßte einen Leerstring zurückgeben, wenn nur ein Verzeichnis übergeb wurde.


DeCodeGuru - Sa 14.09.02 22:24

Wenn ein Backslash am Ende des Strings steht, gibt ExtractFilePath genau den gleichen String zurück -> keine Veränderung.


Delete - Sa 14.09.02 22:27

Und was gibt ExtcractFilePath hier zurück:
c:\windows\system


DeCodeGuru - Sa 14.09.02 22:29

Zitat:
Und was gibt ExtcractFilePath hier zurück:
c:\windows\system


c:\windows\


Tino - Sa 14.09.02 23:53

tommie-lie hat folgendes geschrieben:
Aber von dem Augenblick an, an dem ich geschrieben habe, daß ich "Tino's Prozedur ausprobiert! habe, meinte ich den FAQ-Beitrag.

Jetzt wird mir einiges klar :-D
tommie-lie hat folgendes geschrieben:
Also meinst du ,daß ich schon vor dem eintragen in die Listbox überprüfen soll, ob's ein Verzeichnis ist, oder nicht, und nciht erst, wenn die Liste schon fertig ist?

Ja! Warum einen Eintrag in die StringList einfügen wenn er danach wieder entfernt werden soll?
tommie-lie hat folgendes geschrieben:
Und das mache ich dann mit der Atrributüberprüfung, richtig?

Jupp! So kannst Du überprüfen ob es sich um ein Verzeichnis handel:

Quelltext
1:
If FindRec.Attr and faDirectory = faDirectory Then                    

Ich hoffe jetzt klappt es!

Schönen Abend noch
TINO


tommie-lie - So 15.09.02 11:14

Aha,

Wie ich's überprüfe hätte ich auch noch hinbekommen, aber danke.
Jetzt weiß ich, wie ich das als Ganzes sehen muss.

"Schönen abend noch" um 7 Minuten vor Mitternacht? Scherzbold...

Tschüß
Thomas