Die Community zu .NET und Classic VB.
Menü

FAQ 0071: Wie verwende ich die Windows-Standard-Dialoge?

 von 

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

Listing 1: Aussehen

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

Listing 2: Filter setzen

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

Listing 3: Mehrfachauswahl zulassen

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

Listing 4: Ausgewählte Dateien als Datenfeld zurückgeben

"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

Listing 5: "Abbrechen" abfangen

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

Listing 6: Hilfe einbinden

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

Listing 7: Auswahl einer Datei

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.