FAQ 0071: Wie verwende ich die Windows-Standard-Dialoge?
von Helge Rex
Frage
Diese FAQ klärt einige häufig gestellte Fragen rund um die Common Dialog Controls.
Um die Common Dialog Controls verwenden zu können, muß man unter "Projekt" -> "Komponenten" einen Verweis auf "Microsoft Common Dialog Control" setzen. Wer diese Komponente nicht benutzen kann oder möchte, sollte sich Dateidialoge des CommonDialogs ohne Control nutzen [Tipp 0368] anschauen. Eine mögliche Alternative ist in der Klassen-Rubrik zu finden: VB-Control Replacements - CommonDialog aus Comdlg32.ocx.
Die hier gezeigten Quelltexte stammen von pks und von Helge Rex.
Aussehen des Dialogs
Einige Flags bestimmen das Aussehen und einige das Verhalten. Manche Flags sind nur im Öffnen-Dialog, manche nur im Speichern-Dialog sinnvoll.
With CommonDialog1 ' Win95-Design ' (setzt automatisch auch "cdlOFNLongNames") .Flags = .Flags Or FileOpenConstants.cdlOFNExplorer ' Lange Dateinamen erlauben ' (nur sinnvoll bei Nicht-Win95-Design) '.Flags = .Flags Or FileOpenConstants.cdlOFNLongNames ' Read-Only-Checkbox entfernen .Flags = .Flags Or FileOpenConstants.cdlOFNHideReadOnly ' Nachfragen, falls eine Datei nicht existiert .Flags = .Flags Or FileOpenConstants.cdlOFNCreatePrompt ' Nur vorhandene Dateien und Ordner auswählbar .Flags = .Flags Or FileOpenConstants.cdlOFNFileMustExist .Flags = .Flags Or FileOpenConstants.cdlOFNPathMustExist ' Meldung zeigen, falls die ausgewählte Datei bereits existiert ' (nur sinnvoll bei ShowSave) .Flags = .Flags Or FileOpenConstants.cdlOFNOverwritePrompt ' Mehrfachauswahl zulassen ' (nur sinnvoll bei ShowOpen) .Flags = .Flags Or FileOpenConstants.cdlOFNAllowMultiselect End With
Filter für die Dateiauswahl setzen
Filter für die Auswahl der möglichen Dateien werden mit der Eigenschaft .Filter festgelegt. Falls mehrere Filter vorhanden sind, kann man mit der Eigenschaft .FilterIndex festlegen, welcher Filter beim Öffnen des Dialogs ausgewählt sein soll, beispielsweise wird mit .FilterIndex = 2 der zweite Filter als Voreinstellung festgelegt.
With CommonDialog1 ' Filter festlegen und auswählen .Filter = "Textdateien (TXT, RTF, DOC)|*.txt;*.rtf;*.doc|" & _ "Graphikdateien (BMP, JPG, GIF)|*.bmp;*.jpg;*.gif" .FilterIndex = 2 End With
Mehrere Dateien auswählen
Wird der Dialog zum Öffnen von Dateien verwendet, kann es sinnvoll sein, mehrere Dateien gleichzeitig auswählen zu können. In diesem Fall muß in der Eigenschaft .Flags das Flag "cdlOFNAllowMultiselect" gesetzt sein
With CommonDialog1 ' Mehrfachauswahl zulassen .Flags = .Flags Or FileOpenConstants.cdlOFNAllowMultiselect End With
Die Eigenschaft .FileName gibt nach dem Schließen des Dialogs alle ausgewählten Dateien sowie den Pfad dahin zurück. Als erstes steht der Pfad in der Eigenschaft, danach folgen alle ausgewählten Dateien.
Der folgende Codeausschnitt zeigt, wie die ausgewählten Dateinamen in ein Datenfeld umgeformt werden können:
Dim strFiles() As String Dim s As String Dim i As Long ' Es geht nur um die Auswertung, ShowOpen wurde bereits aufgerufen With CommonDialog1 ' Auswahl am NullChar zerlegen strFiles = Split(.FileName, vbNullChar) ' Falls Obergrenze gleich Untergrenze ist, wurde nur eine ' Datei ausgewählt, andernfalls steht im untersten Element ' der Pfad zu den Dateien, in den anderen Elementen die ' Dateinamen ohne Pfad If LBound(strFiles) <> UBound(strFiles) Then For i = LBound(strFiles) + 1 To UBound(strFiles) strFiles(i) = strFiles(LBound(strFiles)) & _ "\" & strFiles(i) & vbNullChar Next i strFiles(LBound(strFiles)) = vbNullString s = Join$(strFiles, vbNullString) ' Ausgewählte Dateien in ein Datenfeld schreiben strFiles = Split(Left$(s, Len(s) - Len(vbNullChar)), vbNullChar) End If End With
"Abbrechen" abfangen
Gelegentlich wird der Dialog mittels "Abbrechen" geschlossen. Der Entwickler kann den Dialog dazu veranlassen, im Falle des Drückens der "Abbrechen"-Schaltfläche einen Fehler (Fehlercode cdlCancel), auf den der Entwickler reagieren kann (siehe dazu Debugging - Was ist das?).
With CommonDialog1 ' "Abbrechen" abfangen .CancelError = True End With
Alternativ wird das Abbrechen des Dialogs durch die Rückgabe einer leeren Zeichenfolge als Dateinamen signalisiert.
Hilfe einbinden
Um den Anwender zu unterstützen, kann der Entwickler eine Hilfe mitliefern.
With CommonDialog1 ' Hilfe-Button einblenden und Hilfe-Datei benennen .Flags = .Flags Or FileOpenConstants.cdlOFNHelpButton End With
Beispiele rund um die noch zu setzenden Hilfe-Eigenschaften sind in der MSDN-Library zu finden.
Datei öffnen oder speichern
' Beispiel von pks Dim Path As String ' Fehlerbehandlung aktivieren On Error Goto Abbruch Path = "c:\test" With CommonDialog1 ' Abfrage Abbruchtaste zulassen .CancelError = True ' Anzeige ab dem folgenden Verzeichnis .InitDir = Path '23 <- Danke an Florian Rittmeier für die Entdeckung der Illuminati ;-) ' Auswahl von Dateitypen .Filter = "Textdateien (TXT, RTF, DOC)|*.txt;*.rtf;*.doc|" & _ "Graphikdateien (BMP, JPG, GIF, PNG)|*.bmp;*.jpg;*.gif;*.png" ' Anzeige der Dateien mit dem gewählten Filter .ShowOpen ' Datei öffnen '.ShowSave ' Datei speichern ' welche Datei wurde ausgewählt MsgBox .FileName End With ' weiterer Code Ende: ' die Prozedur verlassen, überspringen der Fehlerroutine Exit Sub Abbruch: ' FehlerRoutine If Err.Number = cdlCancel Then ' Abbrechen angewählt Else ' anderer Fehler MsgBox Err.Description, vbOKOnly Or vbCritical, "Command1" End If ' Fehlerbehandlung abschließen Resume Ende
Verzeichnis auswählen
Wie man ein Verzeichnis auswählen kann, zeigt Standarddialoge für Ordner, Computer und Drucker suchen [Tipp 0477].
Hinweise
Leider scheint sich das CommonDialog-Steuerelement nicht mit Windows 2000 zu vertragen, hier funktionieren einige Dialoge nicht korrekt ( 173981 - PRB: Behavior Differences of Print Dialog Box on Different Platforms, 322710 - HOWTO: Raise and Control Print Dialog Boxes from Visual Basic).
pks hat deswegen ein Modul erstellt, mit dem diese Dialoge aufgerufen werden können.
Ihre Meinung
Falls Sie Fragen zu dieser FAQ haben, Ihre Erfahrung mit anderen Nutzern austauschen möchten oder auf eine Ergänzung hinweisen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.