{"id":55000756,"date":"2011-02-01T00:00:00","date_gmt":"2020-05-22T22:00:53","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=756"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"DateidialogKlasse","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/DateidialogKlasse\/","title":{"rendered":"Dateidialog-Klasse"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg08.met.vgwort.de\/na\/2c6c45d4164a49a796475b35cabd52ab\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>In letzter Zeit programmiere ich gern Standardl&ouml;sungen, die ich dann ohne gro&szlig;en Programmieraufwand in weitere Anwendungen &uuml;bernehmen kann. In diesem Fall ging es um ein Textfeld zur Eingabe eines Dateinamens beziehungsweise um eine Schaltfl&auml;che zum &Ouml;ffnen eines Datei &ouml;ffnen-Dialogs. Die Kombination brauche ich immer wieder, sei es, um eine Datei f&uuml;r den Import von Daten auszuw&auml;hlen oder den Pfad zum Backend der aktuellen Datenbank zu aktualisieren. Dieser Beitrag zeigt, wie Sie alles in eine Klasse packen und Ihre Formulare blitzschnell damit ausstatten.<\/b><\/p>\n<p>Sp&auml;testens, wenn Sie eine Frontend-Backend-L&ouml;sung auf Basis von Access erstellen, wobei das Backend zumindest theoretisch seinen Speicherplatz wechseln kann, m&uuml;ssen Sie dem Anwender des Frontends die M&ouml;glichkeit bieten, manuell das Backend auszuw&auml;hlen.<\/p>\n<p>Die gleiche Situation tritt immer dann ein, wenn Ihre Anwendung Daten aus beliebigen anderen Dateien wie etwa Excel-, XML-, Text- oder Worddokumenten importieren soll. Auch dann wird normalerweise der Benutzer aufgefordert, die gew&uuml;nschte Datei auszuw&auml;hlen.<\/p>\n<p>Dabei gibt es unterschiedliche Auspr&auml;gungen: Mal soll der Benutzer nur einen Dialog zum Ausw&auml;hlen der Datei &ouml;ffnen k&ouml;nnen, woraufhin der die Datei betreffende Vorgang direkt beginnt, mal soll die ausgew&auml;hlte Datei in einem Textfeld angezeigt werden, bevor der Benutzer die entsprechende Aktion mit einer zweiten Schaltfl&auml;che startet.<\/p>\n<p>Traurige Tatsache ist, dass man den betroffenen Code jeweils von einer Datenbankdatei zur n&auml;chsten kopiert und teilweise der gleiche Code gleich mehrfach in einer einzigen Datei auftaucht &#8211; und dies auch noch in unterschiedlichen Auspr&auml;gungen.<\/p>\n<p><b>Dateiauswahl mit Klasse<\/b><\/p>\n<p>Die in diesem Beitrag vorgestellte L&ouml;sung soll die komplette Funktionalit&auml;t in einer einzigen Klasse liefern. Diese wird im betroffenen Formular deklariert und instanziert und stellt dann nicht nur die &uuml;blichen Funktionen zum Ausw&auml;hlen von Datei, Speicherort und Verzeichnis bereit, sondern best&uuml;ckt auch Schaltfl&auml;chen mit den entsprechenden Funktionen.<\/p>\n<p><b>Einfache Dateiauswahl-Schaltfl&auml;che<\/b><\/p>\n<p>Im Detail bedeutet dies, dass Sie sich noch nicht einmal mehr um die Ereignisprozedur k&uuml;mmern m&uuml;ssen, die etwa eine Schaltfl&auml;che zum Ausw&auml;hlen einer Datei f&uuml;r die Dateiauswahl ausl&ouml;sen m&uuml;sste.<\/p>\n<p>Nehmen wir an, Sie wollen ein Formular mit einem Textfeld namens <b>txtVerzeichnisUndDateiname <\/b>und einer Schaltfl&auml;che namens <b>cmdAuswaehlen <\/b>best&uuml;cken. Die Schaltfl&auml;che soll einen <b>Datei &ouml;ffnen<\/b>-Dialog anzeigen und im Anschluss die ausgew&auml;hlte Datei in das Textfeld schreiben.<\/p>\n<p>Das Formular sieht dann im Entwurf etwa so wie in Bild 1 aus. Das Anlegen, Benennen und Ausrichten der Steuerelemente war auch schon fast der gr&ouml;&szlig;te Teil der Arbeit &#8211; Sie m&uuml;ssen nun nur noch die Klasse <b>clsFiles <\/b>aus der Beispieldatenbank in die betroffene Datenbank importieren und ein paar Zeilen Code in das <b>Beim &Ouml;ffnen<\/b>-Ereignis des Formulars schreiben.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2011_01\/DateiOeffnenSchaltflaeche-web-images\/pic001.png\" alt=\"pic001.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 1: Beispiel f&uuml;r die Auswahl einer Datei per Textfeld und Schaltfl&auml;che<\/span><\/b><\/p>\n<p>Im Kopf des Klassenmoduls des Formulars landet die Objektvariable, welche einen Verweis auf die noch zu erzeugende Instanz der Klasse <b>clsFiles <\/b>speichert:<\/p>\n<pre>Dim objFiles As clsFiles<\/pre>\n<p>In der Ereignisprozedur <b>Form_Open <\/b>wird dann zun&auml;chst die Instanz der Klasse <b>clsFiles <\/b>erzeugt und der Variablen <b>objFiles <\/b>zugewiesen.<\/p>\n<p>Die beiden folgenden Anweisungen f&uuml;llen zwei Eigenschaften des Objekts <b>objFiles <\/b>mit Verweisen auf die Schaltfl&auml;che, die den <b>Datei ausw&auml;hlen<\/b>-Dialog aktivieren soll, sowie auf das Textfeld, in dem der Pfad und der Dateiname der ausgew&auml;hlten Datei landen sollen.<\/p>\n<pre>Private Sub Form_Open(Cancel As Integer)\r\n    Set objFiles = New clsFiles\r\n    With objFiles\r\n        Set .Commandbutton_ChooseDocument = _\r\n            Me!cmdAuswaehlen\r\n        Set .Textbox_FolderAndFile = Me!txtVerzeichnisUndDateiname\r\n    End With\r\nEnd Sub<\/pre>\n<p>Danach k&ouml;nnen Sie bereits in die Formularansicht wechseln und auf die Schaltfl&auml;che <b>Datei ausw&auml;hlen <\/b>klicken. Es erscheint ein <b>Datei ausw&auml;hlen<\/b>-Dialog wie in Bild 2. Die damit ausgew&auml;hlte Datei landet samt Pfad im Textfeld <b>txtVerzeichnisUndDateiname<\/b>.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2011_01\/DateiOeffnenSchaltflaeche-web-images\/pic002.png\" alt=\"pic002.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 2: Der Datei ausw&auml;hlen-Dialog<\/span><\/b><\/p>\n<p>Und es kommt noch besser: F&uuml;gen Sie eine weitere Schaltfl&auml;che namens <b>cmdOeffnen <\/b>hinzu und betiteln Sie diese mit <b>&Ouml;ffnen<\/b>. Erweitern Sie die Prozedur von oben um die folgende Zeile:<\/p>\n<pre>Set .CommandButton_OpenDocument = Me!cmdOeffnen<\/pre>\n<p>Wenn Sie nun das Formular &ouml;ffnen, finden Sie weitere Funktionalit&auml;t vor: Solange kein g&uuml;ltiger Dateiname im Textfeld steht, bleibt die <b>&Ouml;ffnen<\/b>-Schaltfl&auml;che deaktiviert.<\/p>\n<p>Erst, wenn Sie mit dem <b>Datei ausw&auml;hlen<\/b>-Dialog eine Datei ausgew&auml;hlt haben, wird die <b>&Ouml;ffnen<\/b>-Schaltfl&auml;che aktiviert. &auml;ndern Sie jedoch auch nur einen Buchstaben des Dateinamens, sodass diese nicht mehr im Dateisystem gefunden werden kann, wird die <b>&Ouml;ffnen<\/b>-Schaltfl&auml;che wieder deaktiviert.<\/p>\n<p>Ein Klick auf die <b>&Ouml;ffnen<\/b>-Schaltfl&auml;che startet schlie&szlig;lich die Standardanwendung f&uuml;r die ausgew&auml;hlte Datei und &ouml;ffnet diese.<\/p>\n<p><b>Ordner und Verzeichnis getrennt<\/b><\/p>\n<p>Das funktioniert auch, wenn Sie Ordner und Verzeichnis in zwei Textfeldern anzeigen. Das Beispielformular f&uuml;r diesen Fall sieht im Entwurf wie in Bild 3 aus.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2011_01\/DateiOeffnenSchaltflaeche-web-images\/pic003.png\" alt=\"pic003.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 3: Beispielformular mit separaten Textfeldern f&uuml;r Pfad und Dateiname<\/span><\/b><\/p>\n<p>Im Beispielcode haben wir zur besseren Unterscheidbarkeit den Objektnamen <b>objFiles2 <\/b>gew&auml;hlt (auch deshalb, weil Sie in der Beispieldatenbank mehrere Beispiele in einem Formular finden).<\/p>\n<p>Wir deklarieren wieder die Objektvariable f&uuml;r <b>clsFiles<\/b>:<\/p>\n<pre>Dim objFiles2 As clsFiles<\/pre>\n<p>In der <b>Beim &Ouml;ffnen<\/b>-Prozedur sieht der Code nur unwesentlich anders aus. Der einzige Unterschied ist, dass wir nun Verweise auf zwei Textfelder an die beiden Eigenschaften <b>Textbox_File <\/b>und <b>Textbox_Folder <\/b>des Objekts <b>objFiles2 <\/b>&uuml;bergeben:<\/p>\n<pre>Private Sub Form_Open(Cancel As Integer)\r\n    Set objFiles2 = New clsFiles\r\n    With objFiles2\r\n        Set .CommandButton_OpenDocument = _\r\n            Me!cmdOeffnen2\r\n        Set .Commandbutton_ChooseDocument = _\r\n            Me!cmdAuswaehlen2\r\n        Set .Textbox_File = Me!txtDateiname\r\n        Set .Textbox_Folder = Me!txtVerzeichnis\r\n    End With\r\nEnd Sub<\/pre>\n<p>Der Klick auf die Schaltfl&auml;che <b>Ausw&auml;hlen <\/b>&ouml;ffnet wiederum den <b>Datei ausw&auml;hlen<\/b>-Dialog, allerdings werden Pfad und Datei diesmal gleich auf die entsprechenden Textfelder aufgeteilt (s. Bild 4). Die &uuml;brige Funktionalit&auml;t bleibt gleich.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2011_01\/DateiOeffnenSchaltflaeche-web-images\/pic004.png\" alt=\"pic004.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 4: Frisch eingelesener Pfad und Dateiname<\/span><\/b><\/p>\n<p><b>Dateiangaben in gebundenen Formularen<\/b><\/p>\n<p>Gelegentlich kommt es vor, dass man Pfadangaben in Tabellen speichert &#8211; beispielsweise, um den Pfad zu einem Bild eines Mitarbeiters anzugeben, das man nicht in der Datenbank speichern m&ouml;chte.<\/p>\n<p>Auch hier funktionieren die Textfelder f&uuml;r die Angabe von Pfad und\/oder Dateiname und die entsprechenden Schaltfl&auml;chen. Dies bezieht sich explizit auf die <b>&Ouml;ffnen<\/b>-Schaltfl&auml;che, die ja nur aktiviert sein soll, wenn die angegebene Datei tats&auml;chlich vorhanden ist.<\/p>\n<p>Zwei Beispiele finden Sie in den Formularen <b>frmDateienGebunden <\/b>und <b>frmDateienGebunden_PfadUndDatei<\/b>.<\/p>\n<p><b>Feinheiten einstellen<\/b><\/p>\n<p>In der Basiseinstellung zeigt die Klasse die Dialoge zum Ausw&auml;hlen von Dateien mit dem Titel <b>Datei ausw&auml;hlen<\/b>, dem aktuellen Datenbankverzeichnis als Startverzeichnis sowie einem auf Datenbankdateien fixierten Filter an.<\/p>\n<p>All diese Eigenschaften k&ouml;nnen Sie je nach Anwendungsfall individuell einstellen. Das Startverzeichnis, das der <b>Datei ausw&auml;hlen<\/b>-Dialog anzeigen soll, stellen Sie beispielsweise mit der Eigenschaft <b>StartDir <\/b>ein:<\/p>\n<pre>objFiles.StartDir = &quot;c:\\&quot;<\/pre>\n<p>Auch der Filter l&auml;sst sich manuell einstellen. Die folgende Zuweisung zeigt etwa nur Access-Datenbanken mit der Dateiendung .mdb oder .accdb an:<\/p>\n<pre>objFiles.Filter = &quot;Access-Dateien (*.accdb,*.mdb)&quot;<\/pre>\n<p>Schlie&szlig;lich k&ouml;nnen Sie noch den Titel des jeweiligen Dialogs beeinflussen:<\/p>\n<pre>objFiles.Title = &quot;Access-Datei ausw&auml;hlen&quot;<\/pre>\n<p><b>Integration in VBA-Code<\/b><\/p>\n<p>Die Klasse liefert auch die &uuml;blichen Funktionen f&uuml;r den Einbau in Ihren VBA-Code:<\/p>\n<ul>\n<li class=\"aufz-hlung\"><b>Datei ausw&auml;hlen<\/b>-Dialog (ein oder mehrere Dateien)<\/li>\n<li class=\"aufz-hlung\"><b>Verzeichnis ausw&auml;hlen<\/b>-Dialog<\/li>\n<li class=\"aufz-hlung\"><b>Speicherort ausw&auml;hlen<\/b>-Dialog<\/li>\n<\/ul>\n<p><b>Einfache Datei ausw&auml;hlen<\/b><\/p>\n<p>Wenn Sie eine einzelne Datei ausw&auml;hlen und den Namen in einer Variablen speichern m&ouml;chten, gehen Sie wie folgt vor:<\/p>\n<pre>Public Sub Einfachauswahl()\r\n    Dim objFiles As clsFiles\r\n    Dim strFile As String\r\n    Set objFiles = New clsFiles\r\n    With objFiles\r\n        .StartDir = &quot;c:\\&quot;\r\n        .Title = &quot;Einzelne Datei ausw&auml;hlen&quot;\r\n        .Filter = &quot;Alle Dateien (*.*)&quot;\r\n        strFile = .OpenFileName\r\n    End With\r\n    Debug.Print strFile\r\nEnd Sub<\/pre>\n<p>Sie erstellen also wie in den vorherigen Beispielen ein Objekt auf Basis der Klasse <b>clsFiles<\/b>, stellen die Eigenschaften f&uuml;r die Erscheinungsweise des Dialogs ein und zeigen diesen dann an. <\/p>\n<p><b>Mehrfachauswahl<\/b><\/p>\n<p>Auch eine Mehrfachauswahl wie in Bild 5 l&auml;sst sich mit dieser Klasse realisieren. Die Auswahl mehrerer Dateien erfolgt dabei genau wie im Windows Explorer: Entweder Sie dr&uuml;cken die Umschalttaste, um alle Dateien zwischen zwei markierten Eintr&auml;gen auszuw&auml;hlen, oder Sie dr&uuml;cken die <b>Strg<\/b>-Taste und w&auml;hlen gezielt Dateien aus.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2011_01\/DateiOeffnenSchaltflaeche-web-images\/pic005.png\" alt=\"pic005.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 5: Mehrfachauswahl im Datei ausw&auml;hlen-Dialog<\/span><\/b><\/p>\n<p>Dazu stellen Sie zus&auml;tzlich zu den Eigenschaften des vorherigen Beispiels die Option <b>MultipleFiles <\/b>auf <b>True <\/b>ein. Die <b>OpenFileName<\/b>-Methode liefert eine Zeichenkette zur&uuml;ck, bei der die ausgew&auml;hlten Dateinamen durch das Tabulatorzeichen voneinander getrennt werden.<\/p>\n<p><!--30percent--><\/p>\n<p>Dieses Ergebnis wandelt die folgende Beispielprozedur mit der <b>Split<\/b>-Funktion in ein Array mit den einzelnen Dateinamen um und gibt die enthaltenen Eintr&auml;ge dann innerhalb einer Schleife im Direktfenster aus:<\/p>\n<pre>Public Sub Mehrfachauswahl()\r\n    Dim objFiles As clsFiles\r\n    Dim strFiles() As String\r\n    Dim i As Integer\r\n    Set objFiles = New clsFiles\r\n    With objFiles\r\n        .StartDir = &quot;c:\\&quot;\r\n        .MultipleFiles = True\r\n        .Title = &quot;Einzelne Datei ausw&auml;hlen&quot;\r\n        .Filter = &quot;Alle Dateien (*.*)&quot;\r\n        strFiles = Split(.OpenFileName, vbTab)\r\n    End With\r\n    For i = LBound(strFiles) To UBound(strFiles)\r\n         Debug.Print strFiles(i)\r\n    Next i\r\nEnd Sub<\/pre>\n<p><b>Verzeichnisauswahl<\/b><\/p>\n<p>Die Verzeichnisauswahl erledigt die Methode <b>GetPath<\/b>. Auch hier verwenden Sie die &uuml;blichen Eigenschaften, um das Aussehen des Dialogs zu beeinflussen sowie das Startverzeichnis festzulegen.<\/p>\n<pre>Public Sub Verzeichnisauswahl()\r\n    Dim objFiles As clsFiles\r\n    Set objFiles = New clsFiles\r\n    With objFiles\r\n        .Title = &quot;Verzeichnis ausw&auml;hlen&quot;\r\n        .StartDir = &quot;c:\\&quot;\r\n        Debug.Print .GetPath\r\n    End With\r\nEnd Sub<\/pre>\n<p>Der Dialog liefert immer das Verzeichnis zur&uuml;ck, das beim Schlie&szlig;en im Textfeld <b>Ordner<\/b> zu sehen ist (s. Bild 6).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2011_01\/DateiOeffnenSchaltflaeche-web-images\/pic006.png\" alt=\"pic006.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 6: Auswahl eines Verzeichnisses<\/span><\/b><\/p>\n<p><b>Datei &ouml;ffnen<\/b><\/p>\n<p>Die Funktion <b>OpenFile <\/b>&ouml;ffnet die als Parameter angegebene Datei. Sie erwartet schlicht den Dateinamen als Parameter und sieht wie in <span class=\"verweis-ohneumbruch\"><a href=\"#anker-37-anchor\">Listing 1<\/a><\/span> aus. Die Funktion verwendet eine API-Funktion namens <b>OpenDocument<\/b>, deren Deklaration Sie in der Beispieldatenbank finden.<\/p>\n<p class=\"listingueberschrift\">Listing 1: &Ouml;ffnen eines Dokuments mit der daf&uuml;r vorgesehenen Anwendung<\/p>\n<pre>Public Function OpenDocument(DocumentFile As String) As Long\r\n    Dim ret As Long\r\n    If Len(DocumentFile) &gt; 0 Then\r\n        ret = ShellExecute(Application.hWndAccessApp, &quot;open&quot;, DocumentFile, vbNullChar, &quot;&quot;, 1)\r\n        If Err Then\r\n            OpenDocument = 0\r\n        ElseIf ret &gt; 32 Then\r\n            OpenDocument = -1\r\n        Else\r\n            OpenDocument = ret\r\n        End If\r\n    Else\r\n        OpenDocument = 0\r\n    End If\r\nEnd Function<\/pre>\n<p><b>Wie funktioniert das<\/b><\/p>\n<p>Die Klasse <b>clsFiles <\/b>enth&auml;lt eine ganze Menge <b>Property<\/b>-, <b>Sub<\/b>&#8211; und <b>Function<\/b>-Prozeduren und zus&auml;tzlich einige Ereignisprozeduren, die auf das Bet&auml;tigen der festgelegten Schaltfl&auml;chen oder &auml;nderungen der Dateiangaben in den Textfeldern reagieren.<\/p>\n<p>Schauen wir uns zun&auml;chst die Techniken an, die zum Realisieren der Anzeige der einfachen Dialoge n&ouml;tig sind.<\/p>\n<p><b>Datei ausw&auml;hlen-Dialog in clsFiles<\/b><\/p>\n<p>F&uuml;r den <b>Datei ausw&auml;hlen<\/b>-Dialog brauchen Sie prinzipiell nur die Methode <b>OpenFileName<\/b> aus <span class=\"verweis-ohneumbruch\"><a href=\"#anker-39-anchor\">Listing 2<\/a><\/span>. Diese zeigt den Dialog der nicht dokumentierten <b>WizHook<\/b>-Klasse an.<\/p>\n<p class=\"listingueberschrift\">Listing 2: Funktion zum Aufruf des Datei anzeigen-Dialogs<\/p>\n<pre>Function OpenFileName() As String\r\n    Dim strTemp As String\r\n    Dim intFlags As Integer\r\n    If m_MultipleFiles = True Then\r\n        intFlags = &amp;H48\r\n    Else\r\n        intFlags = &amp;H40\r\n    End If\r\n    WizHook.Key = 51488399\r\n    Call WizHook.GetFileName(Application.hWndAccessApp, &quot;Microsoft Access&quot;, GetTitle, &quot;&Ouml;ffnen&quot;, _\r\n        strTemp, GetStartDir, GetFilter, 1&amp;, 0&amp;, intFlags, True)\r\n    OpenFileName = strTemp\r\nEnd Function<\/pre>\n<p>Allein mit dieser Methode ist es allerdings nicht getan, weil Sie ja nicht unbedingt immer mit den Standardwerten f&uuml;r den Titel, den Filter und das Startverzeichnis des Dialogs arbeiten m&ouml;chten. Also gibt es ein recht flexibles Konstrukt, das benutzerdefinierte Abweichungen von den Standardwerten verarbeitet.<\/p>\n<p>Dies manifestiert sich zun&auml;chst im Deklarationsbereich der Klasse, wo Sie die folgenden vier Variablen finden:<\/p>\n<pre>Dim m_StartDir As String\r\nDim m_Title As String\r\nDim m_Filter As String\r\nDim m_MultipleFiles As Boolean<\/pre>\n<p>Hier werden vom aufrufenden Code angegebene &auml;nderungen der Standardwerte f&uuml;r Startverzeichnis, Titel, Filter und Einfach-\/Mehrfachauswahl gespeichert.<\/p>\n<p>Damit Sie von au&szlig;en auf diese privaten Variablen zugreifen k&ouml;nnen, gibt es entsprechende <b>Property Let<\/b>-Methoden, die wie folgt aussehen:<\/p>\n<pre>Public Property Let StartDir(str As String)\r\n    m_StartDir = str\r\nEnd Property\r\nPublic Property Let MultipleFiles(bol As Boolean)\r\n    m_MultipleFiles = bol\r\nEnd Property\r\nPublic Property Let Title(str As String)\r\n    m_Title = str\r\nEnd Property\r\nPublic Property Let Filter(str As String)\r\n    m_Filter = str\r\nEnd Property<\/pre>\n<p>Diese Properties sorgen daf&uuml;r, dass die entsprechenden Eigenschaften via IntelliSense ausgew&auml;hlt und zum F&uuml;llen der privat deklarierten Variablen verwendet werden k&ouml;nnen (s. Bild 7).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2011_01\/DateiOeffnenSchaltflaeche-web-images\/pic007.png\" alt=\"pic007.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 7: Per IntelliSense verf&uuml;gbare Eigenschaften<\/span><\/b><\/p>\n<p>Nun flie&szlig;t in der Funktion <b>OpenFileName <\/b>jedoch nur <b>m_MultipleFilenames <\/b>direkt in den Aufruf des Dialogs ein. Ansonsten finden sich dort Funktionen wie <b>GetTitle<\/b>, <b>GetStartDir <\/b>oder <b>GetFilter<\/b>. Was hat es damit auf sich<\/p>\n<p>Diese Funktionen pr&uuml;fen, ob die aufrufende Routine einen Wert f&uuml;r die jeweilige Eigenschaft &uuml;bergeben hat. Falls ja, wird dieser als Funktionsergebnis zur&uuml;ckgeliefert, falls nicht, verwendet die Funktion einen Standardwert als R&uuml;ckgabewert. F&uuml;r den Titel und den Filter sieht dies so aus:<\/p>\n<pre>Private Function GetTitle() As String\r\n    If Len(m_Title) = 0 Then\r\n        GetTitle = &quot;Datei ausw&auml;hlen&quot;\r\n    Else\r\n        GetTitle = m_Title\r\n    End If\r\nEnd Function\r\nPrivate Function GetFilter() As String\r\n    If Len(m_Filter) = 0 Then\r\n        GetFilter = &quot;Alle Dateien (*.*)&quot;\r\n    Else\r\n        GetFilter = m_Filter\r\n    End If\r\nEnd Function<\/pre>\n<p>Die Funktion <b>GetStartDir<\/b> ist noch ein wenig aufwendiger gestaltet. Sie pr&uuml;ft zun&auml;chst, ob <b>m_StartDir <\/b>bereits einen benutzerdefinierten Wert enth&auml;lt. Falls nicht, untersucht die Funktion den Wert einer weiteren Eigenschaft namens <b>m_Folder<\/b>.<\/p>\n<p>Diese wird gef&uuml;llt, wenn Sie die Klasse <b>clsFiles <\/b>zum Best&uuml;cken von Schaltfl&auml;chen und Textfeldern mit den entsprechenden Funktionen zur Dateiauswahl verwenden:<\/p>\n<pre>Private Function GetStartDir() As String\r\n    If Len(m_StartDir) = 0 Then\r\n        GetStartDir = m_Folder\r\n        If Len(GetStartDir) = 0 Then\r\n            GetStartDir = CurrentProject.Path\r\n        End If\r\n    End If\r\n    GetStartDir = m_StartDir\r\nEnd Function<\/pre>\n<p><b>Verzeichnis ausw&auml;hlen in clsFiles<\/b><\/p>\n<p>Die Funktion <b>GetPath <\/b>verwendet wiederum eine Funktion der <b>WizHook<\/b>-Klasse. Auch hier kommen die bereits beschriebenen Einrichtungen zum &Uuml;bergeben von Titel, Filter und Startverzeichnis zum Zuge:<\/p>\n<pre>Public Function GetPath() As String\r\n    WizHook.Key = 51488399\r\n    Call WizHook.GetFileName(Application.hWndAccessApp, _\r\n        &quot;Microsoft Access&quot;, GetTitle, &quot;&Ouml;ffnen&quot;, GetPath, GetStartDir, &quot;&quot;, 0&amp;, 3, 96, True)\r\nEnd Function<\/pre>\n<p><b>Speichern unter-Dialog in clsFiles<\/b><\/p>\n<p>Der <b>Speichern unter<\/b>-Dialog ist etwas umfangreicher aufgebaut, da dieser auf eine API-Funktion und eine spezielle Struktur zur&uuml;ckgreift. Aus Platzgr&uuml;nden k&ouml;nnen wir den Code hier nicht abbilden.<\/p>\n<p>Die Funktion <b>GetSaveFile <\/b>greift jedoch ebenfalls auf die drei Funktionen <b>GetTitel<\/b>, <b>GetFilter <\/b>und <b>GetStartDir <\/b>zur&uuml;ck.<\/p>\n<p class=\"zwischen-berschrift-oberer-spaltenrand\">Schaltfl&auml;che mit Datei ausw&auml;hlen-Dialog ausstatten<\/p>\n<p>Kommen wir zum komplizierteren Teil: Wie schafft es die Klasse, einer Schaltfl&auml;che v&ouml;llig ohne jeden Code die Funktion zum &Ouml;ffnen etwa des <b>Datei ausw&auml;hlen<\/b>-Dialogs unterzujubeln Dazu muss die Schaltfl&auml;che zun&auml;chst der Klasse bekannt gemacht werden. Dies geschieht, wie in den Beispielen oben beschrieben, durch eine Zeile wie die folgende:<\/p>\n<pre>Set .Commandbutton_ChooseDocument = Me!cmdAuswaehlen<\/pre>\n<p>Die <b>Property Set<\/b>-Prozedur, die diese Zuweisung verarbeitet, sieht wie in <span class=\"verweis-ohneumbruch\"><a href=\"#anker-36-anchor\">Listing 3<\/a><\/span> aus. Die erste Zeile weist die Schaltfl&auml;che einer Variablen zu, die wie folgt deklariert ist:<\/p>\n<pre>Dim WithEvents m_cmdChooseDocument As CommandButton<\/pre>\n<p class=\"listingueberschrift\">Listing 3: Anzeigen von Dialogen zum Ausw&auml;hlen einzelner und mehrerer Dateien<\/p>\n<pre>Public Property Set Commandbutton_ChooseDocument(cmd As CommandButton)\r\n    Set m_cmdChooseDocument = cmd\r\n    m_cmdChooseDocument.OnClick = &quot;[Event Procedure]&quot;\r\n    SetForm cmd.Parent\r\nEnd Property<\/pre>\n<p>Dann stellt sie die Eigenschaft <b>OnClick <\/b>auf den Wert <b>[Event Procedure] <\/b>ein. Zusammen mit dem Schl&uuml;sselwort <b>WithEvents <\/b>in der Deklaration der Objektvariablen f&uuml;r die Schaltfl&auml;che sorgt dies daf&uuml;r, dass Access beim Klick auf diese Schaltfl&auml;che innerhalb der Klasse <b>clsFiles <\/b>nach einer Ereignisprozedur f&uuml;r dieses Ereignis sucht.<\/p>\n<p>Au&szlig;erdem ruft diese <b>Property Set<\/b>-Prozedur noch die Methode <b>SetForm <\/b>auf. Schauen wir uns zun&auml;chst die Ereignisprozedur an, die durch die Schaltfl&auml;che ausgel&ouml;st werden soll. Diese sieht wie in <span class=\"verweis-ohneumbruch\"><a href=\"#anker-38-anchor\">Listing 4<\/a><\/span> aus.<\/p>\n<p class=\"listingueberschrift\">Listing 4: Diese Prozedur wird durch einen Klick auf die Datei ausw&auml;hlen-Schaltfl&auml;che ausgel&ouml;st.<\/p>\n<pre>Private Sub m_cmdChooseDocument_Click()\r\n    Dim intBackslash As Integer\r\n    m_FolderAndFile = OpenFileName()\r\n    SplitFolderAndFile\r\n    If Not m_txtFolderAndFile Is Nothing Then\r\n        m_txtFolderAndFile.Value = m_FolderAndFile\r\n    End If\r\n    If Not m_txtFolder Is Nothing Then\r\n        m_txtFolder.Value = m_Folder\r\n    End If\r\n    If Not m_txtFile Is Nothing Then\r\n        m_txtFile.Value = m_File\r\n    End If\r\n    EnableOpenButton\r\nEnd Sub<\/pre>\n<p>Die Prozedur &ouml;ffnet zun&auml;chst den <b>Datei ausw&auml;hlen<\/b>-Dialog und schreibt das Ergebnis in die Variable <b>m_FolderAndFile<\/b>. Dann nimmt die Prozedur mithilfe der Funktion <b>SplitFolderAndFile <\/b>den Dateinamen auseinander. Diese sucht sich den letzten Backslash (<b>\\<\/b>) und speichert dessen Position in der Variablen <b>intBackslash<\/b>.<\/p>\n<p>Der Teil bis zum Backslash landet dann inklusive diesem in der Variablen <b>m_Folder<\/b>, den Teil hinter dem Backslash schreibt die Prozedur in die Variable <b>m_File<\/b>.<\/p>\n<pre>Private Sub SplitFolderAndFile()\r\n    Dim intBackslash As Integer\r\n    intBackslash = InStrRev(m_FolderAndFile, &quot;\\&quot;)\r\n    If intBackslash &gt; 0 Then\r\n        m_Folder = Mid(m_FolderAndFile, 1, intBackslash)\r\n        m_File = Mid(m_FolderAndFile, intBackslash + 1)\r\n    Else\r\n        m_Folder = m_FolderAndFile\r\n        m_File = &quot;&quot;\r\n    End If\r\nEnd Sub<\/pre>\n<p>Dann pr&uuml;ft die Prozedur, ob die aktuelle Instanz der Klasse <b>clsFiles <\/b>auch einen Verweis auf ein Textfeld zur Anzeige von Pfad und Dateinamen besitzt. Falls ja, schreibt sie beides in dieses Textfeld.<\/p>\n<p>Das Gleiche pr&uuml;ft sie f&uuml;r gegebenenfalls vorhandene Textfelder zur Anzeige der in Pfad und Dateiname aufgeteilten Angabe.<\/p>\n<p>Schlie&szlig;lich ruft die Prozedur eine weitere Routine namens <b>EnableOpenButton <\/b>auf. Diese pr&uuml;ft die G&uuml;ltigkeit des Dateinamens und aktiviert oder deaktiviert eine eventuell zum &Ouml;ffnen der ausgew&auml;hlten Datei vorgesehene Schaltfl&auml;che.<\/p>\n<p><b>Schaltfl&auml;che zum &Ouml;ffnen einer Datei<\/b><\/p>\n<p>Der Verweis auf eine Schaltfl&auml;che zum &Ouml;ffnen der ausgew&auml;hlten Datei wird in einer wie folgt deklarierten Variablen gespeichert:<\/p>\n<pre>Dim WithEvents m_cmdOpenDocument As CommandButton<\/pre>\n<p>Die Zuweisung erfolgt &uuml;ber eine weitere <b>Property Set<\/b>-Prozedur. Diese speichert den Verweis auf die angegebene Schaltfl&auml;che in <b>m_cmdOpenDocument<\/b>, legt die <b>OnClick<\/b>-Eigenschaft fest, damit auch diese Schaltfl&auml;che wieder eine Ereignisprozedur ausl&ouml;st, und ruft die Routine <b>EnableOpenButton <\/b>auf.<\/p>\n<p>Diese pr&uuml;ft, ob sich aktuell ein g&uuml;ltiger Dateiname in einem gegebenenfalls vorhandenen Textfeld befindet, und aktiviert oder deaktiviert diese Schaltfl&auml;che:<\/p>\n<pre>Public Property Set CommandButton_OpenDocument(cmd As CommandButton)\r\n    Set m_cmdOpenDocument = cmd\r\n    m_cmdOpenDocument.OnClick = &quot;[Event Procedure]&quot;\r\n    EnableOpenButton\r\n    SetForm cmd.Parent\r\nEnd Property<\/pre>\n<p>Die durch das Ereignis <b>Beim Klicken <\/b>dieser Schaltfl&auml;che ausgel&ouml;ste Prozedur sieht so aus:<\/p>\n<pre>Private Sub m_cmdOpenDocument_Click()\r\n    If Not m_txtFolderAndFile Is Nothing Then\r\n        Call OpenDocument(m_Folder &amp; m_File)\r\n    End If\r\nEnd Sub<\/pre>\n<p>Die Funktion <b>OpenDocument <\/b>haben wir bereits weiter oben beschrieben.<\/p>\n<p><b>Ausw&auml;hlen und &ouml;ffnen in clsFiles<\/b><\/p>\n<p>Eine weitere Schaltfl&auml;che k&ouml;nnen Sie so best&uuml;cken, dass diese erst einen <b>Datei ausw&auml;hlen<\/b>-Dialog anzeigt und nach der Auswahl direkt die angegebene Datei &ouml;ffnet.<\/p>\n<p>Der Verweis auf eine solche Schaltfl&auml;che landet in der folgenden Variablen:<\/p>\n<pre>Dim WithEvents m_cmdChooseAndOpenDocument As CommandButton<\/pre>\n<p>Die Festlegung erfolgt wiederum &uuml;ber eine &ouml;ffentliche Eigenschaft der Klasse, die durch die folgende <b>Property Set<\/b>-Prozedur realisiert wird:<\/p>\n<pre>Public Property Set CommandButton_ChooseAndOpenDocument(cmd As CommandButton)\r\n    Set m_cmdChooseAndOpenDocument = cmd\r\n    m_cmdChooseAndOpenDocument.OnClick = &quot;[Event Procedure]&quot;\r\n    SetForm cmd.Parent\r\nEnd Property<\/pre>\n<p>Die durch diese Schaltfl&auml;che ausgel&ouml;ste Prozedur liest zun&auml;chst den Dateinamen ein, teilt den Dateinamen in Pfad und Datei auf und &ouml;ffnet diese dann nach Pr&uuml;fung der Bestandteile:<\/p>\n<pre>Private Sub m_cmdChooseAndOpenDocument_Click()\r\n    m_FolderAndFile = OpenFileName()\r\n    SplitFolderAndFile\r\n    If CheckFolderAndFile Then\r\n        Call OpenDocument(m_FolderAndFile)\r\n    End If\r\nEnd Sub<\/pre>\n<p><b>Textfelder zum Anzeigen der Dateiinformationen<\/b><\/p>\n<p>Auch eventuell verwendete Textfelder werden &uuml;ber entsprechende Objektvariablen referenziert. Dies hat zwei Gr&uuml;nde: Erstens kann die Klasse den Textfeldern dann den Dateinamen ganz oder in Teilen zuweisen, ohne deren genauen Namen kennen zu m&uuml;ssen, und zweitens kann die Klasse auf manuelle &auml;nderungen der enthaltenen Dateinamen reagieren.<\/p>\n<p>Auf diese Weise soll beispielsweise die Schaltfl&auml;che zum &Ouml;ffnen der ausgew&auml;hlten Datei aktiviert oder deaktiviert werden.<\/p>\n<p>Die verschiedenen Textfelder werden in den folgenden Variablen gespeichert:<\/p>\n<pre>Dim WithEvents m_txtFolder As TextBox\r\nDim WithEvents m_txtFile As TextBox\r\nDim WithEvents m_txtFolderAndFile As TextBox<\/pre>\n<p>Alle sind so deklariert, dass sie wiederum Ereignisse ausl&ouml;sen k&ouml;nnen &#8211; in diesem Fall ist das Ereignis <b>Bei &auml;nderung <\/b>interessant.<\/p>\n<p>Schauen wir uns stellvertretend f&uuml;r die &uuml;brigen Textfelder die <b>Property Set<\/b>-Prozedur an, mit der die aufrufende Routine das Textfeld zum Eingeben des kompletten Dateinamens inklusive Pfad zuweisen kann:<\/p>\n<pre>Public Property Set Textbox_FolderAndFile(txt As TextBox)\r\n    Set m_txtFolderAndFile = txt\r\n    With m_txtFolderAndFile\r\n        .BeforeUpdate = &quot;[Event Procedure]&quot;\r\n        .OnChange = &quot;[Event Procedure]&quot;\r\n    End With\r\n    SetForm txt.Parent\r\nEnd Property<\/pre>\n<p>Die Routine nimmt den Verweis auf das Textfeld entgegen und f&uuml;llt die beiden Ereigniseigenschaften <b>BeforeUpdate <\/b>und <b>OnChange <\/b>jeweils mit dem Wert <b>[Event Procedure]<\/b>.<\/p>\n<p>Au&szlig;erdem, und das ist ausschlie&szlig;lich f&uuml;r gebundene Textfelder wichtig, ruft die Prozedur die Routine <b>SetForm <\/b>auf &#8211; dazu sp&auml;ter mehr.<\/p>\n<p>Das &auml;ndern des Inhalts eines dieser Textfelder l&ouml;st die folgende Ereignisprozedur aus. Diese schreibt zun&auml;chst den neuen kompletten Pfad in die Variable <b>m_FolderAndFile<\/b>.<\/p>\n<p>Dann aktualisiert sie <b>m_Folder <\/b>und <b>m_File <\/b>und ruft die Prozedur <b>EnableOpenButton <\/b>auf, die eine eventuell vorhandene Schaltfl&auml;che zum &Ouml;ffnen der im Textfeld enthaltenen Datei deaktiviert, wenn der angegebene Pfad ung&uuml;ltig ist:<\/p>\n<pre>Private Sub m_txtFolderAndFile_Change()\r\n    m_FolderAndFile = m_txtFolderAndFile.Text\r\n    SplitFolderAndFile\r\n    EnableOpenButton\r\nEnd Sub<\/pre>\n<p>Die zweite Ereignisprozedur sieht wie folgt aus und erledigt genau die gleiche Aufgabe, wird aber erst durch das Ereignis <b>Vor Aktualisierung <\/b>des Textfeldes ausgel&ouml;st:<\/p>\n<pre>Private Sub m_txtFolderAndFile_BeforeUpdate( _\r\n    Cancel As Integer)\r\n    m_FolderAndFile = Nz(m_txtFolderAndFile)\r\n    SplitFolderAndFile\r\n    EnableOpenButton\r\nEnd Sub<\/pre>\n<p><b>Pfad in gebundenen Textfeldern pr&uuml;fen<\/b><\/p>\n<p>Schlie&szlig;lich kann es sein, dass ein Textfeld mit einem Pfad an ein Feld einer Tabelle gebunden ist.Beim Datensatzwechsel muss dann eine gegebenenfalls vorhandene <b>Datei &ouml;ffnen<\/b>-Schaltfl&auml;che aktiviert oder deaktiviert werden &#8211; je nachdem, ob der angegebene Pfad g&uuml;ltig ist.<\/p>\n<p>Daher m&uuml;ssen wir auch noch auf den Datensatzwechsel im Formular reagieren, wozu wir zun&auml;chst einmal einen Verweis auf das entsprechende Formular ben&ouml;tigen. Diesen speichern wir in dieser Variablen:<\/p>\n<pre>Dim WithEvents m_Form As Form<\/pre>\n<p>Diese Variable wird durch die folgende Prozedur gef&uuml;llt, die jeweils beim Zuweisen der entsprechenden Textfelder zum Anzeigen von Dateiinformationen ausgel&ouml;st wird:<\/p>\n<pre>Private Function SetForm(frm As Form)\r\n    If m_Form Is Nothing Then\r\n        Set m_Form = frm\r\n        m_Form.OnCurrent = &quot;[Event Procedure]&quot;\r\n    End If\r\nEnd Function<\/pre>\n<p>Fehlt noch das eigentliche Ereignis, das beim Datensatzwechsel ausgel&ouml;st wird. Dieses liest die Daten aus den verwendeten Textfeldern (also entweder aus einem Textfeld mit komplettem Pfad oder zwei Textfeldern mit Pfad und Dateiname) aus, schreibt diese in die daf&uuml;r vorgesehenen Variablen <b>m_FolderAndFile<\/b>, <b>m_Folder <\/b>oder <b>m_File <\/b>und ruft dann die Prozedur <b>EnableOpenButton <\/b>auf:<\/p>\n<pre>Private Sub m_Form_Current()\r\n    If Not m_txtFolderAndFile Is Nothing Then\r\n        m_FolderAndFile = Nz(m_txtFolderAndFile)\r\n        SplitFolderAndFile\r\n    ElseIf Not (m_txtFile Is Nothing Or m_txtFolder Is Nothing) Then\r\n        m_File = Nz(m_txtFile)\r\n        m_Folder = Nz(m_txtFolder)\r\n        m_FolderAndFile = m_Folder &amp; m_File\r\n    End If\r\n    EnableOpenButton\r\nEnd Sub<\/pre>\n<p class=\"zwischen-berschriftquellen\">&Ouml;ffnen-Schaltfl&auml;che aktivieren und deaktivieren<\/p>\n<p>Die Prozedur <b>EnableOpenButton <\/b>pr&uuml;ft zun&auml;chst, ob es &uuml;berhaupt eine Schaltfl&auml;che zum &Ouml;ffnen der angegebenen Datei gibt, und aktiviert diese dann in Abh&auml;ngigkeit von einem <b>Boolean<\/b>-Wert, den eine weitere Funktion namens <b>CheckFolderAndFile <\/b>zur&uuml;ckliefert:<\/p>\n<pre>Private Sub EnableOpenButton()\r\n    If Not m_cmdOpenDocument Is Nothing Then\r\n        m_cmdOpenDocument.Enabled = CheckFolderAndFile\r\n    End If\r\nEnd Sub<\/pre>\n<p>Diese Funktion pr&uuml;ft zun&auml;chst, ob die L&auml;nge von <b>m_File <\/b>gr&ouml;&szlig;er <b>0 <\/b>ist. Falls nicht, liefert sie den Wert <b>False <\/b>zur&uuml;ck.<\/p>\n<p>Anderenfalls folgt eine weitere Pr&uuml;fung auf die L&auml;nge der Zeichenkette, welche die <b>Dir<\/b>-Funktion mit dem kompletten Pfad als Parameter zur&uuml;ckliefert.<\/p>\n<p>Ist der Pfad g&uuml;ltig, liefert die <b>Dir<\/b>-Funktion den Dateinamen zur&uuml;ck. Dessen L&auml;nge ist gr&ouml;&szlig;er <b>0 <\/b>und <b>CheckFolderAndFile <\/b>liefert den Wert <b>True <\/b>zur&uuml;ck:<\/p>\n<pre>Private Function CheckFolderAndFile() As Boolean\r\n    Dim bol As Boolean\r\n    If Len(m_File) &gt; 0 Then\r\n        If Len(Dir(m_FolderAndFile)) &gt; 0 Then\r\n            bol = True\r\n        Else\r\n            bol = False\r\n        End If\r\n    Else\r\n        bol = False\r\n    End If\r\n    CheckFolderAndFile = bol\r\nEnd Function<\/pre>\n<p><b>Zusammenfassung und Ausblick<\/b><\/p>\n<p>Die hier vorgestellte Klasse erf&uuml;llt zun&auml;chst alle typischen Anforderungen an das Ausw&auml;hlen von Dateien, Verzeichnissen oder Speicherorten sowie zum &Ouml;ffnen von Dateien.<\/p>\n<p>Dar&uuml;ber hinaus bietet sie die M&ouml;glichkeit, komplette Sets bestehend etwa aus einem Textfeld zum Speichern des kompletten Pfades, einer Schaltfl&auml;che zum Ausw&auml;hlen und einer Schaltfl&auml;che zum &Ouml;ffnen der angegebenen Datei durch wenige Zeilen Code mit Funktionen zu versehen.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>DateiOeffnenSchaltflaeche.mdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/{1CB455EF-BAC0-47EB-B489-C5D0B8F8B7A6}\/aiu_756.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In letzter Zeit programmiere ich gern Standardl&ouml;sungen, die ich dann ohne gro&szlig;en Programmieraufwand in weitere Anwendungen &uuml;bernehmen kann. In diesem Fall ging es um ein Textfeld zur Eingabe eines Dateinamens beziehungsweise um eine Schaltfl&auml;che zum &Ouml;ffnen eines Datei &ouml;ffnen-Dialogs. Die Kombination brauche ich immer wieder, sei es, um eine Datei f&uuml;r den Import von Daten auszuw&auml;hlen oder den Pfad zum Backend der aktuellen Datenbank zu aktualisieren. Dieser Beitrag zeigt, wie Sie alles in eine Klasse packen und Ihre Formular blitzschnell damit ausstatten.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[66012011,662011,44000023],"tags":[],"class_list":["post-55000756","post","type-post","status-publish","format-standard","hentry","category-66012011","category-662011","category-Mit_Formularen_arbeiten"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.4) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Dateidialog-Klasse - Access im Unternehmen<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/access-im-unternehmen.de\/DateidialogKlasse\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Dateidialog-Klasse\" \/>\n<meta property=\"og:description\" content=\"In letzter Zeit programmiere ich gern Standardl&ouml;sungen, die ich dann ohne gro&szlig;en Programmieraufwand in weitere Anwendungen &uuml;bernehmen kann. In diesem Fall ging es um ein Textfeld zur Eingabe eines Dateinamens beziehungsweise um eine Schaltfl&auml;che zum &Ouml;ffnen eines Datei &ouml;ffnen-Dialogs. Die Kombination brauche ich immer wieder, sei es, um eine Datei f&uuml;r den Import von Daten auszuw&auml;hlen oder den Pfad zum Backend der aktuellen Datenbank zu aktualisieren. Dieser Beitrag zeigt, wie Sie alles in eine Klasse packen und Ihre Formular blitzschnell damit ausstatten.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/DateidialogKlasse\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T22:00:53+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg08.met.vgwort.de\/na\/2c6c45d4164a49a796475b35cabd52ab\" \/>\n<meta name=\"author\" content=\"Andr\u00e9 Minhorst\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andr\u00e9 Minhorst\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"21\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/DateidialogKlasse\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/DateidialogKlasse\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Dateidialog-Klasse\",\"datePublished\":\"2020-05-22T22:00:53+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/DateidialogKlasse\\\/\"},\"wordCount\":3270,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/DateidialogKlasse\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg08.met.vgwort.de\\\/na\\\/2c6c45d4164a49a796475b35cabd52ab\",\"articleSection\":[\"1\\\/2011\",\"2011\",\"Mit Formularen arbeiten\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/DateidialogKlasse\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/DateidialogKlasse\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/DateidialogKlasse\\\/\",\"name\":\"Dateidialog-Klasse - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/DateidialogKlasse\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/DateidialogKlasse\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg08.met.vgwort.de\\\/na\\\/2c6c45d4164a49a796475b35cabd52ab\",\"datePublished\":\"2020-05-22T22:00:53+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/DateidialogKlasse\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/DateidialogKlasse\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/DateidialogKlasse\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg08.met.vgwort.de\\\/na\\\/2c6c45d4164a49a796475b35cabd52ab\",\"contentUrl\":\"http:\\\/\\\/vg08.met.vgwort.de\\\/na\\\/2c6c45d4164a49a796475b35cabd52ab\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/DateidialogKlasse\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Dateidialog-Klasse\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"name\":\"Access im Unternehmen\",\"description\":\"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access\",\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/access-im-unternehmen.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\",\"name\":\"Andr\u00e9 Minhorst Verlag\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"contentUrl\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"width\":370,\"height\":111,\"caption\":\"Andr\u00e9 Minhorst Verlag\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\",\"name\":\"Andr\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Dateidialog-Klasse - Access im Unternehmen","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/access-im-unternehmen.de\/DateidialogKlasse\/","og_locale":"de_DE","og_type":"article","og_title":"Dateidialog-Klasse","og_description":"In letzter Zeit programmiere ich gern Standardl&ouml;sungen, die ich dann ohne gro&szlig;en Programmieraufwand in weitere Anwendungen &uuml;bernehmen kann. In diesem Fall ging es um ein Textfeld zur Eingabe eines Dateinamens beziehungsweise um eine Schaltfl&auml;che zum &Ouml;ffnen eines Datei &ouml;ffnen-Dialogs. Die Kombination brauche ich immer wieder, sei es, um eine Datei f&uuml;r den Import von Daten auszuw&auml;hlen oder den Pfad zum Backend der aktuellen Datenbank zu aktualisieren. Dieser Beitrag zeigt, wie Sie alles in eine Klasse packen und Ihre Formular blitzschnell damit ausstatten.","og_url":"https:\/\/access-im-unternehmen.de\/DateidialogKlasse\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-22T22:00:53+00:00","og_image":[{"url":"http:\/\/vg08.met.vgwort.de\/na\/2c6c45d4164a49a796475b35cabd52ab","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"21\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/DateidialogKlasse\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/DateidialogKlasse\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Dateidialog-Klasse","datePublished":"2020-05-22T22:00:53+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/DateidialogKlasse\/"},"wordCount":3270,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/DateidialogKlasse\/#primaryimage"},"thumbnailUrl":"http:\/\/vg08.met.vgwort.de\/na\/2c6c45d4164a49a796475b35cabd52ab","articleSection":["1\/2011","2011","Mit Formularen arbeiten"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/DateidialogKlasse\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/DateidialogKlasse\/","url":"https:\/\/access-im-unternehmen.de\/DateidialogKlasse\/","name":"Dateidialog-Klasse - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/DateidialogKlasse\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/DateidialogKlasse\/#primaryimage"},"thumbnailUrl":"http:\/\/vg08.met.vgwort.de\/na\/2c6c45d4164a49a796475b35cabd52ab","datePublished":"2020-05-22T22:00:53+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/DateidialogKlasse\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/DateidialogKlasse\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/DateidialogKlasse\/#primaryimage","url":"http:\/\/vg08.met.vgwort.de\/na\/2c6c45d4164a49a796475b35cabd52ab","contentUrl":"http:\/\/vg08.met.vgwort.de\/na\/2c6c45d4164a49a796475b35cabd52ab"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/DateidialogKlasse\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Dateidialog-Klasse"}]},{"@type":"WebSite","@id":"https:\/\/access-im-unternehmen.de\/#website","url":"https:\/\/access-im-unternehmen.de\/","name":"Access im Unternehmen","description":"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access","publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/access-im-unternehmen.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/access-im-unternehmen.de\/#organization","name":"Andr\u00e9 Minhorst Verlag","url":"https:\/\/access-im-unternehmen.de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/","url":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","contentUrl":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","width":370,"height":111,"caption":"Andr\u00e9 Minhorst Verlag"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f","name":"Andr\u00e9 Minhorst","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","caption":"Andr\u00e9 Minhorst"}}]}},"_links":{"self":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000756","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/comments?post=55000756"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000756\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000756"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000756"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000756"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}