Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   OpenDirDialog (https://www.delphipraxis.net/96316-opendirdialog.html)

Garfield 22. Jul 2007 14:21


OpenDirDialog
 
Liste der Anhänge anzeigen (Anzahl: 4)
Beschreibung

Für die Auswahl eines Verzeichnisses findet man viele ähnliche Quelltexte, welche ShBrowseForFolder und BrowseInfo verwenden. Dabei hatte ich unter Win2000 immer das Problem mit dem Einstellen der Größe, der Position und ob der Button "Neuer Ordner" angezeigt wird. Das bedeutet, der Button wurde nur angezeigt, wenn das Flag für die NewGUI gesetzt wurde, dann konnte jedoch die Größe nicht eingestellt werden. Die Positionierung habe ich gar nicht hinbekommen.

Vermutlich werden die meisten die Komponente nicht benötigen. Mir geht es allerdings mehr darum, ein paar Verbesserungsvorschläge zu bekommen.

Die Komponente erstellt ein TForm und setzt dessen Caption. Auf dem Formular befindet sich ein Verzeichnisbaum. Dieser wurde bis Build 9 in einem TShellTreeView dargestellt. Ab Build 10 wird der TPathExplorer (eine Erweiterung des FileExplorer) verwendet. Der TPathExplorer zeigt auch bei nicht unicodefähigen Delphi Widestrings an. Darunter befinden sich Button für OK und Abbruch.

Mit "F5" werden die Unerordner des markierten Ordners neu eingelesen. Bis Build 12 konnte man mit der Taste "Einf" den "Neuer Ordner"-Dialog auch ohne entsprechende Option aufrufen und mit "Entf" Ordner löschen.

Der Dialog bietet weiterhin diese Optionen:
  • Über dem Verzeichnisbaum kann ein Label mit einem Hinweis angezeigt werden.
  • Unter dem Verzeichnisbaum kann ein Edit angezeigt werden. In dieses kann man den Pfad direkt angeben. Sofern dieser existiert, wird er im Verzeichnisbaum aufgeblättert. Existiert er nicht, muss er seit Build 10 selbst angelegt werden.
  • Es kann ein Button "Neuer Ordner" eingefügt werden. Über diesen wird ein Dialog zur Erstellung eines Ordners geöffnet.
  • Es kann zugelassen werden, dass die Größe des Dialoges vom Anwender verändert werden kann.
Siehe Bild ODD.png unten.

Hinweis

Die aktuelle Version läuft unter Turbo Delphi. Da es nicht unicodefähig ist, werden in der Demo für bestimmte Komponenten die TNT Hack Controls von Himitsu verwendet. Ein direktes Einbinden der TNT Controls sollte ebenfalls funktionieren. Ab Delphi 2009 können die Tnt (Hack) Controls auch aus den uses entfernt werden. In der Demo war es notwendig, die Schriftart der Edits auf Tahoma zu ändern, damit Unicode richtig dargestellt wurde. Unter Delphi 7 funktioniert die Komponente derzeit nur bis Build 9 a.

Demo

In der Demo wird die Komponente dynamisch eingebunden. D.h. die Unit gfOpenDirDlg wurde zum Projekt hinzugefügt und in die uses eingetragen. In der Procedure, in welcher der Dialog benötigt wird, wird eine Variable vom Typ TOpenDirDialog deklariert, die Class erstellt und wieder freigegeben. Für Delphi ohne Unicode, wie dem von mir für die Demo verwendeten Turbo Delphi, werden Unicodekomponenten benötigt. Die Demo verwendet, da die TNT Controls nicht in Turbo Delphi Explorer installiert werden können, die oben bereits erwähnten TNT Hacks von Himitsu. Diese sind in der Demo nicht enthalten. Sie müssen noch hinzugefügt und in den Suchpfad des Projektes eingetragen werden (TntHack und TntHack\Sources).

Eigenschaften ab Build 10
Delphi-Quellcode:
Caption   : String;
Fontname  : String;
Title     : WideString;
Root      : String;
InitialDir : WideString;
Path      : WideString;
Height    : Integer;
Left      : Integer;
Top       : Integer;
Width     : Integer;
Position  : TPosition;
Options   : TOpenDirOptions;
Eigenschaften bis Build 9
Delphi-Quellcode:
Caption   : String;
Title     : String;
Fontname  : String;
Root      : String;
InitialDir : String;
Path      : String;
Height    : Integer;
Left      : Integer;
Top       : Integer;
Width     : Integer;
Position  : TPosition;
Options   : TOpenDirOptions;
InitialDir wird gesetzt und Path ist die Rückgabevariable.

Siehe ebenfalls Bild "odd.png" unten.

Historie

05.10.2010 - Build 15
  • destructor TOpenDirDialog.Destroy entfernt.
  • procedure TOpenDirDialog.FormClose eingefügt.
  • Auswertung von DelphiCompilerVersionen eingefügt.
  • Root war als String anstelle als Widestring deklariert.
15.07.2010 - Build 14
  • Nach dem Löschen eines Ordners wird auch der übergeordnete neu gescannt.
  • Beim Aktualisieren per F5 wird auch der übergeordnete Ordner neu gescannt.
  • Workaround dafür, dass bei sofortiger Erstellung des ersten dieser zweimal angezeigt wird.
  • Button beim Formular für den Namen des neuen Ordners auf normale Größe gesetzt und Formularhöhe angepasst.
04.05.2010 - Build 13
  • Option odPerformCreate entfernt. Funktionierte mit dem PathExplorer nicht mehr, da nicht der Text aus dem Edit sondern der Folder aus dem PathExplorer verwendet wurde.
  • Ist die Option odCaption nicht gesetzt, wird die Caption der MainForm verwendet.
  • Das Einfügen und Löschen über "Einf" und "Entf" ist nur noch möglich, wenn die Option "odNewFolder" gesetzt ist.
  • Beim ReScan wurden die gefundenen Einträge nur hinzugefügt. Jetzt werden erst die besehenden Einträge gelöscht.
  • Mit F5 wird der markierte Ordner aktualisiert.
  • Variable OpenDirDlg_Build für die Versionsabfrage eingefügt.
03.05.2010 - Build 12
  • function ExtractDir eingefügt.
  • function ForceDirectoryW eingefügt.
  • ForceDirectories durch ForceDirectoryW ersetzt.
  • Beim NewFolder Dialog war die Variable für den Pfad noch als String deklariert.
  • Beim Setzen des InitialDir wurde LowerCase anstelle von WideLowerCase verwendet.
17.04.2010 - Build 11
  • Auswertung der Compilerdirektive Unicode zum Laden der Unit TntHackStdCtrls.
  • Wegen der Verwendung der Unit TntHackStdCtrls wird das TWideLabel nicht mehr benötigt und wurde deshalb entfernt.
  • Komponente PathExplorer integriert um zweite Unit einzusparen.
11.04.2010 - Build 10
  • Unit ShellCtrls mit TShellTreeView gegen Unit uPathExplorer mit TPathExplorer ausgetauscht.
  • Die Property FInitialDir und FPath auf WideString geändert.
  • Function DirExists für Namen in Widestring eingefügt und DirectoryExists entfernt.
  • Function DeleteDirectory in DirDelete umbenannt und für Widestring geändert.
  • ExtractFileDrive aus Unit SysUtils als ExtractDrive übernommen, auf Widestrings geändert und abschließenden Pathdelim hinzugefügt.
  • TRootFolder und nFolder aus der Unit ShellCtrls übernommen, damit die Verzeichnisnamen nicht geändert werden müssen.
  • FRoot wird nicht als String sondern CSIDL angegeben.
  • OpenDirDlg: TreeKeyDown um Einfg ergänzt.
  • NewFolder: TLabel in TWideLabel geändert.
  • NewFolder: NewFolderKeyDown eingefügt.
  • Existiert der im Edit eingetragene Ordner, wird er aufgeschlagen.
  • Nicht existierende Ordner werden im Edit rot angezeigt.
29.08.2010 - Build 9a
  • Schutzverletzung beim Schließen des Dialoges beseitigt. Trat nur unter D7 auf.
  • WideLabel entfernt.
  • Variablen vereinheitlicht.
  • Nach dem Setzen des Borderstyles war das InitialDir nicht mehr voreingestellt.
11.09.2008 - Build 9 (Versionen für D7/TD2006 und D2009)
  • ST_OrdnerChange war nicht eingebunden.
  • Property OnCreate entfernt.
  • : aus der Liste der verbotenen Keys herausgenommen, weil sonst immer das Laufwerk angeklickt werden muss.
  • (D2009) TWideLabel entfernt.
  • (D2009) WideString in String geändert.
  • (D2009) In EditChange wird auch die Länge des Pfades überprüft, da DirectoryExists beim Laufwerk kein \ benötigt.
  • (D2009) In EditKeyPress wird CharInSet verwendet.
15.08.2008 - Build 8
  • Beim Resize wurde nicht geprüft, ob odNewFolder in FOptions enthalten ist.
  • Breite des TShellTreeView beim Execute korrigiert.
  • Beim Resize wird eine Mindestgröße beachtet.
19.09.2007 - Build 7
  • Initialvariablen und Sizegrip umbenannt.
  • Erstellung des Labels für den Title geändert. Dadurch funktioniert nun der Zeilenumbruch.
  • TLabel für den Title gegen TWideLabel - ein modifiziertes TCustomLabel - ausgetauscht.
02.09.2007 - Build 6
  • Eigenschaft Fontname für das TLabel Title eingefügt.
  • Vor dem Setzen der Größe des TLabel für den Title wird die Höhe der gewählten Schriftart ermittelt.
29.08.2007 - Build 524.08.2007 - Build 4
  • Zwei von der Klasse unabhängige Variablen eingefügt, welche sich die Größe des OpenDirDialoges "merken".
  • SizeGrip mit TSizeGripPanel eingefügt.
17.08.2007 - Build 3
  • Bei BorderIcon biMinimize und biMaximize entfernt.
  • War der Text in der Editbox kein gültiges Verzeichnis wurde dem TShellTreeView in der Procedure EditChange ein leerer String übergeben.
  • Enthält der Path des TShellTreeView beim Beenden des Dialogs am Ende keinen : oder \\ wird er nicht an FPath übergeben.
  • Die Komponenten, welche im Execute ohne Namen erstellt wurden sind in der Class deklariert.
  • Dadurch konnte OpenDirDlgResize eingefügt werden. Die Größenverstellung wird mit der Option odSizeable erlaubt.
  • Variablen für Höhe und Breite ausserhalb der Klasse angelegt. Diese werden bei der Initialisation gesetzt und beim Resize geändert. Dadurch bleiben sie bis zum Schliessen der Application unabhängig von der Klasse erhalten.
04.08.2007 - Build 2
  • Das in der EditBox bei Crtl + Space eingegebene Leerzeichen wird entfernt.
  • Während der Eingabe des neuen Ordnernamen wird dieser auf ungültige Zeichen '<', '>', '|', '/', '"', ':', '?' geprüft, wobei '/' in '\' geändert wird.
  • dto für die Eingaben in der EditBox.
  • Fehlermeldung, wenn das Verzeichnis nicht erstellt werden konnte.
  • Beenden des Dialogs mit ESC- und Enter-Taste
22.07.2007 - Build 1
  • Scalierung entfernt.
  • Endlosschleife bei Änderung des Root berichtigt.
  • Rootänderung funktioniert, wurde beim Execute aufgehoben.
  • Das fehlende Initialdir wird abgefangen.
22.07.2007 - Initial

FAlter 22. Jul 2007 17:14

Re: OpenDirDialog
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hi,

Ich musste die Anweisungen zur Skalierung auskommentieren, ansonsten war es zu große Schrift ("Neuer Ordner" passte nicht mehr in den Button rein. (Ich habe bei mit 120 dpi eingestellt).

Den zweiten Screenshot habe ich also mit folgender Änderung aufgenommen:
Delphi-Quellcode:
//  if Screen.PixelsPerInch <> 96
//  then OpenDirDlg.ScaleBy(Screen.PixelsPerInch, 96);
Klick mal z. B. auf die "Systemsteuerung", das was dann passiert ist wohl nicht so toll.

Mfg
FAlter

halinchen 22. Jul 2007 17:23

Re: OpenDirDialog
 
Mir gefällts. Vor allem das Editfeld unter der Liste finde ich gut. Ich hasse Programme, wo man das nicht per Copy & Paste selber einfügen kann und immer 100 Klicks machen muss.

:thumb:

edit: Wenn ich in der Demo Root auf was anderes außer rfDesktop setze, hängt sich das Programm auf.

Garfield 22. Jul 2007 18:08

Re: OpenDirDialog
 
Zitat:

Zitat von FAlter
Ich musste die Anweisungen zur Skalierung auskommentieren, ansonsten war es zu große Schrift ("Neuer Ordner" passte nicht mehr in den Button rein. (Ich habe bei mit 120 dpi eingestellt).

Ich habe die Zeilen herausgenommen.

Zitat:

Zitat von halinchen
edit: Wenn ich in der Demo Root auf was anderes außer rfDesktop setze, hängt sich das Programm auf.

Es hat sich nicht aufgehängt. Viel schlimmer. :wall: War eine Endlos-While-Schleife.

Musste jetzt auch feststellen, dass sich bei mir das Root nicht ändert. :gruebel: Ausserdem wird das Fehlen eines InitialDir nicht abgefangen. :|

Habe oben die Dateien ausgetauscht.

Garfield 22. Jul 2007 18:32

Re: OpenDirDialog
 
Zitat:

Zitat von Garfield
Musste jetzt auch feststellen, dass sich bei mir das Root nicht ändert. :gruebel: Ausserdem wird das Fehlen eines InitialDir nicht abgefangen. :|

Bei der Ausführung von Execute wurde das Root wieder zurück gesetzt. Ist kein Initialdir gesetzt, wird es beim Erstellen des TShellTreeView auch nicht gesetzt. Ausserdem wird AutoRefresh nicht auf True gesetzt.

Vielen Dank für Eure Tests. :thumb:

dominikkv 22. Jul 2007 19:00

Re: OpenDirDialog
 
öhmmm... was mach ich falsch:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  odd : TOpenDirDialog;
begin
  odd           := TOpenDirDialog.Create(Self);
  odd.Caption   := 'Ordner auswählen';
  odd.Title     := 'Einen Ordner auswählen:';
  odd.Root      := 'rfDesktop';
  odd.InitialDir := 'D:\';
  odd.Height    := 365;
  odd.Left      := 0;
  odd.Top       := 0;
  odd.Width     := 330;
  odd.Position  := TPosition(4);

  odd.Options   := [odCaption, odTitle, odEdit];

  if odd.Execute then
    Edit1.Text  := odd.Path;

  FreeAndNil(odd);
end;
Zitat:

Access violation at address 0050070A in module 'Test.exe'. Read of address 00000008.

Garfield 3. Aug 2007 21:44

Re: OpenDirDialog
 
Entschuldigung, bin gerade von Montage zurück.

Zitat:

Zitat von dominikkv
öhmmm... was mach ich falsch:

Es ist kein Fehler zu sehen und wenn ich den Source übernehme, bekomme ich auch keinen Fehler.

Luckie 3. Aug 2007 22:57

Re: OpenDirDialog
 
Mit ShBrowseForFolder und BrowseInfo kann man doch genau das gleiche erreichen, wenn ich ich nicht irre. :gruebel:

Dezipaitor 3. Aug 2007 23:27

Re: OpenDirDialog
 
Zitat:

Zitat von Luckie
Mit ShBrowseForFolder und BrowseInfo kann man doch genau das gleiche erreichen, wenn ich ich nicht irre. :gruebel:

man kann aber nicht den Pfad direkt eingeben, sondern muss immer per Maus durch die Ordner gehen.

@Garfield:

Leider fehlt die Möglichkeit mit Enter und ESC den Dialog zu bestätigen bzw. abzubrechen.
Es fehlen zudem die Mnemonics.
Zudem wäre es wohl gleich am besten, den Dialog vom Benutzer in der größe verändern zu lassen.

Gut finde ich, dass man bei neuen Ordner erstellen gleich auch mehrere Ordner erstellen kann (123\123\123).
Leider gibt es keine Fehlermeldung, wenn der Ordner nicht erstellt wurde, oder der Ordnername ungültig ist (z.b. C:\windows, ???)

Wenn ich bei Root "rfNetwork" einstelle, und dann einen Pfad anklicke, kommt das :
---------------------------
Opendirdialog
---------------------------
Fehler beim Festlegen des Pfades: ""
---------------------------
OK
---------------------------


so das wars erstmal :D

Aber sonst echt gut.

Garfield 4. Aug 2007 09:07

Re: OpenDirDialog
 
Zitat:

Zitat von Luckie
Mit ShBrowseForFolder und BrowseInfo kann man doch genau das gleiche erreichen, wenn ich ich nicht irre. :gruebel:

Das steht auch gleich im allerersten Satz dieses Threads:
Zitat:

Zitat von Garfield
Beschreibung
Für die Auswahl eines Verzeichnisses findet man viele ähnliche Quelltexte, welche ShBrowseForFolder und BrowseInfo verwenden. Dabei hatte ich unter Win2000 immer das Problem mit dem Einstellen der Größe, der Position und ob der Button "Neuer Ordner" angezeigt wird. Das bedeutet, der Button wurde nur angezeigt, wenn das Flag für die NewGUI gesetzt wurde, dann konnte jedoch die Größe nicht eingestellt werden. Die Positionierung habe ich gar nicht hinbekommen. Da Turbo Delphi Probleme hatte die Unit ShellCtrls.pas zu finden, ist diese ebenfalls enthalten.

Zitat:

Zitat von Dezipaitor
Leider fehlt die Möglichkeit mit Enter und ESC den Dialog zu bestätigen bzw. abzubrechen.

Das stimmt. Muss ich noch ergänzen.

Zitat:

Zitat von Dezipaitor
Es fehlen zudem die Mnemonics.

:? Damit weiß ich im Moment nichts anzufangen.

Zitat:

Zitat von Dezipaitor
Zudem wäre es wohl gleich am besten, den Dialog vom Benutzer in der größe verändern zu lassen.

So wie es bei den Originalen von Windows ist? Da müsste die Formgröße veränderlich gemacht und die Größenangaben in vermutlich in der Registry gespeichert werden!?

Zitat:

Zitat von Dezipaitor
eider gibt es keine Fehlermeldung, wenn der Ordner nicht erstellt wurde, oder der Ordnername ungültig ist (z.b. C:\windows, ???)

Da muss ich dann noch eine Prufung integrieren.

Zitat:

Zitat von Dezipaitor
Wenn ich bei Root "rfNetwork" einstelle, und dann einen Pfad anklicke, kommt das :
...

Der Fehler liegt leider beim TShellTreeView. Dem Projekt liegt die Unit aus Turbo Delphi bei. Vielleicht gibt es andere Version ohne den Fehler? Sonst muss ich versuchen den Fehler zu finden.

Zitat:

Zitat von Dezipaitor
Aber sonst echt gut.

Danke.

OregonGhost 4. Aug 2007 09:23

Re: OpenDirDialog
 
Zitat:

Es fehlen zudem die Mnemonics.
Wenn ich das gerade nicht durcheinander bringe, sind das diese unterstrichenen Buchstaben, die man verwenden kann, um durch Menüs zu navigieren oder Buttons zu drücken (also z.B. Abbrechen => A drücken).
Um die Konsistenz zu wahren, musst du sie jedoch ausblenden, solange nicht Alt gedrückt wurde, seit Windows XP :stupid:

Garfield 4. Aug 2007 15:01

Re: OpenDirDialog
 
Nach den guten Anregungen von Dezipaitor habe ich die Komponente überarbeitet.

04.08.2007 - Build 2
  • Das in der EditBox bei Crtl + Space eingegebene Leerzeichen wird entfernt.
  • Während der Eingabe des neuen Ordnernamen wird dieser auf ungültige Zeichen '<', '>', '|', '/', '"', ':', '?' geprüft.
  • dto für die Eingaben in der EditBox.
  • Fehlermeldung, wenn das Verzeichnis nicht erstellt werden konnte.
  • Beenden des Dialogs mit ESC- und Enter-Taste

Zitat:

Zitat von OregonGhost
Wenn ich das gerade nicht durcheinander bringe, sind das diese unterstrichenen Buchstaben, die man verwenden kann, um durch Menüs zu navigieren oder Buttons zu drücken (also z.B. Abbrechen => A drücken).

:gruebel: Die Vorbilder von Microsoft haben das nicht. Nachdem ESC und Return integriert sind, wäre das eigentlich nur für den Button "Neuer Ordner" sinnvoll.

Zitat:

Zitat von OregonGhost
Um die Konsistenz zu wahren, musst du sie jedoch ausblenden, solange nicht Alt gedrückt wurde, seit Windows XP :stupid:

Jetzt stand ich auf dem Schlauch, denn die Anwendungen, welche ich benutze, blenden die Unterstreichungen nicht aus. Musste erst mal im Editor nachschauen. Ich denke, das Ausblenden ist nicht so wichitg.

Christian Seehase 4. Aug 2007 15:07

Re: OpenDirDialog
 
Moin Garfield,

Zitat:

Zitat von Garfield
Während der Eingabe des neuen Ordnernamen wird dieser auf ungültige Zeichen '<', '>', '|', '"', '/', ':', '?' geprüft.

ein / ist ein gültiger Pfadtrenner (auch wenn man fast nur \ verwendet).

Garfield 4. Aug 2007 15:34

Re: OpenDirDialog
 
Moin, Moin, da habe ich Datei- und Ordner zusammengehauen. Dann nehme ich mal '/' wieder raus.

Christian Seehase 4. Aug 2007 15:54

Re: OpenDirDialog
 
Moin Garfield,

sorry, da hatte ich doch glatt noch etwas vergessen :oops:

Ich habe jetzt nicht in den Code geschaut, aber:
Je nachdem, welche Funktionen Du benutzt, kann sich die Verwendung von \ und / auswirken, da so manche Delphi-Funktion als Pfadtrennzeichen nur \ unterstützt :wall:

Garfield 4. Aug 2007 18:22

Re: OpenDirDialog
 
Das Erstellen der Verzeichnisse erfolgt über ForceDirectories. Das heißt, beim Erstellen über den Button "Neuer Ordner" bzw beim Beenden des Dialogs, wenn die EditBox und die Option odPerformCreate eingestellt sind. Wenn in die EditBox ein Name eingegeben wird, wird die Existenz über DirectoryExists geprüft. Existiert es, wird das Verzeichnis im TShellTreeView mit "ST_Ordner.Path := Ed_Edit.Text;" markiert.

Test: In der EditBox gibt ein '/' einen Fehler, beim Erstellen über "Neuer Ordner" kann das Verzeichnis nicht erstellt werden. Mit '\' funktioniert beides.

Heißt also, wir müssen '/' wieder verbieten.

FAlter 4. Aug 2007 18:25

Re: OpenDirDialog
 
Hi,

Zitat:

Zitat von Garfield
Heißt also, wir müssen '/' wieder verbieten.

ODER durch '\' ersetzen.

Mfg
FAlter

Garfield 4. Aug 2007 18:28

Re: OpenDirDialog
 
:gruebel: Wäre vielleicht sinnvoller!?
__

getestet - überzeugt - wird entsprechend geändert.

Garfield 17. Aug 2007 21:11

Re: OpenDirDialog
 
Zitat:

Zitat von Dezipaitor
Zudem wäre es wohl gleich am besten, den Dialog vom Benutzer in der größe verändern zu lassen.

Ich habe eine Option odSizeable hinzugefügt. Damit ist die Form größenveränderlich. Zusätzlich gibt es zwei Variablen für Höhe und Breite, welche von der Class unabhängig sind. Damit werden Größenveränderungen bis zur Beendigung der Anwendung gemerkt. Die Anwendung kann die Werte eventuell in ihrer INI speichern.

Zitat:

Zitat von Garfield
Zitat:

Zitat von Dezipaitor
Wenn ich bei Root "rfNetwork" einstelle, und dann einen Pfad anklicke, kommt das :
...

Der Fehler liegt leider beim TShellTreeView. Dem Projekt liegt die Unit aus Turbo Delphi bei. Vielleicht gibt es andere Version ohne den Fehler? Sonst muss ich versuchen den Fehler zu finden.

Der Fehler lag doch bei mir. Genauer bei meiner Pseudo-Autovervollständigenfunktion. Wenn kein gültiger Verzeichnisname in der Editbox stand, wurde dem Pfad des TShellTreeView ein leerer String übergeben.

Garfield 19. Aug 2007 07:19

Re: OpenDirDialog
 
Liste der Anhänge anzeigen (Anzahl: 1)
Wenn die Option odSizeable gesetzt und das Dialogformular damit größenveränderbar ist, fehlt die Markierung an der rechten unteren Ecke. Beim Original funktioniert das, bei den Delphiforms anscheinend nur, wenn eine TStatusBar vorhanden ist.

Die Eigenschaft heißt SizeGrip.

Garfield 25. Aug 2007 22:51

Re: OpenDirDialog
 
SizeGrip eingefügt. Auf ein Panel werden Linien gezeichnet und das Panel wird rechts unten festgehalten. Dazu zwei Variablen, die in der Initialisation gesetzt werden und sich die Größe "merken". Alle Dateien oben aktualisiert.

Jetzt müsste das ganze noch Unicode unterstützen.

Garfield 1. Sep 2007 21:48

Re: OpenDirDialog
 
Das TSizeGripPanel wurde nach http://www.delphi3000.com/article.asp?ID=3785 durch eine TPaintBox ersetzt.

FAlter 2. Sep 2007 10:21

Re: OpenDirDialog
 
Hi,

ich habe noch eine kleine Kleinigkeit entdeckt... bei mir ist die Schrift (Title) unten abgeschnitten, sodass Buchstaben wie g, j, p, q nicht richtig angezeigt werden.

Ansonsten noch ein Vorschlag: Wie wärs, wenn man die Schriftart einstellen könnte?

Mfg
FAlter

Garfield 2. Sep 2007 11:48

Re: OpenDirDialog
 
Moin Felix,

vielen Dank für Deinen Hinweis und Deinen Vorschlag.

Ich hatte für die Höhe des Labels die Standardhöhe von 13 Pixel verwendet aber die Font.Size um 1 erhöht. Bei mir passte die Höhe dennoch. :? Nun wird vor der Festlegung der Labelgröße die Höhe der Schriftart ermittelt.

Das Ändern der Schriftart und -größe hatte ich im ersten Entwurf drin. Weil es mit der Mehrzeiligkeit nicht klappte, hatte ich es wieder entfernt. Nun ist die Eigenschaft Fontname dazu gekommen.

Downloads für Source und Demo aktualisiert.

ReBoot 18. Sep 2007 20:52

Re: OpenDirDialog
 
Frage: kann ich als Root auch nen Pfad angeben, bzw ein Laufwerk? Um genau zu sein, wie kann ich das angeben? Grad die Demo versucht und es hat net geklappt.

Garfield 18. Sep 2007 22:34

Re: OpenDirDialog
 
Dazu müsstest Du in der Klasse TOpenDirDialog unter published die Zeile
Delphi-Quellcode:
property Root      : String write SetRoot;
in
Delphi-Quellcode:
property Root      : String write FRoot;
ändern.

Garfield 19. Sep 2007 10:29

Re: OpenDirDialog
 
In Build 7 gibt es ein paar kleine Änderungen:
  • Die Initialvariablen für die Höhe und die Breite des Dialoges heißen nun OpenDirDlg_Height und OpenDirDlg_Width. Dürfte zur Verwendung im Hauptprogramm sinnvoller sein.
  • Die Befehlsfolge bei der Erstellung des Labels für den Title wurde geändert. Dadurch funktioniert nun der Zeilenumbruch für mehrzeilige Titel.
  • Das TLabel für den Title wurde gegen ein TWideLabel ausgetauscht. Das ist ein von mir modifiziertes TCustomLabel. Somit darf der Title auch Unicodezeichen enthalten. Die korrekte Darstellung ist von der verwendeten Schriftart abhängig.
    Hinweis: Das Edit in der Demo unterstützt kein Unicode.

Jufis 30. Jan 2008 15:05

Re: OpenDirDialog
 
Hi,

Frage: Gibt es mit dem Dialog eine Möglichkeit, außer einem Ordner auch eine Datei zu wählen? :?:

MfG

Jufis

BullsEye 30. Jan 2008 15:08

Re: OpenDirDialog
 
Nein, soweit ich das weiß, ist es nur möglich einen Ordner zu öffnen!

Jufis 30. Jan 2008 15:29

Re: OpenDirDialog
 
Schade, das Tool gefällt mir eigentlich.

Ich suche allerdings eine Möglichkeit, entweder einen Ordner zu wählen (per Mausklick und zusätzlich wie hier in einem Eingabefeld) oder aber nur eine einzelne Datei zu selektieren. Könnt Ihr mir da helfen?

MfG

Jufis

Garfield 30. Jan 2008 15:56

Re: OpenDirDialog
 
Ohne Edit kannst Du es machen wie Luckie meinte:
Zitat:

Zitat von Luckie
Mit ShBrowseForFolder und BrowseInfo kann man doch genau das gleiche erreichen, wenn ich ich nicht irre. :gruebel:

Oder Du baust Dir noch eine Dateiliste dazu. Zum Beispiel mit FileListBox.

Jufis 31. Jan 2008 06:57

Re: OpenDirDialog
 
OK, danke fürs erste! Ich werde mich weiter rantasten. :lol:

MfG

Jufis

FAlter 12. Aug 2008 19:02

Re: OpenDirDialog
 
Hi,

Delphi-Quellcode:
Procedure TOpenDirDialog.OpenDirDlgResize(Sender: TObject);
var
  Oben : Integer;
  Unten : Integer;
begin
  if OpenDirDlg.Visible
  then begin
...
    Bu_NewFolder.SetBounds(FWidth - 101, FHeight - 31, 95, 25); // <--- !!! Da krachts, wenn es keinen Bu_NewFolder gibt!
  end;
end;
Die AV sollte noch weg.

Mfg
FAlter

Garfield 15. Aug 2008 21:59

Re: OpenDirDialog
 
Zitat:

Zitat von FAlter
Die AV sollte noch weg.

Vielen Dank. Ist jetzt weg.

Garfield 11. Sep 2008 18:40

Re: OpenDirDialog
 
Mit D2009 sieht der OpenDirDialog schon erheblich besser aus.

Unter TurboDelphi war mir aufgefallen, dass das Ereignis ST_OrdnerChange nicht eingebunden war. Ausserdem wird das Property OnCreate nicht benötigt und aus der Liste der verbotenen Keys habe ich den : herausgenommen, weil sonst immer das Laufwerk angeklickt werden muss, wenn man den Pfad im Edit eingeben will.

Für D2009 konnten die Komponente TWideLabel entfernt und die Deklarationen WideString in String geändert werden. Ausserdem scheint sich DirectoryExists geändert zu haben, da zum Beispiel die Prüfung von 'd:' true ergibt. Im EditKeyPress wird nun die Function CharInSet verwendet, welche in TurboDelphi 2006 noch nicht enthalten ist.

Die Demo ist mit der Trial von D2009 Architect kompiliert und dürfte wohl nur 14 Tage ab Installation ausführbar sein!? In den Edits der Demo wurden bei mir die Unicodezeichen nicht korrekt angezeigt.

Garfield 11. Apr 2010 19:05

Re: OpenDirDialog
 
11.04.2010 - Build 10
  • Unit ShellCtrls mit TShellTreeView gegen Unit uPathExplorer mit TPathExplorer ausgetauscht.
  • Die Property FInitialDir und FPath auf WideString geändert.
  • Function DirExists für Namen in Widestring eingefügt und DirectoryExists entfernt.
  • Function DeleteDirectory in DirDelete umbenannt und für Widestring geändert.
  • ExtractFileDrive aus Unit SysUtils als ExtractDrive übernommen, auf Widestrings geändert und abschließenden Pathdelim hinzugefügt.
  • TRootFolder und nFolder aus der Unit ShellCtrls übernommen, damit die Verzeichnisnamen nicht geändert werden müssen.
  • FRoot wird nicht als String sondern CSIDL angegeben.
  • OpenDirDlg: TreeKeyDown um Einfg ergänzt.
  • NewFolder: TLabel in TWideLabel geändert.
  • NewFolder: NewFolderKeyDown eingefügt.
  • Existiert der im Edit eingetragene Ordner, wird er aufgeschlagen.
  • Nicht existierende Ordner werden im Edit rot angezeigt.

Für Delphi 7 und Turbo Delphi werden die TNT Hack Controls verwendet. Das sollte kein Problem sein, da der Widestring sonst auch irgendwie angezeigt werden muss. Die falsche Anzeige der Widestrings in der Demo mit D2009 lag an der eingestellten Schrift MS San Serif. Mit Tahoma funcktioniert es richtig.

Jetzt müsste das ganze am besten in nonVCL überführt werden. :gruebel:

Garfield 17. Apr 2010 14:59

Re: OpenDirDialog
 
Zwei Versionen für Delphi mit und ohne unicodefähige Komponenten waren mir zuviel. Auch die Verwendung von zwei Units. Deshalb:

17.04.2010 - Build 11
  • Auswertung der Compilerdirektive Unicode zum Laden der Unit TntHackStdCtrls.
  • Wegen der Verwendung der Unit TntHackStdCtrls wird das TWideLabel nicht mehr benötigt und wurde deshalb entfernt.
  • Komponente PathExplorer integriert um zweite Unit einzusparen.
Die ersten Schritte mit nonVCL habe ich nun mit Hilfe von Luckies Tutorial auch schon gemacht.

Garfield 3. Mai 2010 20:09

Re: OpenDirDialog
 
So ganz war es doch noch nicht auf WideStrings umgestellt. Wenn ein Verzeichnis WideChars enthielt, wollte der NewFolder-Dialog nicht. Ebenso war es dann mit dem Erstellen des Unterordners weil ForceDirectories nur Ansi verwendet. Ausserdem hatte ich beim Vergleichen der Strings beim Setzen des InitialDir übersehen, das LowerCase auch nur Ansi ist.

03.05.2010 - Build 12
  • function ExtractDir eingefügt.
  • function ForceDirectoryW eingefügt.
  • ForceDirectories durch ForceDirectoryW ersetzt.
  • Beim NewFolder Dialog war die Variable für den Pfad noch als String deklariert.
  • Beim Setzen des InitialDir wurde LowerCase anstelle von WideLowerCase verwendet.
ForceDirectoryW basiert auf ForceDirectories.

Wie ich gesehen habe, scheint das wiederholte Einlesen nach dem Löschen auch nicht so zu funktionieren, wie es soll. Da müsste noch ein Refresh wie F5 im Explorer rein.

Garfield 4. Mai 2010 13:30

Re: OpenDirDialog
 
Beim Rescan wurden die existierenden Ordner in die Liste hinzugefügt. So erhöhte sich die Anzahl bei jedem Einfügen oder Löschen eines Ordners. Hier die Liste der Änderungen:

04.05.2010 - Build 13
  • Option odPerformCreate entfernt. Funktionierte mit dem PathExplorer nicht mehr, da nicht der Text aus dem Edit sondern der Folder aus dem PathExplorer verwendet wurde.
  • Ist die Option odCaption nicht gesetzt, wird die Caption der MainForm verwendet.
  • Das Einfügen und Löschen über "Einf" und "Entf" ist nur noch möglich, wenn die Option "odNewFolder" gesetzt ist.
  • Beim ReScan wurden die gefundenen Einträge nur hinzugefügt. Jetzt werden erst die besehenden Einträge gelöscht.
  • Mit F5 wird der markierte Ordner aktualisiert.
  • Variable OpenDirDlg_Build für die Versionsabfrage eingefügt.
Die Option odPerformCreate habe ich mit der Einfügung des PathExplorers kaputt gemacht und nun entfernt. Ich überlege allerdings, ob sie wieder rein sollte.

Garfield 15. Jul 2010 18:05

AW: OpenDirDialog
 
Vor kurzem wurde folgendes festgestellt: Wird in einem leeren Verzeichnis ein Unterverzeichnis angelegt, werden für das Unterverzeichnis zwei TreeNodes angelegt. Wird das letzte Unterverzeichnis gelöscht und ein neues angelegt, dann wird es nur einmal angezeigt. Ursache ist, dass beim leeren TreeNode die Eigenschaft Expanded den Wert False hat. Deshalb wird beim Expanding noch einmal EnumFolder ausgeführt. Eine echte Lösung habe ich nicht gefunden, nur einen Workaround:
Delphi-Quellcode:
{ Workaround Beginn }
ptvExplorer.ReScan;
ptvExplorer.SetFocus;
{ Workaround Ende }
ptvExplorer.ReScan;
Beim ersten ReScan wird das Unterverzeichnis zweimal eingetragen. Beim SetFokus wird Expanded aktualisiert und beim zweiten ReScan werden die Unterverzeichnisse gelöscht und der Unterordner nur einmal eingetragen.

Ausserdem habe ich die Aktualisierung nach dem Löschen und nach F5 ein wenig geändert

15.07.2010 - Build 14
  • Nach dem Löschen eines Ordners wird auch der übergeordnete neu gescannt.
  • Beim Aktualisieren per F5 wird auch der übergeordnete Ordner neu gescannt.
  • Workaround dafür, dass bei sofortiger Erstellung des ersten dieser zweimal angezeigt wird.
  • Button beim Formular für den Namen des neuen Ordners auf normale Größe gesetzt und Formularhöhe angepasst.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:19 Uhr.
Seite 1 von 2  1 2      

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