12.12 Standarddialoge
Bei Standarddialogen handelt es sich um Dialoge (Forms), die wir in nahezu jeder Windows-Anwendung vorfinden. Insgesamt fünf werden uns in der Toolbox als Steuerelemente angeboten, die – weil sie nicht direkt mit dem Benutzer interagieren – im Komponentenfach unterhalb des Windows Forms-Designers abgelegt werden:
- ColorDialog
- OpenFileDialog
- FolderBrowserDialog
- SaveFileDialog
- FontDialog
Bis auf OpenFileDialog und SaveFileDialog sind alle direkt von der abstrakten Basisklasse CommonDialog abgeleitet. Die beiden Dateidialoge schalten noch die abstrakte Klasse FileDialog dazwischen.
Die wichtigste Methode aller Standarddialoge ist ShowDialog. Sie dient zum Öffnen eines Dialogfensters, zum Beispiel:
openFileDialog.ShowDialog()
Diese Methode liefert einen Rückgabewert vom Typ DialogResult.
12.12.1 Datei zum Öffnen wählen (OpenFileDialog)
OpenFileDialog ist ein Dialogfenster, in dem der Anwender zur Laufzeit eine Datei auswählen kann, die er öffnen möchte. Die Klasse hat nur einen parameterlosen Konstruktor.
Dim dlgFileOpen As New OpenFileDialog() dlgFileOpen.ShowDialog()
Die beiden Anweisungen bewirken das Öffnen des Dialogfensters aus Abbildung 12.19. Es unterstützt die Navigation zu der Datei, die geöffnet werden soll. Wenn Sie auf die Schaltfläche klicken, wird die ausgewählte Datei nicht tatsächlich geöffnet, sondern nur in der Eigenschaft FileName des Dialogs gespeichert.
Abbildung 12.19 Der Standarddialog »OpenFileDialog«
In den folgenden Unterabschnitten zeige ich Ihnen, wie sowohl das Layout als auch das Verhalten eines OpenFileDialog-Fensters in Grenzen an spezifische Forderungen angepasst wird.
Beschriftung der Titelleiste
Standardmäßig wird in der Titelleiste des Dialogs die Beschriftung Öffnen angezeigt. Sie können den Titel mit der Eigenschaft Title beliebig festlegen.
Dim dlgFileOpen As New OpenFileDialog() dlgFileOpen.Titel = "Öffnen eines Projektordners"
Standardverzeichnis
Der Dialog zum Öffnen einer Datei zeigt beim ersten Mal den Inhalt des Ordners, in dem sich die ausführbare Datei befindet. Beim nächsten Öffnen ist es immer das Verzeichnis, aus dem heraus zuvor eine Datei ausgewählt worden ist. Alternativ wird vor dem Öffnen des Dialogs in der Eigenschaft InitialDirectory das anzuzeigende Verzeichnis spezifiziert. Wenn Sie keinen Wert festlegen, enthält die Eigenschaft einen Leerstring.
dlgFileOpen.InitialDirectory = "C:\MyProjects"
Möglicherweise benötigen Sie aber eine Pfadangabe zu einem systemspezifischen Verzeichnis. Um die notwendigen Informationen über die Umgebung der aktuellen Maschine zu erhalten, können Sie auf die Dienste der Klasse Environment der .NET-Klassenbibliothek zurückgreifen.
Systemspezifische Verzeichnisse geben Sie indirekt an. Die Klasse Environment im Namensraum System definiert Eigenschaften und Methoden, die zum Abrufen von maschinenspezifischen Informationen nützlich sind, beispielsweise die statische Methode GetFolderPath, die den Pfad eines bestimmten Systemordners abruft. Sie erwartet als Argument einen Wert der Enumeration Environment.SpecialFolder. Die Tabelle 12.10 zeigt nur einen Auszug der Enumeration; einen vollständigen Überblick gibt die .NET-Dokumentation.
Member | Rückgabewert (Standardinstallationsvorgabe) |
CommonProgramFiles |
C:\Programme\Gemeinsame Dateien |
History |
<Benutzereinstellungen>\Lokale Einstellungen\Verlauf |
Personal |
<Benutzereinstellungen>\Eigene Dateien |
ProgramFiles |
C:\Programme |
Programs |
<Benutzereinstellungen>\Startmenü\Programme |
Recent |
<Benutzereinstellungen>\Recent |
StartMenu |
<Benutzereinstellungen>\Startmenü |
Startup |
<Benutzereinstellungen>\Startmenü\Programme\Autostart |
System |
C:\WINDOWS\System32 |
Hinweis |
Unter Vista sind einige der Verzeichnisse in Wirklichkeit Links. |
Möchten Sie das zu öffnende Standardverzeichnis auf den Ordner
C:\Dokumente und Einstellungen\<User>\Eigene Dateien
festlegen, lautet die Anweisung:
dlgFileOpen.InitialDirectory = _ Environment.GetFolderPath(Environment.SpecialFolder.Personal)
Dateifilter setzen
Die Eigenschaft Filter des OpenFileDialog-Steuerelements legt die Dateitypen fest, die dem Anwender aus dem angezeigten Ordner zum Öffnen angeboten werden, zum Beispiel:
dlgFileOpen.Filter = "Textdateien (*.txt)|*.txt"
Nach welchen Dateitypen gefiltert wird, kann der Anwender durch eine entsprechende Auswahl in einem Kombinationslistenfeld unterhalb des Anzeigebereichs bestimmen.
3Die durch die Eigenschaft Filter beschriebene Zeichenfolge unterliegt einem strengen Muster. Die Anweisung oben definiert einen Dateifilter, der im Auswahlbereich des Dialogs nur Textdateien mit der Dateierweiterung .txt anbietet. Die Zeichenfolge zur Festlegung eines Filters setzt sich immer aus zwei Teilen zusammen, die durch einen senkrechten Strich voneinander getrennt werden. Die Teilzeichenfolge links vom Strich wird dem Benutzer im Kombinationslistenfeld Dateityp angezeigt, die rechts vom Strich stehende Teilzeichenfolge gibt an, nach welchen Kriterien die Dateien gefiltert werden sollen. Das »*«-Zeichen dient als Platzhalter.
Soll das Kombinationslistenfeld mehrere Auswahloptionen anbieten, ergänzen Sie die Zeichenfolge der Filter-Eigenschaft nach dem bekannten Muster um die gewünschten Filter. Zur Abgrenzung untereinander verwenden Sie ebenfalls einen senkrechten Strich.
Im folgenden Beispiel wird das Kombinationslistenfeld mit zwei Einträgen gefüllt: Der erste ist die Filterung nach Textdateien, und die zweite Auswahloption zeigt sämtliche Dateien des geöffneten Ordners an.
dlgFileOpen.Filter = "Textdateien (*.txt)|*.txt|Alle Dateien (*.*)|*.*"
Wird zur Laufzeit der Anwendung die erste Auswahl getroffen, werden die TXT-Dateien herausgefiltert; entscheidet sich der Anwender für die zweite, werden alle Dateien, unabhängig von der Dateierweiterung, angezeigt.
Die im Kombinationslistenfeld angebotene Liste kann durchaus sehr lang werden, wenn Sie den Anwender mit vielen Filteroptionen verwöhnen wollen.
dlgFileOpen.Filter = _ "Textdateien (*.txt)|*.txt| HTML-Dateien|*.htm;*.html|" _ & "Bitmap-Dateien (*.bmp)|*.bmp|" _ & "Ausführbare Dateien (*.exe)|*.exe|" _ & "Word-Dokumente(*.doc)|*.doc|" _ & "Alle Dateien (*.*)|*.*)"
Manchmal möchte man auch mehrere Dateitypen gleichzeitig anzeigen lassen. Das ist beispielsweise dann der Fall, wenn Sie nach mehreren Bildformaten filtern wollen. Listen Sie dazu in der rechten Teilzeichenfolge alle gewünschten Dateiformate auf. Diese müssen durch ein Semikolon voneinander getrennt werden:
dlgFileOpen.Filter = "Alle Bilddateien|*.bmp;*.jpeg;*.gif"
Anwendungsspezifischer Standardfilter
Normalerweise wird nach dem Öffnen des Dialogs der zuerst aufgeführte Filter im Kombinationslistenfeld angezeigt. Mit der Eigenschaft FilterIndex kann aber auch ein beliebiger aus der Liste gewählt werden:
dlgFileOpen.FilterIndex = 1
Entgegen den sonst üblichen Gepflogenheiten beginnt die Indizierung der Filter nicht mit dem Index 0, sondern mit dem Index 1. Soll nach dem Öffnen des Dialogs beispielsweise nach den im angezeigten Verzeichnis befindlichen Word-Dokumenten gefiltert werden (siehe das Codefragment oben), muss der Eigenschaft FilterIndex die Zahl 4 übergeben werden.
Die ausgewählte Datei
Das Ziel des Dialogs ist, eine Datei auszuwählen und die Wahl im weiteren Programmcode zum tatsächlichen Öffnen der Datei zu verwenden. Die Eigenschaft FileName liefert uns den Dateinamen einschließlich der gesamten Pfadangabe. Ihn können wir als Übergabeargument bei der Instanziierung einer Klasse aus dem Namensraum System.IO mit einem Konstruktor benutzen, der einen path-Parameter entgegennimmt. Zum Beispiel:
Dim dlgFileOpen As New OpenFileDialog() if dlgFileOpen.ShowDialog() = DialogResult.OK Then Dim sr As StreamReader = New StreamReader(dlgFileOpen.FileName) ...
Mehrfachauswahl von Dateien
Möchten Sie eine Mehrfachauswahl von Dateien zulassen, müssen Sie die Eigenschaft MultiSelect des Dialogs auf True setzen. Das Verhalten bei der Dateiauswahl entspricht dann dem eines Listenfeldes mit erweiterter Mehrfachauswahl.
Bei einer einfachen Auswahlmöglichkeit kann man den Pfad zu der zu öffnenden Datei über die Eigenschaft FileName abfragen. Bei der Mehrfachauswahl gibt FileNames ein Array vom Typ String zurück:
Public ReadOnly Property FileNames As String() |
Im Gegensatz zu FileName ist diese Eigenschaft schreibgeschützt.
Ereignisse von OpenFileDialog
Nur zwei spezifische Ereignisse zeichnen das Dialogfeld aus. Zum einen können Sie in Verbindung mit dem Klicken auf die Schaltfläche OK einen Ereignishandler mit dem Ereignis FileOK verknüpfen. Anstatt die Rückgabe des Aufrufs der Methode ShowDialog auszuwerten, können Sie somit auch im Ereignishandler auf die Dateiauswahl im Dialog reagieren. Unter bestimmten Umständen ist das Auswerten des Ereignisses FileOk flexibler, denn der Ereignishandler hat ein Argument vom Typ CancelEventArgs, das uns erlaubt, über die Eigenschaft Cancel das Schließen des Dialogs zu verhindern. Dadurch wird es dem Anwender möglich, mehrere Dateien einzeln hintereinander auszuwählen, ohne dass der Dialog wiederholt geöffnet werden muss.
Das Ereignis HelpRequest setzt voraus, dass die Eigenschaft ShowHelp=True gesetzt ist und im Dialog eine Hilfe-Schaltfläche angezeigt wird. Ausgelöst wird dieses Ereignis durch Klicken auf diese Schaltfläche.
Das Beispiel »Texteditor«
Im folgenden Beispiel wollen wir einen einfachen Texteditor entwickeln und für die allgemeinen Operationen zum Öffnen und Speichern Standarddialoge benutzen. Zunächst soll nur das Öffnen von Dateien implementiert werden. Später wird das Beispiel auch um die Speicherung der Dokumentinformationen ergänzt.
Die Form des Texteditors in Abbildung 12.20 enthält eine Textbox, die auch dann den gesamten Clientbereich der Form ausfüllt, wenn die Form zur Laufzeit vergrößert oder verkleinert wird. Am einfachsten ist das zu realisieren, wenn die Eigenschaft Dock der Textbox auf DockStyle.Fill eingestellt wird. Das Formular enthält ein Menü mit dem Hauptmenüpunkt Datei und den Menüunterelementen Öffnen, Neu, Speichern, Speichern unter und Beenden.
Abbildung 12.20 Formular des Beispiels »Texteditor«
Mit dem Erstellen eines Menüs werden wir uns später beschäftigen. Im Moment ist es für Sie nur wichtig zu wissen, dass ein Menüelement das Ereignis Click bereitstellt, das ausgelöst wird, sobald der Anwender einen Menüpunkt auswählt.
'...\WinControls\Dialoge\Texteditor.vb |
Public Class Texteditor Private Function Weiter() As Boolean Dim fortfahren As Boolean = True If Textfenster.Modified Then Dim erg As DialogResult = MessageBox.Show( _ "Wollen Sie den geänderten Text speichern?", _ Application.ProductName, MessageBoxButtons.YesNoCancel, _ MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) If erg = DialogResult.Yes Then fortfahren = Speichern() ElseIf erg = DialogResult.Abort OrElse erg = DialogResult.Cancel Then fortfahren = False End If End If Return fortfahren End Function Private Sub Neu_Click(ByVal sender As Object, ByVal e As EventArgs) _ Handles NeuMenüpunkt.Click If Weiter() Then Datei = "" Textfenster.Text = "" Text = "Unbenannt – Texteditor" End If End Sub Private Sub Öffnen_Click(ByVal sender As Object, ByVal e As EventArgs) _ Handles ÖffnenMenüpunkt.Click If Weiter() Then Dim ofd As New OpenFileDialog() ofd.Filter = "Textdateien (*.txt)|*.txt|Alle Dateien (*.*)|*.*" ofd.Title = "Öffnen einer Textdatei" If ofd.ShowDialog() = DialogResult.OK Then Dim sr As IO.StreamReader = Nothing Try sr = New IO.StreamReader(ofd.FileName) Textfenster.Text = sr.ReadToEnd() Text = ofd.FileName Datei = ofd.FileName Catch ex As Exception MessageBox.Show(ex.Message, "Texteditor") Finally Try If sr IsNot Nothing Then sr.Close() Catch ex As Exception MessageBox.Show(ex.Message, "Texteditor") End Try End Try End If End If End Sub Private Sub Beenden_Click(ByVal sender As Object, ByVal e As EventArgs) _ Handles BeendenMenüpunkt.Click If Weiter() Then Application.Exit() End Sub Private Sub Schließen(sender As Object, e As FormClosingEventArgs) _ Handles MyBase.FormClosing e.Cancel = Not Weiter() End Sub ... End Class
Im Zusammenhang mit dem Thema dieses Abschnitts ist der wichtigste Codeabschnitt der Dialog zum Öffnen einer Textdatei:
Dim ofd As New OpenFileDialog() ... If ofd.ShowDialog() = DialogResult.OK Then ...
Wie alle modalen Dialogfenster liefert der Aufruf der Methode ShowDialog einen Rückgabewert vom Typ DialogResult. Wir müssen nur noch feststellen, welche Schaltfläche der Anwender im Dialog geklickt hat, denn nur mit der Bestätigung durch OK soll die markierte Datei auch geöffnet und im Textfenster angezeigt werden.
Eine Textdatei kann mit mehreren Klassen des Namensraums System.IO realisiert werden. Im Beispiel wird die Klasse StreamReader eingesetzt und dem Konstruktor die Eigenschaft FileName des Dialogs zugewiesen. Die Methode ReadToEnd() liest Eingaben von der aktuellen Position des Dateizeigers bis zum Ende der Datei ein und berücksichtigt dabei auch Zeilenumbrüche innerhalb des Textes. Der eingelesene Dateiinhalt wird in der Textbox angezeigt.
sr = New IO.StreamReader(ofd.FileName) Textfenster.Text = sr.ReadToEnd() ... Finally ... If sr IsNot Nothing Then sr.Close()
Da insbesondere Dateioperationen schnell einen Fehler verursachen können, wird das Öffnen und Einlesen in einen Try-Anweisungsblock eingeschlossen. Sollte eine Ausnahme auftreten, wird die Fehlermeldung in einem Meldungsfenster angezeigt. Das Schließen des StreamReader-Objekts erfolgt im Finally-Zweig, damit es auch geschlossen wird, wenn während des Lesens eine Ausnahme ausgelöst wird. Damit eine Ausnahme während des Schließens die Anwendung nicht beendet, wird Close() innerhalb eines Try-Blocks aufgerufen.
Die Methode Weiter() speichert, wenn gewünscht, den Text in einer Datei und liefert als Rückgabewert die Information, ob der Vorgang abgeschlossen wurde (gegebenenfalls auch, ohne zu speichern). Eine Speicherung ist nur erforderlich, wenn der Text geändert wurde. Dies wird durch die Eigenschaft Modified der Textbox kenntlich gemacht, die bei Zuweisung der Eigenschaft Text der Textbox automatisch auf False gesetzt wird. Auf die Implementierung der Methode Speichern() gehe ich im nächsten Abschnitt ein.
Da bei jeder Textänderung eine Prüfung auf Speicherung erfolgen sollte, wird Weiter() sowohl vor dem Öffnen einer Datei als auch vor dem Löschen des Textes durch den Menüpunkt Neu aufgerufen. Analog wird vor dem Schließen des Fensters und vor dem Ende des Programms dem Benutzer durch Aufruf von Weiter() die Möglichkeit zum Speichern gegeben. Alle Aufrufe sind so platziert, dass die Bearbeitung nur dann fortgesetzt wird, wenn keine Änderungen vorliegen oder der Benutzer sich eindeutig für die Fortsetzung entscheidet. Somit fehlt nur noch die Implementierung der Speicherroutine.
12.12.2 Datei zum Speichern wählen (SaveFileDialog)
Die Klasse SaveFileDialog stellt ein Dialogfenster dar, das den Anwender zum Speichern einer Datei auffordert. Da die beiden Klassen SaveFileDialog und OpenFileDialog die gemeinsame Basisklasse FileDialog haben, ähneln sich beide Dialoge nicht nur optisch, sondern weisen auch viele gemeinsame Eigenschaften auf, beispielsweise Title, InitialDirectory und Filter. Verschaffen wir uns daher in Tabelle 12.11 einen Überblick über die Eigenschaften, durch die sich die beiden Klassen unterscheiden.
Eigenschaft | Beschreibung |
AddExtension |
Gibt an, ob einem Dateinamen im Dialogfeld automatisch eine Erweiterung hinzugefügt wird, wenn der Benutzer keine Erweiterung angibt. |
DefaultExt |
Die Standarddateinamenerweiterung |
CreatePrompt |
Gibt an, ob die Neuanlage einer nicht existierenden Datei in einem Meldungsfenster durch den Benutzer bestätigt werden muss. |
OverwritePrompt |
Gibt an, ob das Überschreiben einer vorhandenen Datei in einem Meldungsfenster durch den Benutzer bestätigt werden muss. |
Viele Anwendungen ermöglichen es einem Benutzer, auch ohne die Angabe einer Dateierweiterung eine Datei zu speichern. Eine passende Dateierweiterung wird dann automatisch angehängt. MS Word erweitert den Dateinamen beispielsweise um die Erweiterung .doc, der Text-editor Notepad um .txt. Wollen Sie diese Unterstützung auch in Ihrer eigenen Anwendung realisieren, setzt das zunächst voraus, dass die Eigenschaft AddExtension=True gesetzt wird. Der Eigenschaft DefaultExt teilen Sie die gewünschte Standarddateinamenerweiterung mit.
Die Zeichenkette der Eigenschaft DefaultExt wird ohne den Punkt angegeben, der Dateiname und die Dateierweiterung voneinander trennt. Der Punkt wird automatisch eingefügt. Haben Sie eine anwendungsspezifische Dateierweiterung festgelegt und gibt der Anwender die Dateierweiterung trotzdem an, erkennt der Dialog das und hängt keine zweite an.
saveFileDialog1.AddExtension = True saveFileDialog1.DefaultExt = "vb"
Die beiden Eigenschaften CreatePrompt und OverwritePrompt informieren den Anwender mit einem Meldungsfenster. Ist CreatePrompt=True und gibt der Anwender einen Dateinamen an, der im aktuell geöffneten Verzeichnis des Dialogs noch nicht vorhanden ist, wird im Meldungsfenster um Bestätigung gebeten, ob die Datei neu erstellt werden soll.
Übernehmen Sie den Standardwert True der Eigenschaft OverwritePrompt, wird ein Meldungsfenster angezeigt, mit dem der Anwender bestätigen kann, ob eine vorhandene Datei gleichen Namens überschrieben werden soll.
Der Speichern-Dialog im Beispiel »Texteditor«
Das Beispiel Texteditor des vorigen Abschnitts soll jetzt um eine Speicherfunktionalität erweitert werden. Das Feld Datei speichert den Namen der Datei oder "", wenn noch kein Name gewählt wurde. Die Methode Speichern() ruft den Ereignishandler des Menüpunkts zum Speichern auf. Fortfahren ist nur False, wenn der Benutzer in einem Dialog Cancel angeklickt hat oder eine Ausnahme aufgetreten ist.
'...\WinControls\Dialoge\Texteditor.vb |
Public Class Texteditor ... Private Datei As String = "" Private Fortfahren As Boolean Private Function Speichern() As Boolean Fortfahren = True Speichern_Click(Nothing, Nothing) Return Fortfahren End Function Private Sub Speichern_Click(ByVal sender As Object, ByVal e As EventArgs) _ Handles SpeichernMenüpunkt.Click If Datei.Equals("") Then SpeichernUnter_Click(Nothing, Nothing) Else Dim sw As IO.StreamWriter = Nothing Try sw = New IO.StreamWriter(Datei, False) sw.Write(Textfenster.Text) Textfenster.Modified = False Catch ex As Exception Fortfahren = False MessageBox.Show(ex.Message, "Texteditor") Finally Try If sw IsNot Nothing Then sw.Close() Catch ex As Exception MessageBox.Show(ex.Message, "Texteditor") End Try End Try End If End Sub Private Sub SpeichernUnter_Click(sender As Object, e As EventArgs) _ Handles SpeichernUnterMenüpunkt.Click Dim sfd As New SaveFileDialog() sfd.Filter = "Textdateien (*.txt)|*.txt|Alle Dateien (*.*)|*.*" sfd.Title = "Speichern einer Textdatei" If Not Datei.Equals("") Then sfd.FileName = Datei If sfd.ShowDialog() = DialogResult.OK Then Datei = sfd.FileName Speichern_Click(Nothing, Nothing) Text = IO.Path.GetFileName(Datei) & " – Texteditor" Else Fortfahren = False End If End Sub End Class
Sowohl das Speichern unter bekanntem Namen als auch unter einem neuen Namen findet in dem Ereignishandler Speichern_Click() des Menüpunkts Speichern statt. Ist noch kein Dateiname spezifiziert, ruft die Methode ihrerseits SpeichernUnter_Click() auf, um einen Namen festzulegen, die Datei innerhalb von Speichern_Click() zu speichern und die Titelleiste der Anwendung anzupassen. Im Zusammenhang mit dem Thema dieses Abschnitts ist der wichtigste Codeabschnitt der Dialog zum Speichern einer Textdatei:
Dim sfd As New SaveFileDialog() ... If sfd.ShowDialog() = DialogResult.OK Then Datei = sfd.FileName ...
Die Anweisungen ermitteln einen Dateinamen, der im Feld Datei gespeichert wird. Die Zuweisung an die Eigenschaft FileName vor dem Öffnen des Dialogs dient nur dazu, im Textfeld für den Dateinamen bereits etwas stehen zu haben. Der eigentliche Speichervorgang im Ereignishandler Speichern_Click() ist analog zu dem des Öffnens aufgebaut:
sw = New IO.StreamWriter(Datei, False) sw.Write(Textfenster.Text) ... Finally ... If sw IsNot Nothing Then sw.Close()
Der Strom wird geöffnet und der Text mit Write() hineingeschrieben. Der zweite Parameter des Konstruktors sorgt dafür, dass der Text die Datei gegebenenfalls überschreibt und nicht an sie angehängt wird. Auch hier findet das Schließen in einem Finally-Zweig statt, um den Strom auch bei Auftreten einer Ausnahme zu schließen. Um die Anwendung nicht vorzeitig durch eine Ausnahme während des Schließens zu beenden, wird das Schließen in einem eigenen Try-Block ausgeführt.
12.12.3 Ordner selektieren (FolderBrowserDialog)
Mit OpenFileDialog können Sie eine bestimmte Datei auswählen. Das Steuerelement bietet jedoch keine Möglichkeit, die Wahl auf einen Ordner zu beschränken. Dafür stellt das .NET Framework ein anderes Steuerelement zur Verfügung: FolderBrowserDialog. Etwas enttäuschend ist das in Abbildung 12.21 gezeigte Layout des Dialogs. Während uns in anderen Anwendungen ein Dialog ähnlich dem des Dialogs zum Öffnen einer Datei angeboten wird (unter anderem auch von Visual Studio), präsentiert sich die Oberfläche eines FolderBrowserDialog-Objekts nach dem Aufruf der Methode ShowDialog ziemlich spartanisch.
Abbildung 12.21 Der Standarddialog »FolderBrowserDialog«
Die Einflussnahme auf die Anzeige des Dialogs ist auch nur sehr begrenzt. Oberhalb des Anzeigebereichs können Sie einen Text ausgeben. Die entsprechende Zeichenfolge weisen Sie der Eigenschaft Description zu.
Standardmäßig kann ein Anwender aus allen lokalen oder sich im Netzwerk befindlichen Ordnern auswählen. Mit der Eigenschaft RootFolder kann ein anderer Ordner zum Stammordner des Dialogs gemacht werden.
Falls Sie es dem Benutzer nicht erlauben wollen, einen neuen Ordner mit der Schaltfläche Neuer Ordner anzulegen, müssen Sie die Schaltfläche ausblenden. Dazu dient die Eigenschaft ShowNewFolderButton, die Sie dann auf False setzen müssen. Die Pfadangabe des ausgewählten Ordners kann nach dem Schließen des Dialogs mit der Eigenschaft SelectedPath ausgewertet werden, die vom Typ String ist.
12.12.4 Farbe bekennen (ColorDialog)
Noch einfacher als OpenFileDialog und SaveFileDialog ist das Dialogfenster zu programmieren, das dem Anwender ermöglicht, interaktiv Farben auszuwählen, beispielsweise um der Eigenschaft BackColor oder ForeColor zur Laufzeit eine neue Farbe zuzuweisen.
Zum Öffnen des Dialogs wird ebenfalls die Methode ShowDialog aufgerufen. Danach sieht das Standarddialogfeld zur Farbauswahl wie in Abbildung 12.22 aus.
Abbildung 12.22 Der Standarddialog »ColorDialog«
Ein Klick auf die Schaltfläche Farben definieren erweitert das Fenster und ermöglicht es dem Anwender, über die vordefinierten Farben hinaus nach eigener Vorstellung Farbwerte festzulegen. Beabsichtigen Sie, dem Anwender von Anfang an das erweiterte Dialogfenster anzubieten, müssen Sie vor dem Öffnen des Dialogs die Eigenschaft FullOpen=True setzen.
Die ausgewählte Farbe wird in der Eigenschaft Color des Dialogs gespeichert.
Im folgenden Codefragment wird die Hintergrundfarbe der Form gemäß der Auswahl im Dialog verändert. Dem Benutzer wird der erweiterte Dialog angezeigt. Wir werten allerdings nur die OK-Schaltfläche des Dialogs aus, da die Abbrechen-Schaltfläche bedeutungslos ist:
Private Sub btnSetColor_Click(sender As Object, e As EventArgs) colorDialog1.FullOpen = True If colorDialog1.ShowDialog() = DialogResult.OK Then _ Me.BackColor = colorDialog1.Color End Sub
Im Zustand FullOpen hat der Anwender die Möglichkeit, 16 benutzerdefinierte Farben festzulegen, die beim erneuten Öffnen des Dialogs zur Auswahl stehen können. Allerdings ist die Wiedergabe bereits festgelegter benutzerdefinierter Farben kein Standardverhalten, sondern benötigt zusätzlichen Programmcode. Verantwortlich für das Speichern benutzerdefinierter Farben ist die Eigenschaft CustomColors.
Damit die vom Anwender ausgewählten Farben zur Laufzeit zur Verfügung stehen, müssen wir zuerst ein Integer-Array mit ausreichender Kapazität deklarieren:
Dim myColors(15) As Integer
Bevor mit ShowDialog das Dialogfenster geöffnet wird, weisen wir den Inhalt dieses Arrays der Eigenschaft CustomColors zu:
colorDialog1.CustomColors = myColors
Nach dem Schließen des Dialogs werden die Farben im Array gespeichert und stehen bei einem späteren erneuten Öffnen des Dialogs zur Verfügung:
myColors = colorDialog1.CustomColors
Fassen wir zum Abschluss den Code in einem Click-Ereignishandler zusammen:
Public Partial Class Form1 : Inherits Form Private myColors(15) As Integer ... Private Sub btnSetColor_Click(sender As Object, e As EventArgs) fontDialog1.FullOpen = True if colorDialog1.ShowDialog() = DialogResult.OK Then _ Me.BackColor = colorDialog1.Color myColors = colorDialog1.CustomColors End Sub End Class
12.12.5 Schriftart wählen (FontDialog)
Der nächste Vertreter in der Runde der Standarddialoge ist FontDialog. Dieser Dialog ermöglicht die Auswahl einer Schriftart und des Schriftstils. Sie weisen Ihre Auswahl der Font-Eigenschaft zu, indem Sie auf OK klicken.
Das Erscheinungsbild des Dialogs kann durch vier Eigenschaften manipuliert werden, die in Tabelle 12.12 aufgeführt sind.
Eigenschaft | Beschreibung |
ShowApply |
Gibt an, ob der Dialog eine Übernehmen-Schaltfläche hat. |
ShowColor |
Gibt an, ob der Dialogfeld eine Farbauswahl ermöglicht. |
ShowEffects |
Gibt an, ob Unterstrichen oder Durchgestrichen ausgewählt werden können. |
ShowHelp |
Gibt an, ob der Dialog eine Hilfe-Schaltfläche anzeigt. |
Die Schrift in einer Komponente wird durch die Eigenschaften Color und Font festgelegt, die im FontDialog-Objekt gespeichert sind. Die Farbe, die im FontDialog-Objekt eingestellt wird, ist die Schriftfarbe einer Komponente, die durch die Eigenschaft ForeColor beschrieben wird. Die Eigenschaft Font beschreibt die Schrift inklusive ihres Schnitts (fett, kursiv usw.).
Mit MinSize und MaxSize lässt sich festlegen, innerhalb welcher Spanne die Schriftgröße ausgewählt werden kann. MaxSize muss größer MinSize sein, und beide Werte müssen größer als 0 sein. Geben Sie den Wert »0« ein, entspricht das der Standardeinstellung. Haben beide Eigenschaften denselben Wert, ist dieser als konstanter Wert der Schriftgröße anzusehen, die der Benutzer nicht ändern kann.
Eine weitere Eigenschaft ist FixedPitchOnly vom Typ Boolean. Hat die Eigenschaft den Wert True, werden im Dialog nur Schriftarten mit fester Zeichenbreite angeboten. Ein typisches Beispiel dafür ist der Schrifttyp Courier.
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.