Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi TPathfinderFrame und TFilesearcher (https://www.delphipraxis.net/194953-tpathfinderframe-und-tfilesearcher.html)

Delbor 22. Jan 2018 12:16

Delphi-Version: XE8

TPathfinderFrame und TFilesearcher
 
Hi zusammen

Seit längerem verwende ich die von DeddyH entwickelte Komponente TFileSearcher.

Mit der Komponente mitgeliefert werden auch einige Demos, unter anderem auch eine solche, die die gefundenen Dateien und deren kompletten Pfade in einer Listview anzeigt. Mit der Anwendung lassen sich sämtliche Komponenteneinstellungen verändern, mit denen festgelegt werden kann, welche Dateien gefunden werden sollen. So lässt sich auch das Property Filemask zur Laufzeit verändern. Defaultmässig ist dabei '*.*' angegeben - damit werden sämtliche Dateien beliebiger Endung gefunden.
Wenn ich diese Einstellung zur Laufzeit der Demo durch '*.pdf*' ersetze, findet mir die Komponente sämtliche Dateien mit dieser Endung, die sich im Startverzeichnis (Rootdir) befinden.
Soweit, so gut.

Wenn ich nun aber in meinem PathfinderFrame die Komponente einsetze, 'verhält sie sich richtig mies' - mit der Defaulteinstellung '*.*' findet sie alles. Wenn ich allerdings diese Einstellung ändere, geschieht nichts.
Um es genauer zu sagen:

Delphi-Quellcode:
procedure TPathFinderFrame.FileMaskInit;
  var i: integer;
begin
  for i := Low(VALID_EXTENSIONS) to High(VALID_EXTENSIONS) do
  begin  
    if i = 5 then
      CmbxFileType.Text := VALID_EXTENSIONS[i]; //IntToStr(FDefaultType);  
    CmbxFileType.AddItem(VALID_EXTENSIONS[i], nil);
  end;  
  PathFinder1.FileMask := '*.pdf*'; //VALID_EXTENSIONS[5];
end;

Mit dieser bei Programmstart aufgerufenen Prozedur stelle ich den Defaultwert von PathFinder1.FileMask auf '*.pdf*' ein. TPathFinder ist die selbe Komponente (keine Nachkomme) wie TFilesearcher. Letztere habe ich erst vor einiggen Tagen von Deddh's Webseite heruntergeladen und in TPathfinder umbenannt. Hintergrund ist: Ich hatte damals, zur Entwicklungszeit, einige Tests mit der Komponente durchgeführt und war mir jetzt nicht mehr sicher, dass ich auch wirklich die finale Version der Komponente installiert habe. TPathFinder entspricht also genau der TFileSeacher-Komponente, wie sie bei DeddyH heruntergeladen werden kann.

Trotzdem liegt genau hier der Haken - rufe ich obige Prozedur aus dem Constructor meines TPathfinderFrames auf, wird zur Laufzeit die Suche gestartete und gleich wieder beendet. Im Treeview verschwindet das Chevron desjenigen Ordners, den ich erweitern wollte, und Dateien und Unterordner werden nicht angezeigt.

Dasselbe geschieht, wenn ich zur Designzeit den Wert des Filemask-Propertys im OI auf '*.pdf*' ändere (natürlich ohne die Hochkommas) und obige Prozedure nicht aufrufe.

Leider habe ich die entscheidende Stelle trotz mehrmaligem Durchsteppen nicht gefunden. Wobei ich allerdings zugeben muss: sobald ich beim Durchsteppen in den Delphi-Unit lande, beende ich, indem ich nun F9 drücke und damit wieder bei einem in meiner Anwendung gesetzten Haltepunkt lande, da ich in diesen Units keinen Hinweis auf den Fehler erwarte.

Im Verlauf meiner Suche nach einer Lösung des Problems habe ich allerdings noch etwas anderes entdeckt. Ich hatte mir einen Frame gebaut, der die in der ListviewDemo enthaltenen Masken zur Einstellung der Suchparameter enthält.
Dieser Frame enthält folgende Prozedur:

Delphi-Quellcode:
procedure TSearchOptionsFrame.CmbxSearchTypeCloseUp(Sender: TObject);
begin
  FSearchType := CmbxSearchType.Text;
//  FSearchType := TSearchType(CmbxSearchType.ItemIndex);;
end;
Hier erfahre ich per Hint, dass TSearchType in der Unit Vcl.ComCtrls definiert ist und da nur 2 Elemente enthält. Allerdings enthält der Uses-Abschnitt noch keinerlei Hinweis auf die Komponenten-Unit oder die DDFileUtils.
Auf den oben beschriebenen Fehler hat dies allerdings keinen Einfluss, da der Frame zwar Teil des Projektes, aber noch nicht in Betrieb ist. Allerdings stellt sich mir die Frage, wie ich hier Konflikte vermeiden kann.

Über einen Hilfreichen Hinweis zu meinem Problem würde ich mich sehr freuen.

Gruss
Delbor

DeddyH 22. Jan 2018 12:40

AW: TPathfinderFrame und TFilesearcher
 
Hast Du die Komponente zur Designzeit aufs Formular bzw. den Frame gesetzt, oder erzeugst Du sie dynamisch?

Delbor 22. Jan 2018 13:11

AW: TPathfinderFrame und TFilesearcher
 
High DeddyH

Die Komponente wurde zur Designtime gesetzt.

Gruss
Delbor

DeddyH 22. Jan 2018 13:19

AW: TPathfinderFrame und TFilesearcher
 
Wenn es ein Problem mit dem gleich benannten Datentyp sein sollte, musst Du den richtigen voll qualifizieren:
Delphi-Quellcode:
FSearchType: FileSearch.TSearchType;
oder Dir einen Alias dafür erstellen und den benutzen(auch wieder voll qualifiziert).
Delphi-Quellcode:
type
  TMySearchType = FileSearch.TSearchType;

  TWasWeissIchFrame = class(TFrame)
  ...
  private
    FSearchType: TMySearchType;
Dann zur Maske: *.pdf* findet alle Dateien und/oder Ordner (je Einstellung des Suchtyps), die irgendwo im Namen die Zeichenfolge ".pdf" enthalten, und nicht nur solche mit der Endung pdf. Ist das so gewollt?

Delbor 22. Jan 2018 13:57

AW: TPathfinderFrame und TFilesearcher
 
Hi DeddyH

Zitat:

Dann zur Maske: *.pdf* findet alle Dateien und/oder Ordner (je Einstellung des Suchtyps), die irgendwo im Namen die Zeichenfolge ".pdf" enthalten, und nicht nur solche mit der Endung pdf. Ist das so gewollt?
Nein - bei der Angabe der Maske habe ich mich am Defaultwert (*.* ) orientiert und nach dem Punkt die Endung notiert. ***

Sag jetzt bloss nicht :mrgreen: , ich hab da des guten zuviel getan:lol:
Zitat:

Wenn es ein Problem mit dem gleich benannten Datentyp sein sollte, musst Du den richtigen voll qualifizieren:

Ich habe bemerkt, dass da, wo du diesen Typ einsetzt, Comctrl am Anfang der Usesliste steht, die Komponentenunits aber ziemlich am Schluss.
Ist das zuverlässig?

Gruss
Delbor

*** ÄÄhm - der Defaultwert findet also alles, was irgendwo einen Punkt hat? Dan ist der 2. Stern zuviel?

PS: In der Demo habe ich allerdings auch *.pdf* angegeben

DeddyH 22. Jan 2018 14:05

AW: TPathfinderFrame und TFilesearcher
 
Wenn mehrere Units Typen desselben Namens deklarieren, gewinnt diejenige, die als letzte eingebunden wird. Wirklich zuverlässig ist der gezeigte Weg mit dem voll qualifizierten Namen, dann weiß der Compiler exakt, welcher Typ denn tatsächlich gemeint ist. Und wenn Du nur PDF-Dateien suchst, wäre *.pdf die richtige Maske (ohne den abschließenden *).

Delbor 22. Jan 2018 14:22

AW: TPathfinderFrame und TFilesearcher
 
Hi DeddyH

Zitat:

Wirklich zuverlässig ist der gezeigte Weg mit dem voll qualifizierten Namen

Ok, Danke!
Ich habe die Maske auch mal ohne alle Sterne und ohne Punkt definiert -da findet 'er' gerade mal den Ordner PDF...

Hab vielen Dank für die Hilfe!

Gruss
Delbor

Ghostwalker 22. Jan 2018 15:41

AW: TPathfinderFrame und TFilesearcher
 
Kurze Maskenerklärungskundendingens:

Dateimasken sind im Prinzip genauso aufgebaut, wie ein vollständiger Dateiname. Dabei trennt der "." den Dateinamen von der Dateiendung (<Dateiname>.<Dateiendung>).

Der * steht für "eine Zeichenfolge beliebiger Länge oder keine".

Beispiele:

*.* beliebiger Dateiname, beliebige Dateiendung (findet alle Dateien und Verzeichnisse)
*.pdf beliebiger Dateiname, mit der Dateiendung pdf
wupti.* Dateiname "wupti" (Copyright siehe Unten), beliebige Dateiendung (also alle Dateien mit namen wupti)
wupti*.* Der Dateiname muss mit wupti beginnen, der Rest is egal
*wupti.* Der Dateiname muss mit wupti enden, der Rest is egal
*.p* beliebiger Dateiname, die Dateiendung muss mit p anfangen
*.*p beliebiger Dateiname, die Dateiendung muss mit p aufhören

Nur so um mal die Verwirrung etwas zu klären :)

"wupti" wurde von Daniel (aka Cheffe) erfunden. Somit liegt das Copyright bei ihm 8-)

Delbor 23. Jan 2018 07:47

AW: TPathfinderFrame und TFilesearcher
 
Hi Ghostwalker

Vielen Dank für diese ausführliche Beschreibung!

Gruss
Delbor

himitsu 23. Jan 2018 08:32

AW: TPathfinderFrame und TFilesearcher
 
Zitat:

*.p* beliebiger Dateiname, die Dateiendung muss mit p anfangen
abc.Pef.xyz :stupid:


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:58 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz