vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#

https://www.vbarchiv.net
Rubrik: Dialoge/Dateien   |   VB-Versionen: VB5, VB615.03.01
Mit VB die Windows-Standarddialoge nutzen

Der gewohnte Windows-Dateidialog zum Auswählen oder Speichern einer Datei: In Visual Basic gibt es leider keinen eigenen Befehl, um dieses wichtige Programm-Element aufzurufen. Mit einer Win-API-Funktion können Sie diesen Dialog dennoch nutzen.

Autor:  Ingo SteinhausBewertung:  Views:  22.670 

Der gewohnte Windows-Dateidialog zum Auswählen oder Speichern einer Datei: In Visual Basic gibt es leider keinen eigenen Befehl, um dieses wichtige Programm-Element aufzurufen. Mit einer Win-API-Funktion können Sie diesen Dialog dennoch nutzen.

Windows-Standarddialoge
Typisch Windows: Die Standarddialoge zum Öffnen und Sichern von Dateien.
Machen Sie's wie Windows

Es ist ein Rätsel, warum es Microsoft versäumt hat, einen einfachen Befehl in visual Basic (VB) und Visual Basic for Applications (VBA) einzubauen, um eine Datei auszuwählen. Denn diese Funktion ist so elementar, dass kaum ein ernsthafter Programmierer darauf verzichten kann.

Da man in VB/VBA jedoch die Funktionen der Windows-API nutzen kann, bedient sich der schlaue Entwickler einfach hier.

Die Grundlagen zu diesen Funktionen, die Windows zur Verfügung stellt, können sie im Workshop WinAPI-Funtkionen in VB nutzen nachlesen.

Die benötigten API-Funktionen

Mit Hilfe von zwei relativ einfachen API-Funktionen können Sie die typischen Dialoge zum Speichern oder Öffnen von Dateien aufrufen. Er wird auch als Standarddialog bezeichnet:

Declare Function GetSaveFileName Lib "comdlg32" _
  Alias "GetSaveFileNameA" ( _
  lpOpenfilename As OpenFilename) As Long
 
Declare Function GetOpenFileName Lib "comdlg32" _
  Alias "GetOpenFileNameA" ( _
  lpOpenfilename As OpenFilename) As Long

Wenn der Anwender im Dialogfeld einen Dateinamen eingibt oder auswählt und auf "OK" klickt, ist der Rückgabewert der Funktionen ungleich Null. Die übergebene Datenstruktur OpenFilename enthält dann den ausgewählten Dateinamen mit Laufwerksbuchstaben und Pfadangabe.

Wenn der Anwender auf "Abbrechen" klickt oder ein Fehler passiert, ist der Rückgabewert Null. Um einen eventuell aufgetretenen Fehler genauer zu analysieren, können Sie seine Fehlernummer anschließend mit CommDlgExtendedError aufrufen.

Die Datenstruktur OpenFilename

Auf den ersten Blick scheinen diese Funktionen nicht besonders problematisch zu sein. Doch die Schwierigkeiten verbergen sich in der Datenstruktur OpenFilename, die Sie ebenfalls deklarieren müssen. Sie sieht folgendermaßen aus:

Type OpenFilename
  lStructSize As Long
  hWndOwner As Long
  hInstance As Long
  lpstrFilter As String
  lpstrCustomFilter As String
  nMaxCustFilter As Long
  nFilterIndex As Long
  lpstrFile As String
  nMaxFile As Long
  lpstrFileTitle As String
  nMaxFileTitle As Long
  lpstrInitialDir As String
  lpstrTitle As String
  Flags As Long
  nFileOffset As Integer
  nFileExtension As Integer
  lpstrDefExt As String
  lCustData As Long
  lpfnHook As Long
  lpTemplateName As String
End Type

Glücklicherweise können Sie einen Teil der Felder dieser Struktur ignorieren. Wichtig für ein korrektes Funktionieren der Dialoge sind allein die Felder lStructSize, hWndOwner, lpstrFilter, lpstrFile, nMaxFile, lpstrFileTitle, nMaxFileTitle, lpstrInitialDir, lpstrTitle, Flags und lpstrDefExt.

lStructSize: Die Größe der Datenstruktur. Sie ist wichtig, damit es nicht zu Problemen bei der Belegung des Speichers kommt. Sie bestimmten sie mit Len(OpenFilenameVar).

hWndOwner: Das Handle des Besitzerfensters. Sie ermitteln es mit GetActiveWindow().

lpstrFilter: Der Dateifilter. Der Filter ist ein besonders entscheidendes Element der Datenstruktur. Damit ist ein Eintrag im Eingabefeld "Dateityp" des Dialogs gemeint. Diese Filterliste sorgt dafür, dass der Anwender verschiedenen Dateitypen wie Dokumente oder Vorlagen einstellen kann. Das Dialogfeld zeigt dann nur noch Dateien dieses Typs an.

Ein Filter besteht aus zwei Zeichenfolgen: Dem Anzeigestring, der in der Auswahlliste auftaucht und der zugehörigen Dateimaske. Ein Beispiel: Beim Anzeigestring "Word-Dokumente" enthält die Dateimaske den Eintrag "*.doc" enthalten. Als Maske sind alle in Windows gültigen Kombinationen von Jokerzeichen mit normalen Textzeichen wie "*.do?" oder "*.*" erlaubt.

Die Dateimaske kann auch mehrere Angaben enthalten, die durch Semikola getrennt werden. Ein Beispiel dafür wäre eine Maske zum Anzeigestring "Grafiken", die etwa die Dateitypen "*.bmp;*.jpg;*.jpeg" als Maske definieren könnte.

Jeder der beiden Strings eines Filters muss durch ein Null-Zeichen (Chr$(0)) abgeschlossen werden. lpstrFilter insgesamt kann aus beliebig vielen Paaren von Anzeigestrings und Dateimasken bestehen. Der gesamte Filter muss durch ein zusätzliches Null-Zeichen abgeschlossen werden, damit Windows das Ende des Filters korrekt erkennt. Ein Beispiel für die Angabe eines Filters mit VB/VBA:

"Dokumente (.doc)" & Chr$(0) & "*.doc" & Chr$(0) & _
  "Vorlagen (.dot)" & Chr$(0) & "*.dot" & Chr$(0) & Chr$(0)

Statt des etwas lästig zu schreibenden Ausdrucks Chr$(0) können Sie auch die vordefinierte Konstante vbNullChar benutzen.

lpstrFile: Dieses Feld der Datenstruktur enthält nach dem Aufruf des Dateidialogs das Laufwerk, den Pfad und den Namen der ausgewählten Datei. Das aufrufende Programm ist dafür verantwortlich, diesem Feld genügend Speicherplatz zuzuweisen. Das heißt: Sie müssen für lpstrFile vorher mit einem Aufruf von String$() ausreichend Speicher reservieren. Das folgende Beispiel stellt eine Zeichenkette von 700 Zeichen im Speicher bereit, die mit den Null-Zeichen (vbNullChar) gefüllt wird:

OpenFilenameVar.lpstrFile = String$(700, vbNullChar)

nMaxFile: Die Größe des reservierten Speichers. Sie müssen die Variable mit dem numerischen Wert belegen, den Sie für die Initialisierung von lpstrFile benutzt haben.

lpstrFileTitle: Dieses Feld enthält nach dem Aufruf des Dateidialogs den Dateinamen der ausgewählten Datei. Sie müssen dem Feld ebenso wie lpstrFile Speicher zuweisen.

nMaxFileTitle: Die Größe des reservierten Speichers. Sie müssen die Variable wie nMaxFile initialisieren, ihr also den Wert zuweisen, mit dem Sie lpstrFile initialisiert haben.

lpstrInitialDir: Die Pfadangabe, die beim Anzeigen des Dialogs als Vorgabeverzeichnis benutzt wird. Der Benutzer sieht dieses Verzeichnis im Dialog eingestellt.

lpstrTitle: Der Titel des Dateidialogs, der im Titelbalken angezeigt wird. Sie können hier je nach Art des Dialoges zum Beispiel "Öffnen" oder "Speichern unter" angeben.

Flags: Mit Hilfe dieses Feldes ändern Sie die Optik und die Verhaltensweise des Standarddialogs. Die einzelnen möglichen Werte für Flags werden im ausführlich kommentierten Listung genauer erklärt. Mit der folgenden Kombination

OFN_EXTENSIONDIFFERENT Or _
  OFN_NOCHANGEDIR Or _
  OFN_OVERWRITEPROMPT Or _
  OFN_HIDEREADONLY

lpstrDefExt: Dieses Feld enthält die Vorgabeerweiterung, die benutzt wird, wenn der Anwender einen Dateinamen ohne Erweiterung in das Feld "Dateiname" eingetragen hat. Dies ist besonders beim Speichern sinnvoll, da auf diese Weise die im Explorer nicht automatisch zu öffnenden Dateien ohne Erweiterung vermieden werden.

Standarddialoge und Netzwerk-Ressourcen
Mit dem Standarddialog können Sie auch Dateien im Netzwerk behandeln. In diesem Fall erhalten Sie einen vollständigen UNC-Pfad nach der "Universal Naming Convention". Dazu ein Beispiel: Sie haben im Dateidialog die Datei "Konzept.doc" im Verzeichnis "Eigene DateienKonzept.doc" in der Netzwerkressource "C" des Rechners "Computer5" markiert. Der entsprechende UNC-Pfad lautet:

\\Computer5\C\Eigene Dateien\Konzept.doc

Eine Mantelfunktion für den Aufruf der Standarddialoge

Der Aufruf eines Standarddialogs geschieht in drei Schritten:

  • Intialisieren des Datenstruktur Openfilename. Hier ist vor allem der Filter wichtig.
  • Aufrufen der Funktion GetOpenFilename (um eine Datei zu öffnen) oder GetSaveFilename (um eine Datei zu speichern) mit der initialisierten Datenstruktur.
  • Auslesen der Variablen lpstrFile, um Laufwerk, Pfad und Dateinamen zu ermitteln.
Diese Aufgabe lassen sich am besten in eine selbst geschriebene VB/VBA-Mantelfunktion auslagern, damit Sie nicht jedes Mal den gleichen Quelltext schreiben müssen. Diese Funktion benötigt bei einem Öffnen-Dialog lediglich zwei Argumente: Den Filter und das Vorgabeverzeichnis. Bei einem Speichern-Dialog kommt noch die Standarderweiterung hinzu. Die Funktion soll den Namen GetOpenName tragen. Dazu werden gleich einige funktionsinterne Variablen deklariert:

Function GetOpenName(ByVal Filter$, ByVal InitialDir$) As String
  Dim OFN As OpenFilename
  Dim Temp$
  Dim n As Integer

Im ersten Schritt initialisiert die Mantelfunktion die Datenstruktur OpenFilename. Besonders wichtig sind der Filter, der als Argument übergeben wurde, und die Reservierung von Speicherplatz für lpstrFile und lpstrFileTitle:

' Bestimmen der Optionen für den Dialog
 With OFN
   ' 'Die Länge der Datenstruktur angeben
   .lStructSize = Len(OFN)
   ' 'Den Besitzer mit GetActiveWindow() festlegen.
   .hWndOwner = GetActiveWindow()
   ' 'Den Filter zuweisen
   .lpstrFilter = Filter$
   ' 'Speicher reservieren
   .lpstrFile = String$(700, vbNullChar)
   ' 'Größe des reservierten Speichers angeben
   .nMaxFile = 700
   ' 'Speicher für den Dateinamen (ohne Pfad) reservieren.
   .lpstrFileTitle = String$(MAX_PATH, vbNullChar)
   ' 'Größe des reservierten Speichers angeben
   .nMaxFileTitle = MAX_PATH
   ' 'Das Vorgabeverzeichnis für den Dialog angeben
   .lpstrInitialDir = InitialDir$
   ' 'Den Titel des Dialogfeldes angeben
   .lpstrTitle = "Öffnen"
   ' 'Die Optionen bestimmen
   .Flags = OFN_EXTENSIONDIFFERENT Or OFN_NOCHANGEDIR Or _
     OFN_OVERWRITEPROMPT Or OFN_HIDEREADONLY
  End With

MAX_PATH ist eine Konstante, die an anderer Stelle im Modul definiert sein muss. Mit ihrer Hilfe wird die Länge einiger Zeichenketten festgelegt. Sie wird so definiert:

  Private Const MAX_PATH = 260

Im zweiten Schritt wird der Standarddialog mit der initialisierten Datenstruktur angezeigt. Ein Rückgabewert ungleich Null kann auch als True und ein Rückgabewert gleich Null als False interpretiert werden. Deshalb ist es möglich, die Funktion in einem If-Ausdruck zu benutzen, um im Falle eines Fehlers (Rückgabewert gleich Null) andere Aktionen auszuführen. Wenn der If-Ausdruck gleich True ist, kann lpstrFile ausgelesen werden:

  If GetOpenFileName(OFN) Then
  ' lpstrFile auslesen und zwischenspeichern
    Temp$ = OFN.lpstrFile

lpstrFile besteht aus dem kompletten Dateinamen inklusive Laufwerksbuchstabe und Pfad. Da der String mit Null-Zeichen initialisiert wurde, enthält er anschließend an den Dateinamen jede Menge überflüssige Bytes, die entfernt werden müssen.

    'Alles nach dem NULL-Zeichen verwerfen
    n = InStr(Temp$, vbNullChar)
    If n > 1 Then
      GetOpenName = Left$(Temp$, n - 1)
    Else

Wenn der String nur Null-Zeichen enthält, ist beim Aufruf etwas schief gegangen. Der Rückgabewert der Mantelfunktion wird dann auf einen leeren String gesetzt.

      GetOpenName = ""
    End If

Bei einer Rückgabe von False ist entweder ein Fehler passiert oder der Anwender hat auf "Abbrechen" geklickt. In diesem Fall wird der Rückgabewert ebenfalls auf einen leeren String gesetzt.

  Else
    GetOpenName = ""
  End If
End Function

Die Arbeit mit Filtern vereinfachen

Wenn Sie den Filter mit Hilfe von vbNullChar zusammensetzen, wird der Quelltext Ihres VB/VBA-Programms leicht etwas unübersichtlich. Mit Hilfe einer kleinen Zusatzfunktion können Sie sich die Arbeit erleichtern. Sie erlaubt es, einen Filter auf die folgende Weise anzugeben:

"Word Dokument (.doc)|*.doc|Word Vorlage (.dot)|*.dot|"

Dabei müssen Sie auf jeden Fall beachten, dass Sie jedes Element des Filters mit dem Zeichen "|" abschließen. Vergessen Sie also das letzte "|" nicht. Die Funktion ersetzt "|" durch Chr$(0) und fügt das abschließende Chr$(0) ein.

Private Function PrepareFilter(Flt$) As String
  Const O$ = "|"
  Dim Temp$
  Dim i As Integer

Die Funktion erzeugt eine Kopie des originalen Filter-Strings, bei der anstatt der "|"-Zeichen jeweils ein Null-Zeichen eingesetzt ist. Hierfür muss zunächst eine String-Variable den Filter übernehmen:

  'Mit einer Kopie arbeiten
  Temp$ = Flt$
  ' Beim ersten Zeichen beginnen
  i = 1

Jetzt wird es ernst: Die Funktion kopiert nun Flt$ schrittweise bis zum ersten "|"-Zeichen und ersetzt das Zeichen dabei durch vbNullChar. Das tut sie solange, bis alle "|"-Zeichen ersetzt sind:

  ' "|" gefunden?
  Do While InStr(i, Flt$, O$) <> 0
    ' Alles bis zum ersten "|" kopieren und Chr$(0) anhängen
    PrepareFilter = PrepareFilter + _
      Mid(Temp$, i, InStr(i, Temp$, O$) - i) + vbNullChar
    ' Index auf Zeichen nach "|" setzen
    i = InStr(i, Temp$, O$) + Len(O$)
  Loop

Zum Schluss wird an die bis jetzt erzeugte Zeichenkette noch ein eventuell vorkommender Rest und das abschließende Null-Zeichen angehängt. Dieses Verhalten sorgt für den Fall vor, dass Sie das letzte "|" vergessen. Das sollte aber im Grund genommen nicht vorkommen:

  'Evtl. Rest vom String und abschließendes Chr$(0) anhängen
  PrepareFilter = PrepareFilter + _
    Right(Temp$, Len(Temp$) - i + 1) + vbNullChar
End Function

Im Listing am Schluss dieses Artikels finden Sie übrigens eine Version von GetOpenName und GetSaveName, die Filter mit "|" anstatt eines Null-Zeichens verarbeitet.

Die Mantelfunktion GetOpenName aufrufen

Sie sollten den Quelltext des Listings in einem eigenen Modul in Ihr VB- oder VBA-Projekt einfügen. Er ist so geschrieben, dass alle internen Konstanten und Deklarationen als Private definiert sind. Dadurch werden Konflikte mit anderen Modulen vermieden. Die beiden Mantelfunktionen sind als Public gekennzeichnet und haben die folgende Syntax:

GetOpenName(ByVal Filter$, ByVal InitialDir$) As String
GetSaveName(ByVal Filter$, ByVal DefExt$, ByVal InitialDir$) _
  As String

Ein Beispielaufruf für GetOpenName könnte so aussehen:

Flt$ = "Word Dokument (.doc)|*.doc|Word Vorlage (.dot)|*.dot|"
FName$ = GetOpenName(Flt$, "C:\Eigene Dateien")

Ein Beispielaufruf für GetSaveName könnte so aussehen:

Flt$ = "Word Dokument (.doc)|*.doc|"
FName$ = GetSaveName(Flt$, "doc", "C:\Eigene Dateien")

Den vollständigen Text der Funktionen und notwenigen Konstanten finden Sie im folgenden auf dieser Seite.

' ###########################################
'
'                      MODUL "CommonDialog"
'
'                     © Ingo Steinhaus 2000
'                     ingo.steinhaus@gmx.de
'
'  Funktionen zur Anzeige der Windows-Standarddialoge "Öffnen"
'  und "Speichern"
'
'  Dieses Modul ist urheberrechtlich geschützte Freeware.
'  Die originale Copyright-Meldung darf nicht entfernt oder ver-
'  ändert werden. Der Quelltext darf nicht verändert werden-
'
'############################################
 
Private Const MAX_PATH = 260
 
' **********************************************************
Rem Die Datenstruktur "OpenFilename" dient der Konfiguration
Rem des Dialogs.
 
Private Type OpenFilename
  lStructSize As Long
  ' Größe der Datenstruktur. Kann mit Len() bestimmt werden.
  hWndOwner As Long
  ' Handle des Besitzers (mit GetActiveWindow() abfragen).
  hInstance As Long
  ' Handle der Dialogfeldvorlage, wenn OFN_ENABLETEMPLATEHANDLE
  ' in Flags gesetzt ist. Wenn OFN_EXPLORER gesetzt ist, wird
  'der Dialog vom Standardialog des Explorers abgeleitet.
  'Andernfalls wird ein Dialog im Windows-3.x-Stil erzeugt.
  lpstrFilter As String
  ' Ein VB-String mit paarweise angeordneten nullterminierten 
  'Strings. Der letzte nullterminierte String muß mit einem
  'weiteren NULL-Zeichen abgeschlossen werden.
  'Ein Filter besteht aus zwei nullterminierten Strings. Der
  'erste enthält die Zeichenkette, die im Kombifeld "DateiTyp"
  'angezeigt wird, der zweite die zugehörtigen Dateimasken wie
  'z.B. "*.doc".
  'Beispiel: "Word-Dokumente" + Chr$(0) + "*.doc" + Chr$(0)
  'Sie können mehrere Dateimasken durch Semikola abtrennen.
  'Beispiel:
  '"Grafiken" + Chr$(0) + "*.bmp;*.jpg;*.gif" + Chr$(0)
  lpstrCustomFilter As String
  ' Ein VB-String mit dem im Kombifeld "DateiTyp" ausgewählten
  'Filter.
  nMaxCustFilter As Long
  ' Die Größe von lpstrCustomFilter.
  nFilterIndex As Long
  ' Der 1-basierte Index des im Kombifeld "DateiTyp"
  'ausgewählten Filters.
  lpstrFile As String
  ' Ein VB-String mit dem ausgewählten Dateinamen inkl.
  'Laufwerk und Pfad.
  'Der String muß vorher in der entsprechenden Größe erzeugt
  'werden. Er kann vor dem Aufruf des Dialogs mit dem Namen
  'einer existierenden Datei belegt werden.
  nMaxFile As Long
  ' Die Größe von lpstrFile.
  lpstrFileTitle As String
  ' Ein VB-String mit dem ausgewählten Dateinamen ohne
  'Laufwerk und Pfad.
  nMaxFileTitle As Long
  ' Die Größe von lpstrFileTitle.
  lpstrInitialDir As String
  ' Ein VB-String mit dem Pfadnamen des Ordners, dessen Inhalt
  'der Dialog beim Anzeigen darstellen soll.
  lpstrTitle As String
  ' Ein VB-String mit Titel des Dialogfeldes.
  Flags As Long
  ' Flags, die die Anzeigeoptionen des Dialogfeldes bestimmen
  nFileOffset As Integer
  ' Index zum Beginn des ersten Dateinamens in lpstrFile.
  nFileExtension As Integer
  ' Index zum Beginn der Dateierweiterung in lpstrFile.
  lpstrDefExt As String
  ' Die Standarderweiterung, die an einen Dateinamen vergeben 
  'wird, wenn er keine Erweiterung besitzt.
  lCustData As Long
  ' Ein Zeiger auf anwendungsspezifiasche Daten, für die 
  'Rückruffunktion.
  lpfnHook As Long
  ' Adresse einer Rückruffunktion, die in der Anwendung
  'definiert wird. Sie können hier NULL eintragen.
  lpTemplateName As String
  ' Der Name der Dialogfeldvorlage (siehe hInstance)
End Type
 
' **********************************************************
Rem Die folgenden Konstanten sind die erlaubten Werte für
Rem OpenFilename->Flags.
 
Private Const OFN_ALLOWMULTISELECT = &H200
' Zeigt ein Dialogfeld mit der Möglichkeit, mehrere Dateien
'auszuwählen. In diesem Fall enthält lpstrFile den Pfad und 
'anschließend alle Dateinamen.
'nFileOffset zeigt auf den Index des ersten Dateinamens nach
'der Pfadangabe.
'lpstrFile enthält alle Dateinamen durch Chr$(0) getrennt.
'Am Ende folgt ein zweites Chr$(0). Bei alten Win-3.x-
'Dialoge) sind die Dateinamen durch Leerzeichen getrennt.
'Diese Variante kennt keine langen Dateinamen.
 
Private Const OFN_CREATEPROMPT = &H2000
' Zeigt eine Meldung, wenn die Datei nicht existiert und
'fragt den Anwender, ob sie erzeugt werden soll.
 
Private Const OFN_ENABLEHOOK = &H20
' Aktiviert die Rückruffunktion lpfnHook.
 
Private Const OFN_ENABLETEMPLATE = &H40
' Aktiviert die Dialogfeldvorlage.
 
Private Const OFN_ENABLETEMPLATEHANDLE = &H80
' Aktiviert die Dialogfeldvorlage.
 
Private Const OFN_EXPLORER = &H80000
' Nutzt Explorer-Dialoge. Diese Einstellung ist die Vorgabe, 
'selbst wenn Sie dieses Flag nicht angeben. Für alte
'Win-3.x-Dialoge müssen Sie das Flag löschen.
'Sie müssen es in den folgenden Fällen setzen:
'- bei OFN_ALLOWMULTISELECT.
'- wenn Sie Dialogfeldvorlagen und Rückruffunktionen benutzen.
 
Private Const OFN_EXTENSIONDIFFERENT = &H400&
' Gibt an, dass der Anwender einen Dateinamen mit einer
'anderen Erweiterung als lpstrDefExt eingeben kann.
 
Private Const OFN_FILEMUSTEXIST = &H1000
' Gibt an, dass der Anwender nur die Namen von existierenden
'Dateien eingeben kann. Andernfalls wird eine Warnmeldung
'ausgegeben.
'OFN_PATHMUSTEXIST muß ebenfalls gesetzt werden.
 
Private Const OFN_HIDEREADONLY = &H4&
' Versteckt das Kontrollkästchen "Nur lesen".
 
Private Const OFN_LONGNAMES = &H200000
' Aktiviert die Unterstützung von langen Dateinamen in den
'alten Win-3.x-Dialogen.
 
Private Const OFN_NOCHANGEDIR = &H8&
' Stellt das ursprüngliche Verzeichnis bei Ende des Dialoges
'wieder her, wenn der Anwender anderes Verzeichnis
'eingestellt hat.
 
Private Const OFN_NODEREFERENCELINKS = &H100000
' Weist das Dialogfeld an, bei einer markierten Verknüpfung
'Namen und Pfad der Verknüpungsdatei zurückzugeben, anstatt
'Namen und Pfad der Datei, auf die die Verknüpfung verweist.
 
Private Const OFN_NOLONGNAMES = &H40000
' Deaktiviert die Unterstützung von langen Dateinamen in den
'alten Win-3.x-Dialogen.
 
Private Const OFN_NONETWORKBUTTON = &H20000
' Versteckt die Schaltfläche "Netzwerk".
 
Private Const OFN_NOTESTFILECREATE = &H10000
' Gibt an, dass keine Testdatei erzeugt wird, bevor der
'Dialog endet. In diesem Fall überprüft das Dialogfeld nicht
'auf Schreibschutz, Platzmangel auf dem Datenträger oder
'korrekten Netzwerkzugriff.
 
Private Const OFN_OVERWRITEPROMPT = &H2&
' Gibt im Dialog "Speichern" eine Warnmeldung aus, wenn die
'Datei bereits existiert und durch das Speichern
'überschrieben wird.
 
Private Const OFN_PATHMUSTEXIST = &H800
' Gibt an, dass der Anwender nur die Namen von existierenden
'Verzeichnissen eingeben kann. Andernfalls wird eine
'Warnmeldung ausgegeben.
 
Private Const OFN_READONLY = &H1
' Gibt an, das das Kontrollkästchen "Nur Lesen" angekreuzt
'ist, wenn der Dialog angezeigt wird.
 
Private Const OFN_SHAREAWARE = &H4000
' Gibt an, dass die Funktion fehlschlägt, wenn ein
'Netzwerkfehler auftritt.
 
Private Const OFN_SHAREFALLTHROUGH = 2
Private Const OFN_SHAREWARN = 0
Private Const OFN_SHARENOWARN = 1
 
Private Const OFN_SHOWHELP = &H10
' Zeigt im Dialogfeld den Hilfe-Schalter an. hwndOwner muß auf
'ein Fenster zeigen, das die Hilfe anzeigen kann. Explorer-
'Dialoge senden die Nachricht CDN_HELP an die Rückruffunktion.
 
Private Const OFS_MAXPATHNAME = 128
 
' **********************************************************
Rem *** GetSaveFileName
Rem Funktion zum Anzeigen des Dialogs "Speichern"
 
Private Declare Function GetSaveFileName Lib "comdlg32" _
  Alias "GetSaveFileNameA" ( _
  lpOpenfilename As OpenFilename) As Long
 
' **********************************************************
Rem *** GetOpenFileName
Rem Funktion zum Anzeigen des Dialogs "Speichern"
 
Private Declare Function GetOpenFileName Lib "comdlg32" _
  Alias "GetOpenFileNameA" ( _
  lpOpenfilename As OpenFilename) As Long
 
' **********************************************************
Rem *** CommDlgExtendedError
Rem Funktion zum Ermitteln der Fehlernummer
 
Private Declare Function CommDlgExtendedError Lib "comdlg32" () As Integer
 
' **********************************************************
Rem *** GetActiveWindow
Rem Eine Funktion zum Ermitteln des Fenster-Handles.
 
Private Declare Function GetActiveWindow Lib "user32" () As Long
 
' **********************************************************
Rem *** PrepareFilter
Rem Eine Funktion zum Aufbereiten des Filters
Rem Beispielfilter:
Rem "Word Dokument (.doc)|*.doc|Word Vorlage (.dot)|*.dot|"
Rem Die Funktion ersetzt "|" durch Chr$(0) und fügt das
Rem abschließende Chr$(0) ein.
 
Private Function PrepareFilter(Flt$) As String
  Const O$ = "|"
  Dim Temp$
  Dim i As Integer
  ' Mit einer Kopie arbeiten
  Temp$ = Flt$
  ' Beim ersten Zeichen beginnen
  i = 1
  ' "|" gefunden?
  Do While InStr(i, Flt$, O$) <> 0
    ' Alles bis zum ersten "|" kopieren und Chr$(0) anhängen
    PrepareFilter = PrepareFilter + _
      Mid(Temp$, i, InStr(i, Temp$, O$) - i) + vbNullChar
    ' Index auf Zeichen nach "|" setzen
    i = InStr(i, Temp$, O$) + Len(O$)
  Loop
  ' Evtl. Rest vom String und abschließendes Chr$(0)anhängen
  PrepareFilter = PrepareFilter + _
    Right(Temp$, Len(Temp$) - i + 1) + vbNullChar
End Function
 
' **********************************************************
Rem *** GetSaveName
Rem Eine VB/VBA-Funktion als einfach zu nutzender Mantel für
Rem den Aufruf des Dialogs "Speichern".
 
Public Function GetSaveName(ByVal Filter$, ByVal DefExt$, _
  ByVal InitialDir$) As String
 
  Dim OFN As OpenFilename
  Dim Temp$
  Dim n As Integer
 
  ' Bestimmen der Optionen für den Dialog
  With OFN
    ' Größe der Struktur festlegen
    .lStructSize = Len(OFN)
    ' Das aktive Fenster (= Word) wird zum Besitzer des Dialogs
    .hWndOwner = GetActiveWindow()
    ' Der Filtzer wird vorbereitet
    .lpstrFilter = PrepareFilter(Filter$)
    ' Speicher reservieren für kompletten Pfad
    .lpstrFile = String$(700, vbNullChar)
    ' Größe des reservierten Speichers angeben
    .nMaxFile = 700
    ' Speicher reservieren für Dateinamen
    .lpstrFileTitle = String$(MAX_PATH, vbNullChar)
    ' Größe des reservierten Speichers angeben
    .nMaxFileTitle = MAX_PATH
    ' Das Vorgabeverzeichnis bestimmen
    .lpstrInitialDir = InitialDir$
    ' Der Titel des Dialoges
    .lpstrTitle = "Speichern"
    ' Optionen bestimmen
    .Flags = OFN_EXTENSIONDIFFERENT Or _
      OFN_NOCHANGEDIR Or OFN_OVERWRITEPROMPT _
      Or OFN_HIDEREADONLY
    ' Standarderweiterung für die Dateien bestimmen
    .lpstrDefExt = DefExt$
  End With
 
  If GetSaveFileName(OFN) Then
    Temp$ = OFN.lpstrFile
    ' Alles nach dem NULL-Zeichen verwerfen
    n = InStr(Temp$, vbNullChar)
    If n > 1 Then
      GetSaveName = Left$(Temp$, n - 1)
    Else
      GetSaveName = ""
    End If
  Else
    GetSaveName = ""
  End If
End Function
 
' **********************************************************
Rem *** GetOpenName
Rem Eine VB/VBA-Funktion als einfach zu nutzender Mantel für
Rem den Aufruf des Dialogs "Öffnen".
 
Public Function GetOpenName(ByVal Filter$, _
  ByVal InitialDir$) As String
 
  Dim OFN As OpenFilename
  Dim Temp$
  Dim n As Integer
 
  ' 'Bestimmen der Optionen für den Dialog
  With OFN
    .lStructSize = Len(OFN)
    .hWndOwner = GetActiveWindow()
    .lpstrFilter = PrepareFilter(Filter$)
    ' 'Speicher reservieren
    .lpstrFile = String$(700, vbNullChar)
    .nMaxFile = 700
    .lpstrFileTitle = String$(MAX_PATH, vbNullChar)
    .nMaxFileTitle = MAX_PATH
    .lpstrInitialDir = InitialDir$
    .lpstrTitle = "Öffnen"
    .Flags = OFN_EXTENSIONDIFFERENT Or _
      OFN_NOCHANGEDIR Or OFN_OVERWRITEPROMPT _
      Or OFN_HIDEREADONLY
  End With
 
  If GetOpenFileName(OFN) Then
    Temp$ = OFN.lpstrFile
    ' 'Alles nach dem NULL-Zeichen verwerfen
    n = InStr(Temp$, vbNullChar)
    If n > 1 Then
      GetOpenName = Left$(Temp$, n - 1)
    Else
      GetOpenName = ""
    End If
  Else
    GetOpenName = ""
  End If
End Function



Anzeige

Kauftipp Unser Dauerbrenner!Diesen und auch alle anderen Workshops finden Sie auch auf unserer aktuellen vb@rchiv  Vol.6
(einschl. Beispielprojekt!)

Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
- nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten
- Symbol-Galerie mit mehr als 3.200 Icons im modernen Look
Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m.
 
 
Copyright ©2000-2024 vb@rchiv Dieter OtterAlle Rechte vorbehalten.


Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.