PDA

Vollständige Version anzeigen : Wie erhalte ich einen Dateiauswahldialog?


Stefan Kulpa
11.01.2003, 14:17
Der Dateiauswahldialog ist ein Windows eigener Systemdialog. Aus diesem Grund kann er von Windows Version zu Windows Version unterschiedlich aussehen – die Handhabung ist aber identisch.
Man kann nun diesen Dialog entweder mithilfe des ActiveX-Controls (Microsoft Common Dialog Control bzw. Comdlg32.ocx im System-Verzeichnis) aufrufen oder mittels der Win32-API. Darüber hinaus gibt es eine Reihe von Freeware-/Shareware-Tools, die ebenfalls diesen Dialog aufrufen können – grundsätzlich funktionieren alle auf die gleichen Art und Weise; sie rufen den in Windows vorhandenen Systemdialog auf.

Vorteil des ActiveX-Controls (Comdlg32.ocx):
Einfache Handhabung

Nachteil des ActiveX-Controls (Comdlg32.ocx):
Das Control steht nur zur Verfügung, wenn entweder die Access Developer Edition oder aber Visual Basic Professional (oder höher) vorliegt. Das Control bzw. dessen Update ist zwar im Internet verfügbar, aber ohne eine bestehende Lizenzdatei nicht einsetzbar.

Lösung 1: Nutzung des ActiveX-Controls (Comdlg32.ocx)

Um das ActiveX-Control nutzen zu können, muss dieses Control zunächst eingebunden werden:
Access: in der Formularansicht im Menü Einfügen den Punkt ActiveX-Steuerelement auswählen. In der daraufhin erscheinenden Liste Microsoft Common Dialog Control auswählen.
Visual Basic: im Menü Projekt den Punkt Komponenten auswählen. In der daraufhin erscheinenden Liste Microsoft Common Dialog Control durch Aktivierung des Kontrollkästchens auswählen.

Das Microsoft Common Dialog Control besitzt eine Vielzahl von Eigenschaften (Properies), da mit diesem Control nicht nur der Dateiauswahldialog aufgerufen werden kann, sondern auch weitere Systemdialoge:

• Farbauswahldialog
• Schriftenauswahldialog
• Druckerauswahldialog
• Aufruf des Windows Hilfesystems für eigene Hilfedateien

Bei der Nutzung dieses Controls muss man sich zunächst entscheiden, ob der Dialog zum Öffnen einer Datei bestimmt ist, oder aber zum Speichern einer Datei. Der Unterschied liegt darin, dass beim Öffnen die ausgewählte Datei vorhanden sein muss, beim Speichern aber dies nicht unbedingt gegeben sein muss (Neuanlage einer Datei).
Grundsätzlich jedoch führt das Control keinerlei Dateimanipulationen durch (Erstellen neuer Dateien etc.), sondern ist lediglich eine Schnittstelle zum Windows Dateisystem.

Die Vielzahl der erwähnten Eigenschaften decken die genannten Systemdialoge ab. Daher sind für den Dateidialog auch alle diese Eigenschaften notwendig. Um das Control ordnungsgemäß benutzen zu können, stehen folgende Eigenschaften für den Dateiauswahldialog zur Verfügung:

• CancelError Property
• DefaultExt Property
• DialogTitle Property
• FileName Property
• FileTitle Property
• Filter und FilterIndex Property
• Flags Property
• InitDir Property
• MaxFileSize Property

Die hier genannten und nachfolgend erläuterten Eigenschaften beziehen sich auf das Control in der Version 6.0.

Die Eigenschaft CancelError

Mit dieser Eigenschaft kann man dafür sorgen, dass im Fall eines Abbruchs des Dialogs (Abbrechen-Schaltfläche) ein Laufzeitfehler erzeugt wird, der über ein entsprechendes Fehlerhandling abgefangen werden kann. Ist dieser Wert nicht gesetzt, wird auch beim Abbruch kein Laufzeitfehler erzeugt.
Da es sich um einen Boolean-Wert handelt, muss diese Eigenschaft entweder mit True oder False gesetzt werden, wobei False die Standardeinstellung ist.

Die Eigenschaft DefaultExt

Mit dieser Eigenschaft kann man eine Standarddateierweiterung bestimmen. Wird beispielsweise der Dialog zum Speichern aufgerufen, die Standarddateierweiterung auf „.txt“ gesetzt und ein Dateiname ohne Erweiterung eingegeben, so wird diese Erweiterung automatisch an den Dateinamen angehängt.

Die Eigenschaft DialogTitle

Diese Eigenschaft steht nur für den Dateiauswahldialog zur Verfügung und erlaubt es, den Dialogtitel selbst auszuwählen. Die Standardtitel sind „Öffnen“ bzw. „Speichern unter…“.

Die Eigenschaft FileName

Mit dieser Eigenschaft hat man die Möglichkeit, einen Standarddateinamen im Dateidialog vorzubelegen. Nach Beendigung des Dialogs kann über diese Eigenschaft der komplette Dateipfad ermittelt werden.

Die Eigenschaft FileTitle

Über diese Eigenschaft steht nach Beendigung des Dialogs der Dateiname ohne Pfad zur Verfügung.

Die Eigenschaften Filter und FilterIndex

Über diese Eigenschaft kann man die Auswahlliste für die Dateitypen und somit das Verhalten des Controls in der (gefilterten) Anzeige von Datei beeinflussen.
Jeder Eintrag in dieser Dateitypenliste ist zweigeteilt. Zum einen wird die Beschreibung angezeigt und zum anderen wird die Filterung der Dateien im Control entsprechend der Dateiendung gesteuert. Alle Einträge in dieser Eigenschaft müssen durch das Pipe-Symbol | (ASCII 124) voneinander getrennt werden.
Beispiele:

<table border="0" cellpadding="3" cellspacing="1" class="tabletext"><tr><td class="tablehead1"><span class="tabletext">Beschreibender Teil</span></td><td class="tablehead2"><span class="tabletext">Filtertyp</span></td><td class="tablehead3"><span class="tabletext">Eigenschaftswert</span></td></tr><tr><td class="tabletext1">Textdateien (*.txt)</td><td class="tabletext2">*.txt</td><td class="tabletext3">Textdateien (*.txt)|*.txt</td></tr><tr><td class="tabletext1">Grafiken (*.bmp;*.ico)</td><td class="tabletext2">*.bmp;*.ico</td><td class="tabletext3">Grafiken (*.bmp;*.ico)|*.bmp;*.ico</td></tr></table>

Stehen mehrere Dateitypen zur Auswahl, so sind diese Dateiendungen jeweils durch ein Semikolon voneinander zu trennen.

Diese Filter lassen sich auch entsprechend kombinieren:

Textdateien (*.txt)|*.txt| Grafiken (*.bmp;*.ico)|*.bmp;*.ico

Die FilterIndex-Eigenschaft wiederum bestimmt, welcher Eintrag in der Dateitypenliste beim Öffnen des Dialogs voreingestellt sein soll. Dabei ist zu beachten, dass der erste Listeneintrag den Index 1 besitzt! Wird der Filter „Textdateien (*.txt)|*.txt| Grafiken (*.bmp;*.ico)|*.bmp;*.ico
„ mit dem FilterIndex = 2 eingesetzt, so wird der Dialog beim Öffnen Grafiken vom Tap *.bmp bzw. *.ico anzeigen.

Die Eigenschaft Flags

Mit dieser Eigenschaft kann das Verhalten des Dialogs beeinflusst werden. Dazu steht eine Reihe von Konstanten zur Verfügung, welche in Kombination miteinander angewendet werden können:

<TABLE border="0" cellpadding="3" cellspacing="1" class="tabletext"><tr><td class="tablehead1"><strong><span class="tabletext">Konstantenname</span></strong></td><td width="10%" class="tablehead2"><strong><span class="tabletext">Flags-Wert</span></strong></td><td class="tablehead3"><strong><span class="tabletext">Beschreibung</span></strong></td></tr><tr><td class="tabletext1">cdlOFNAllowMultiselect</td><td class="tabletext2">&H200 </td><td class="tabletext3">Ermöglicht, dass im Listenfeld Dateiname mehrere Dateien ausgewählt werden. Die FileName-Eigenschaft gibt einen String zurück, der alle ausgewählten Dateinamen enthält (die Namen sind im String durch Leerzeichen voneinander getrennt).</td></tr><tr><td class="tabletext1">cdlOFNCreatePrompt</td><td class="tabletext2">&H2000 </td><td class="tabletext3">Fragt den Benutzer, ob eine Datei angelegt werden soll, die noch nicht existiert. Dieses Flag setzt automatisch die Flags cdlOFNPathMustExist und cldOFNFileMustExist.</td></tr><tr><td class="tabletext1">cdlOFNExplorer</td><td class="tabletext2">&H80000 </td><td class="tabletext3">Verwendet das dem Explorer ähnliche Dialogfeld zum Öffnen von Dateien.</td></tr><tr><td class="tabletext1">cdlOFNExtensionDifferent</td><td class="tabletext2">&H400 </td><td class="tabletext3">Weist darauf hin, dass sich die Dateinamenerweiterung des zurückgegebenen Dateinamens von der in der DefaultExt-Eigenschaft angegebenen Erweiterung unterscheidet. Dieses Flag wird nicht gesetzt, wenn die DefaultExt-Eigenschaft Null enthält, wenn die Erweiterungen übereinstimmen, oder wenn die Datei keine Erweiterung hat. Man kann den Wert dieses Flags überprüfen, nachdem das Dialogfeld geschlossen wurde.</td></tr><tr><td class="tabletext1">cdlOFNFileMustExist</td><td class="tabletext2">&H1000 </td><td class="tabletext3">Die Benutzer dürfen nur Dateinamen eingeben, die existieren. Wenn dieses Flag gesetzt ist und der Benutzer gibt einen ungültigen Dateinamen ein, wird eine Warnung angezeigt. Dieses Flag setzt automatisch das Flag cdlOFNPathMustExist.</td></tr><tr><td class="tabletext1">cdlOFNHelpButton</td><td class="tabletext2">&H10 </td><td class="tabletext3">Zeigt die Hilfe-Schaltfläche für das Dialogfeld an.</td></tr><tr><td class="tabletext1">cdlOFNHideReadOnly</td><td class="tabletext2">&H4 </td><td class="tabletext3">Verbirgt das Kontrollkästchen Mit Schreibschutz öffnen.</td></tr><tr><td class="tabletext1">cdlOFNLongNames</td><td class="tabletext2">&H200000 </td><td class="tabletext3">Erlaubt lange Dateinamen.</td></tr><tr><td class="tabletext1">cdlOFNNoChangeDir</td><td class="tabletext2">&H8 </td><td class="tabletext3">Zwingt das Dialogfeld, das aktuelle Verzeichnis so zu setzen, wie es beim Öffnen des Dialogfelds gesetzt war.</td></tr><tr><td class="tabletext1">cdlOFNNoDereferenceLinks</td><td class="tabletext2">&H100000 </td><td class="tabletext3">Verbietet die Dereferenzierung von Shell-Links (auch als Shortcuts bezeichnet). Standardmäßig bewirkt die Auswahl eines Shell-Links, dass dieser von der Shell dereferenziert wird.</td></tr><tr><td class="tabletext1">cdlOFNNoLongNames</td><td class="tabletext2">&H40000 </td><td class="tabletext3">Verbietet lange Dateinamen.</td></tr><tr><td class="tabletext1">cdlOFNNoReadOnlyReturn</td><td class="tabletext2">&H8000 </td><td class="tabletext3">Spezifiziert, dass die zurückgegebene Datei das Attribut Read-Only nicht gesetzt hat und sich nicht in einem schreibgeschützten Verzeichnis befindet.</td></tr><tr><td class="tabletext1">cdlOFNNoValidate</td><td class="tabletext2">&H100 </td><td class="tabletext3">Erlaubt ungültige Zeichen im zurückgegebenen Dateinamen.</td></tr><tr><td class="tabletext1">cdlOFNOverwritePrompt</td><td class="tabletext2">&H2 </td><td class="tabletext3">Bewirkt, dass das Dialogfeld Speichern unter eine Warnung erzeugt, wenn der angegebene Dateiname bereits existiert. (Die Benutzer können dann wählen, ob die Datei überschrieben werden soll.)</td></tr><tr><td class="tabletext1">cdlOFNPathMustExist</td><td class="tabletext2">&H800 </td><td class="tabletext3">Die Benutzer dürfen nur gültige Pfade eingeben. Wenn dieses Flag gesetzt ist und die Benutzer einen ungültigen Pfad eingeben, erscheint eine Warnung.</td></tr><tr><td class="tabletext1">cdlOFNReadOnly</td><td class="tabletext2">&H1 </td><td class="tabletext3">Markiert das Kontrollkästchen Mit Schreibschutz öffnen, wenn das Dialogfeld erzeugt wird. Dieses Flag gibt außerdem den Status des Kontrollkästchens Mit Schreibschutz öffnen nach dem Schließen des Dialogfelds an.</td></tr><tr><td class="tabletext1">cdlOFNShareAware</td><td class="tabletext2">&H4000 </td><td class="tabletext3">Zeigt an, dass mögliche Freigabe-Fehler ignoriert werden.</td></tr></TABLE>

Die Verknüfpung von mehreren Flags erfolgt mittels des Or-Operators:

Flags = cdlOFNAllowMultiselect Or cdlOFNFileMustExist

Die Eigenschaft InitDir

Mit dieser Eigenschaft kann man das Standardverzeichnis vorbelegen, den das Control zur Anzeige der Dateien benutzen soll. Ohne diese Vorbelegung wird der gerade aktuelle Ordner benutzt.

Die Eigenschaft MaxFileSize

Mit dieser Eigenschaft kann man die maximale Stringgröße für die FileName -Eigenschaft bestimmen. Standardmäßig werden 256 Bytes reserviert, was der maximalen Pfadlänge entspricht. Wenn jedoch das Flag cdlOFNAllowMultiselect gesetzt und entsprechend viele Dateien ausgewählt, so reichen diese 256 Bytes unter Umständen nicht mehr aus. Dieser Wert kann zwischen 1 und 32 KB liegen (32 KB = 32.768 Bytes = 128 Pfadmaximallängen).

Aufrufbeispiel des Öffnen-Dialogs:

<div><link href="http://www.ms-office-forum.de/ubb/codeconv.css" rel="stylesheet"><pre><span class="TOKEN">Function</span> Dateiauswahl() <span class="TOKEN">As</span> <span class="TOKEN">String</span>
&nbsp;
<span class="TOKEN">On Error GoTo</span> Dlg_Error
<span class="TOKEN">With</span> CommonDialog1
<span class="REM"> '// Beim Abbruch Laufzeitfehler erzeugen</span>
.CancelError = <span class="TOKEN">True</span>
<span class="REM"> '// Standard-Dialogtitel &uuml;berschreiben</span>
.DialogTitle = &quot;Bitte w&auml;hlen Sie eine Datei aus:&quot;
<span class="REM"> '// Auswahlfilter bestimmen</span>
.Filter = &quot;Alle Dateien (*.*)|*.*|&quot; &amp; _
&quot;Microsoft <span class="TOKEN">Access</span> Datenbank (*.mdb)|*.mdb|&quot; &amp; _
&quot;Webseiten (*.htm;*.html)|*.htm;*.html&quot;
<span class="REM"> '// Zweiten Listeneintrag vorbelegen</span>
.FilterIndex = 2
<span class="REM"> '// Flags setzen</span>
.Flags = cdlOFNAllowMultiselect <span class="TOKEN">Or</span> _
cdlOFNFileMustExist <span class="TOKEN">Or</span> _
cdlOFNExplorer
<span class="REM"> '// Dilalog aufrufen</span>
.ShowOpen
<span class="REM"> '// Ergebnisse ausgeben</span>
Dateiauswahl = .FileName
<span class="TOKEN">End</span> <span class="TOKEN">With</span>
<span class="TOKEN">Exit Function</span>
&nbsp;
Dlg_Error:
<span class="TOKEN">If</span> Err.Number = cdlCancel <span class="TOKEN">Then</span> <span class="REM">'32755 (&amp;H7FF3)</span>
MsgBox &quot;Abbruch wurde gew&auml;hlt!&quot;
Else: MsgBox &quot;Fehler #&quot; &amp; Err.Number &amp; &quot;: &quot; &amp; Err.Description
<span class="TOKEN">End</span> <span class="TOKEN">If</span>
&nbsp;
<span class="TOKEN">End</span> <span class="TOKEN">Function</span>
&nbsp;
<span class="TOKEN">Sub</span> Beispiel()
&nbsp;
<span class="TOKEN">Dim</span> sFilepath <span class="TOKEN">As</span> <span class="TOKEN">String</span>
sFilepath = Dateiauswahl()
<span class="TOKEN">If</span> Len(sFilepath) <span class="TOKEN">Then</span>
MsgBox &quot;Dateiauswahl: &quot; &amp; sFilepath, vbInformation
<span class="TOKEN">End</span> <span class="TOKEN">If</span>
&nbsp;
<span class="TOKEN">End</span> <span class="TOKEN">Sub</span></pre></div>
Code eingefügt mit dem MOF Code Converter (http://www.ms-office-forum.net/forum/codeconverter.php)

Lösung 2: Nutzung des Win32-API

Die Lösung mittels Win32-API ähnelt in vielen Dingen der ActiveX-Lösung.

Statt dem Control wird hier mit einer entsprechenden Struktur gearbeitet, in deren Elemente die verschiedenen Einstellungen vorgenommen werden.

Type OPENFILENAME
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nStructSize&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;As Long&nbsp;&nbsp;&nbsp;&nbsp;Länge der Struktur in Bytes
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hwndOwner&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;As Long&nbsp;&nbsp;&nbsp;&nbsp;Windows-Handle des “Besitzerfensters”
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hInstance&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;As Long&nbsp;&nbsp;&nbsp;&nbsp;für VB/A uninteressant
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sFilter&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;As String&nbsp;&nbsp;s.o. die Eigenschaft Filter
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sCustomFilter&nbsp;&nbsp;&nbsp;As String&nbsp;&nbsp;für VB/A uninteressant
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nCustFilterSize&nbsp;As Long&nbsp;&nbsp;&nbsp;&nbsp;für VB/A uninteressant
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nFilterIndex&nbsp;&nbsp;&nbsp;&nbsp;As Long&nbsp;&nbsp;&nbsp;&nbsp;s.o. die Eigenschaft FilterIndex
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sFile&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;As String&nbsp;&nbsp;s.o. die Eigenschaft FileName
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nFileSize&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;As Long&nbsp;&nbsp;&nbsp;&nbsp;s.o. die Eigenschaft MaxFileSize
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sFileTitle&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;As String&nbsp;&nbsp;s.o. die Eigenschaft FileTitle
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nTitleSize&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;As Long&nbsp;&nbsp;&nbsp;&nbsp;Länge des Buffers für sFileTitle
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sInitDir&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;As String&nbsp;&nbsp;s.o. die Eigenschaft InitDir
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sDlgTitle&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;As String&nbsp;&nbsp;s.o. die Eigenschaft DialogTitle
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Flags&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;As Long&nbsp;&nbsp;&nbsp;&nbsp;s.o. die Eigenschaft Flags
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nFileOffset&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;As Integer&nbsp;Offset des ersten Dateinamens bei Mehrfachauswahl
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nFileExt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;As Integer&nbsp;Offset des ersten Dateiendung bei Mehrfachauswahl
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sDefFileExt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;As String&nbsp;&nbsp;s.o. die Eigenschaft DefaultExt
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nCustData&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;As Long&nbsp;&nbsp;&nbsp;&nbsp;Message für Hook-Funktion des Dialogs
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fnHook&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;As Long&nbsp;&nbsp;&nbsp;&nbsp;Funktionsadresse einer Hook-Funktion
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sTemplateName&nbsp;&nbsp;&nbsp;As String&nbsp;&nbsp;für VB/A uninteressant
End Type

Beispiel für den API-Aufruf:

<div><link href="http://www.ms-office-forum.de/ubb/codeconv.css" rel="stylesheet"><pre><span class="TOKEN">Const</span> OFN_READONLY <span class="TOKEN">As</span> <span class="TOKEN">Long</span> = &amp;H1
<span class="TOKEN">Const</span> OFN_EXPLORER <span class="TOKEN">As</span> <span class="TOKEN">Long</span> = &amp;H80000
<span class="TOKEN">Const</span> OFN_LONGNAMES <span class="TOKEN">As</span> <span class="TOKEN">Long</span> = &amp;H200000
<span class="TOKEN">Const</span> OFN_CREATEPROMPT <span class="TOKEN">As</span> <span class="TOKEN">Long</span> = &amp;H2000
<span class="TOKEN">Const</span> OFN_NODEREFERENCELINKS <span class="TOKEN">As</span> <span class="TOKEN">Long</span> = &amp;H100000
<span class="TOKEN">Const</span> OFN_OVERWRITEPROMPT <span class="TOKEN">As</span> <span class="TOKEN">Long</span> = &amp;H2
<span class="TOKEN">Const</span> OFN_HIDEREADONLY <span class="TOKEN">As</span> <span class="TOKEN">Long</span> = &amp;H4
<span class="TOKEN">Const</span> OFS_FILE_OPEN_FLAGS <span class="TOKEN">As</span> <span class="TOKEN">Long</span> = OFN_EXPLORER _
<span class="TOKEN">Or</span> OFN_LONGNAMES _
<span class="TOKEN">Or</span> OFN_CREATEPROMPT _
<span class="TOKEN">Or</span> OFN_NODEREFERENCELINKS
<span class="TOKEN">Const</span> OFS_FILE_SAVE_FLAGS <span class="TOKEN">As</span> <span class="TOKEN">Long</span> = OFN_EXPLORER _
<span class="TOKEN">Or</span> OFN_LONGNAMES _
<span class="TOKEN">Or</span> OFN_OVERWRITEPROMPT _
<span class="TOKEN">Or</span> OFN_HIDEREADONLY
<span class="TOKEN">Type</span> OPENFILENAME
nStructSize <span class="TOKEN">As</span> <span class="TOKEN">Long</span>
hwndOwner <span class="TOKEN">As</span> <span class="TOKEN">Long</span>
hInstance <span class="TOKEN">As</span> <span class="TOKEN">Long</span>
sFilter <span class="TOKEN">As</span> <span class="TOKEN">String</span>
sCustomFilter <span class="TOKEN">As</span> <span class="TOKEN">String</span>
nCustFilterSize <span class="TOKEN">As</span> <span class="TOKEN">Long</span>
nFilterIndex <span class="TOKEN">As</span> <span class="TOKEN">Long</span>
sFile <span class="TOKEN">As</span> <span class="TOKEN">String</span>
nFileSize <span class="TOKEN">As</span> <span class="TOKEN">Long</span>
sFileTitle <span class="TOKEN">As</span> <span class="TOKEN">String</span>
nTitleSize <span class="TOKEN">As</span> <span class="TOKEN">Long</span>
sInitDir <span class="TOKEN">As</span> <span class="TOKEN">String</span>
sDlgTitle <span class="TOKEN">As</span> <span class="TOKEN">String</span>
Flags <span class="TOKEN">As</span> <span class="TOKEN">Long</span>
nFileOffset <span class="TOKEN">As</span> <span class="TOKEN">Integer</span>
nFileExt <span class="TOKEN">As</span> <span class="TOKEN">Integer</span>
sDefFileExt <span class="TOKEN">As</span> <span class="TOKEN">String</span>
nCustData <span class="TOKEN">As</span> <span class="TOKEN">Long</span>
fnHook <span class="TOKEN">As</span> <span class="TOKEN">Long</span>
sTemplateName <span class="TOKEN">As</span> <span class="TOKEN">String</span>
<span class="TOKEN">End</span> <span class="TOKEN">Type</span>
&nbsp;
<span class="TOKEN">Declare</span> <span class="TOKEN">Function</span> GetActiveWindow <span class="TOKEN">Lib</span> &quot;user32.dll&quot; () <span class="TOKEN">As</span> <span class="TOKEN">Long</span>
<span class="TOKEN">Declare</span> <span class="TOKEN">Function</span> GetOpenFileName <span class="TOKEN">Lib</span> &quot;comdlg32.dll&quot; <span class="TOKEN">Alias</span> _
&quot;GetOpenFileNameA&quot; _
(pOpenfilename <span class="TOKEN">As</span> OPENFILENAME) <span class="TOKEN">As</span> <span class="TOKEN">Long</span>
<span class="TOKEN">Declare</span> <span class="TOKEN">Function</span> GetSaveFileName <span class="TOKEN">Lib</span> &quot;comdlg32.dll&quot; <span class="TOKEN">Alias</span> _
&quot;GetSaveFileNameA&quot; _
(pOpenfilename <span class="TOKEN">As</span> OPENFILENAME) <span class="TOKEN">As</span> <span class="TOKEN">Long</span>
<span class="TOKEN">Declare</span> <span class="TOKEN">Function</span> GetShortPathName <span class="TOKEN">Lib</span> &quot;kernel32.dll&quot; <span class="TOKEN">Alias</span> _
&quot;GetShortPathNameA&quot; _
(<span class="TOKEN">ByVal</span> lpszLongPath <span class="TOKEN">As</span> String, _
<span class="TOKEN">ByVal</span> lpszShortPath <span class="TOKEN">As</span> String, _
<span class="TOKEN">ByVal</span> cchBuffer <span class="TOKEN">As</span> <span class="TOKEN">Long</span>) <span class="TOKEN">As</span> <span class="TOKEN">Long</span>
&nbsp;
<span class="TOKEN">Function</span> Dateiauswahl() <span class="TOKEN">As</span> <span class="TOKEN">String</span>
&nbsp;
<span class="TOKEN">Dim</span> sFilter <span class="TOKEN">As</span> <span class="TOKEN">String</span>
<span class="REM">'// --------------------------------------------------------------------------</span>
<span class="REM">'// Strukturvariable vom Typ OPENFILENAME erzeugen</span>
<span class="REM">'// --------------------------------------------------------------------------</span>
<span class="TOKEN">Dim</span> uOFN <span class="TOKEN">As</span> OPENFILENAME
<span class="REM">'// --------------------------------------------------------------------------</span>
<span class="REM">'// Strukturgr&ouml;&szlig;e und Elternfenster setzen</span>
<span class="REM">'// --------------------------------------------------------------------------</span>
uOFN.nStructSize = Len(uOFN)
uOFN.hwndOwner = GetActiveWindow()
<span class="REM">'// --------------------------------------------------------------------------</span>
<span class="REM">'// Filter setzen und Index auf 2 (Datenbanken) setzen</span>
<span class="REM">'// Format: &quot;Name&quot; \n &quot;Ext.&quot; \n &quot;Name&quot; \n &quot;Ext.&quot; ... \n\n</span>
<span class="REM">'// --------------------------------------------------------------------------</span>
sFilter = &quot;Alle Dateien (*.*)&quot; &amp; vbNullChar &amp; &quot;*.*&quot; &amp; vbNullChar &amp; _
&quot;MS <span class="TOKEN">Access</span> Datenbank (*.mdb)&quot; &amp; vbNullChar &amp; &quot;*.mdb&quot; &amp; vbNullChar &amp; _
&quot;Webseiten (*.htm;*.html)&quot; &amp; vbNullChar &amp; &quot;*.htm;*.html&quot;
sFilter = sFilter &amp; vbNullChar &amp; vbNullChar
&nbsp;
uOFN.sFilter = sFilter
uOFN.nFilterIndex = 2
<span class="REM">'// --------------------------------------------------------------------------</span>
<span class="REM">'// Dialogtitel setzen</span>
<span class="REM">'// --------------------------------------------------------------------------</span>
uOFN.sDlgTitle = &quot;Bitte w&auml;hlen Sie eine Datei aus:&quot;
<span class="REM">'// --------------------------------------------------------------------------</span>
<span class="REM">'// Flags setzen</span>
<span class="REM">'// --------------------------------------------------------------------------</span>
uOFN.Flags = OFS_FILE_OPEN_FLAGS
<span class="REM">'// --------------------------------------------------------------------------</span>
<span class="REM">'// Speicher f&uuml;r sFile und sFileTitle reservieren</span>
<span class="REM">'// --------------------------------------------------------------------------</span>
uOFN.sFile = Space$(256) &amp; vbNullChar
uOFN.nFileSize = Len(uOFN.sFile)
uOFN.sFileTitle = Space$(256) &amp; vbNullChar
uOFN.nTitleSize = Len(uOFN.sFileTitle)
<span class="REM">'// --------------------------------------------------------------------------</span>
<span class="REM">'// Funktion aufrufen und auswerten</span>
<span class="REM">'// --------------------------------------------------------------------------</span>
<span class="TOKEN">If</span> GetOpenFileName(uOFN) <span class="TOKEN">Then</span>
Dateiauswahl = Left(uOFN.sFile, InStr(uOFN.sFile, vbNullChar) - 1)
<span class="TOKEN">Else</span>
MsgBox &quot;Es wurde Abbruch gew&auml;hlt!&quot;, vbInformation
<span class="TOKEN">End</span> <span class="TOKEN">If</span>
&nbsp;
<span class="TOKEN">End</span> <span class="TOKEN">Function</span>
&nbsp;
<span class="TOKEN">Sub</span> Beispiel()
&nbsp;
<span class="TOKEN">Dim</span> sFilepath <span class="TOKEN">As</span> <span class="TOKEN">String</span>
sFilepath = Dateiauswahl()
<span class="TOKEN">If</span> Len(sFilepath) <span class="TOKEN">Then</span>
MsgBox &quot;Dateiauswahl: &quot; &amp; sFilepath, vbInformation
<span class="TOKEN">End</span> <span class="TOKEN">If</span>
&nbsp;
<span class="TOKEN">End</span> <span class="TOKEN">Sub</span></pre></div>
Code eingefügt mit dem MOF Code Converter (http://www.ms-office-forum.net/forum/codeconverter.php)

stpimi
16.01.2004, 06:49
Für Benutzer mit EXCEL (dürften ziemlich genau 100% der Anwender sein) läßt sich das ganze stark vereinfacht realisieren, weil die Kollegen von Microsoft so nett waren, die Windows-API-Variante in einer Methode des Objektes Excel.Application zu verpacken:

Verweis auf die Objektbibliothek von Excel setzen
Stringvariable definieren
Stringvariable = Excel.Application.GetOpenFilename (Parameter)


GetOpenFilename-Methode


Zeigt das Standarddialogfeld Öffnen an und bekommt einen Dateinamen vom Benutzer, ohne jedoch irgendwelche Dateien zu öffnen.

Syntax

Ausdruck.GetOpenFilename(FileFilter, FilterIndex, Title, ButtonText, MultiSelect)

Ausdruck Erforderlich. Ein Ausdruck, der ein Application-Objekt zurückgibt.

FileFilter Variant optional. Eine Zeichenfolge, die die Dateifilterkriterien angibt.

Diese Zeichenfolge besteht aus Zeichenfolgepaaren für den Dateifilter, gefolgt von einer MS-DOS-Platzhalterspezifikation für den Dateifilter, wobei jeder Teil und jedes Paar durch Kommas getrennt sind. Jedes einzelne Paar wird im Dropdownlistenfeld Dateityp angezeigt. Die folgende Zeichenfolge gibt beispielsweise die beiden Dateifilter Text und Add-In an: "Textdateien (*.txt), *.txt, Add-In-Dateien (*.xla), *.xla".

Um mehrere MS-DOS-Platzhalterausdrücke für einen einzelnen Dateifiltertyp anzugeben, trennen Sie die Platzhalterausdrücke mit Semikola. Beispiel: "Visual Basic-Dateien (*.bas; *.txt),*.bas;*.txt".

Wird dieses Argument ausgelassen, wird der Standardwert "Alle Dateien (*.*),*.*" verwendet.

FilterIndex Variant optional. Gibt die Indexnummer der Standarddatei-Filterkriterien an, von 1 bis zu der Anzahl der in FileFilter angegebenen Filter. Wird dieses Argument ausgelassen oder ist es größer als die Anzahl der vorhandenen Filter, wird der erste Dateifilter verwendet.

Title Variant optional. Gibt den Titel des Dialogfelds an. Wird dieses Argument ausgelassen, wird der Titel "Öffnen" verwendet.

ButtonText Variant optional. Nur bei Macintosh.

MultiSelect Variant optional. True, damit mehrere Dateinamen ausgewählt werden können. False, damit nur ein Dateiname ausgewählt werden kann. Der Standardwert ist False



Anmerkungen

Diese Methode gibt den ausgewählten Dateinamen oder den vom Benutzer eingegebenen Namen zurück. Der zurückgegebene Name kann eine Pfadangabe enthalten. Ist MultiSelect auf True eingestellt, bildet der Rückgabewert eine Matrix der ausgewählten Dateinamen (auch wenn lediglich ein Dateiname ausgewählt wurde). Gibt False zurück, wenn der Benutzer das Dialogfeld mit Abbrechen verlässt.

Diese Methode kann unter Umständen das aktuelle Laufwerk oder den aktuellen Ordner ändern.


Mfg, Michael

joergh71
18.10.2005, 11:29
Hallo,
ich habe den Dateiauswahldialog bisher fast genau so in einem Access-Modul benutzt.
Bei den Betriebssystemen MS 95 und 98 funktionierte das bisher auch tadellos.
Bei Windows XP wird aber der Dateiauswahldialog nicht geöffnet.
Wer kann mir da weiterhelfen?

Danke,
Jörg

elchvonoslo
28.06.2006, 07:04
Hei,
ich würde gern eine Datei in VB.NET über einen Auswahldialog in eine Variable speichern. Mit folgendem Code glaube ich schon ganz nah dran zu sein:

Function Dateiauswahl() As String

On Error GoTo Dlg_Error
With CommonDialog1
'// Beim Abbruch Laufzeitfehler erzeugen
.CancelError = True
'// Standard-Dialogtitel überschreiben
.DialogTitle = "Bitte wählen Sie eine Datei aus:"
'// Auswahlfilter bestimmen
.Filter = "Alle Dateien (*.*)|*.*|" & _
"Microsoft Access Datenbank (*.mdb)|*.mdb|" & _
"Webseiten (*.htm;*.html)|*.htm;*.html"
'// Zweiten Listeneintrag vorbelegen
.FilterIndex = 2
'// Flags setzen
.Flags = cdlOFNAllowMultiselect Or _
cdlOFNFileMustExist Or _
cdlOFNExplorer
'// Dilalog aufrufen
.ShowOpen
'// Ergebnisse ausgeben
Dateiauswahl = .FileName
End With
Exit Function

Dlg_Error:
If Err.Number = cdlCancel Then '32755 (&H7FF3)
MsgBox "Abbruch wurde gewählt!"
Else: MsgBox "Fehler #" & Err.Number & ": " & Err.Description
End If

End Function

Sub Beispiel()

Dim sFilepath As String
sFilepath = Dateiauswahl()
If Len(sFilepath) Then
MsgBox "Dateiauswahl: " & sFilepath, vbInformation
End If

End Sub

Nur meckert mein Debugger nun dass "CommonDialog1" nicht deklariert sei.
Welchen Typ muss "CommonDialog1" zugewiesen bekommen?
CommonDialog ist es nicht.
Wie muss ich meinem VB.NET Projekt beibringen, dass es Microsoft Common Dialog Control mit einbinden soll?
Hierüber funktioniert es bei VB.Net nicht, da es den entsprechenden Unterpunkt im Menü Projekte nicht gibt:
"Visual Basic: im Menü Projekt den Punkt Komponenten auswählen. In der daraufhin erscheinenden Liste Microsoft Common Dialog Control durch Aktivierung des Kontrollkästchens auswählen."

Danke!

PS: Ich bin blutiger Anfänger! ;)

mech
13.08.2006, 13:10
"Dateiauswahldialog" funktioniert beim mir leider auch nicht,
weil ja das entspr. ActiveX-Controls (Comdlg32.ocx) angeblich
nicht gefunden und somit nicht eingebunden wird.

Ich setze auf: Access 2003 bzw. Windows 2000.