![]() |
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 ![]() 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:
Hinweis Die aktuelle Version läuft unter Turbo Delphi. Da es nicht unicodefähig ist, werden in der Demo für bestimmte Komponenten die ![]() 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:
Eigenschaften bis Build 9
Caption : String;
Fontname : String; Title : WideString; Root : String; InitialDir : WideString; Path : WideString; Height : Integer; Left : Integer; Top : Integer; Width : Integer; Position : TPosition; Options : TOpenDirOptions;
Delphi-Quellcode:
InitialDir wird gesetzt und Path ist die Rückgabevariable.
Caption : String;
Title : String; Fontname : String; Root : String; InitialDir : String; Path : String; Height : Integer; Left : Integer; Top : Integer; Width : Integer; Position : TPosition; Options : TOpenDirOptions; Siehe ebenfalls Bild "odd.png" unten. Historie 05.10.2010 - Build 15
|
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:
Klick mal z. B. auf die "Systemsteuerung", das was dann passiert ist wohl nicht so toll.
// if Screen.PixelsPerInch <> 96
// then OpenDirDlg.ScaleBy(Screen.PixelsPerInch, 96); Mfg FAlter |
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. |
Re: OpenDirDialog
Zitat:
Zitat:
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. |
Re: OpenDirDialog
Zitat:
Vielen Dank für Eure Tests. :thumb: |
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:
|
Re: OpenDirDialog
Entschuldigung, bin gerade von Montage zurück.
Zitat:
|
Re: OpenDirDialog
Mit ShBrowseForFolder und BrowseInfo kann man doch genau das gleiche erreichen, wenn ich ich nicht irre. :gruebel:
|
Re: OpenDirDialog
Zitat:
@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. |
Re: OpenDirDialog
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
|
Re: OpenDirDialog
Zitat:
Um die Konsistenz zu wahren, musst du sie jedoch ausblenden, solange nicht Alt gedrückt wurde, seit Windows XP :stupid: |
Re: OpenDirDialog
Nach den guten Anregungen von Dezipaitor habe ich die Komponente überarbeitet.
04.08.2007 - Build 2
Zitat:
Zitat:
|
Re: OpenDirDialog
Moin Garfield,
Zitat:
|
Re: OpenDirDialog
Moin, Moin, da habe ich Datei- und Ordner zusammengehauen. Dann nehme ich mal '/' wieder raus.
|
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: |
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. |
Re: OpenDirDialog
Hi,
Zitat:
Mfg FAlter |
Re: OpenDirDialog
:gruebel: Wäre vielleicht sinnvoller!?
__ getestet - überzeugt - wird entsprechend geändert. |
Re: OpenDirDialog
Zitat:
Zitat:
|
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. |
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. |
Re: OpenDirDialog
Das TSizeGripPanel wurde nach
![]() |
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 |
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. |
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.
|
Re: OpenDirDialog
Dazu müsstest Du in der Klasse TOpenDirDialog unter published die Zeile
Delphi-Quellcode:
in
property Root : String write SetRoot;
Delphi-Quellcode:
ändern.
property Root : String write FRoot;
|
Re: OpenDirDialog
In Build 7 gibt es ein paar kleine Änderungen:
|
Re: OpenDirDialog
Hi,
Frage: Gibt es mit dem Dialog eine Möglichkeit, außer einem Ordner auch eine Datei zu wählen? :?: MfG Jufis |
Re: OpenDirDialog
Nein, soweit ich das weiß, ist es nur möglich einen Ordner zu öffnen!
|
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 |
Re: OpenDirDialog
Ohne Edit kannst Du es machen wie Luckie meinte:
Zitat:
|
Re: OpenDirDialog
OK, danke fürs erste! Ich werde mich weiter rantasten. :lol:
MfG Jufis |
Re: OpenDirDialog
Hi,
Delphi-Quellcode:
Die AV sollte noch weg.
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; Mfg FAlter |
Re: OpenDirDialog
Zitat:
|
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. |
Re: OpenDirDialog
11.04.2010 - Build 10
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: |
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
|
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
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. |
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
|
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:
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.
{ Workaround Beginn }
ptvExplorer.ReScan; ptvExplorer.SetFocus; { Workaround Ende } ptvExplorer.ReScan; Ausserdem habe ich die Aktualisierung nach dem Löschen und nach F5 ein wenig geändert 15.07.2010 - Build 14
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:37 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz