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.
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. 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 \\Computer5\C\Eigene Dateien\Konzept.doc
Eine Mantelfunktion für den Aufruf der Standarddialoge Der Aufruf eines Standarddialogs geschieht in drei Schritten:
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 Dieser Workshop wurde bereits 22.986 mal aufgerufen.
Anzeige
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. |
sevWizard für VB5/6 Professionelle Assistenten im Handumdrehen Erstellen Sie eigene Assistenten (Wizards) im Look & Feel von Windows 2000/XP - mit allem Komfort und zwar in Windeseile :-) Tipp des Monats Oktober 2024 Heinz Prelle Firewall-Status unter WinXP/Vista prüfen Das Beispiel prüft, ob die Firewall unter Windows XP/Vista eingeschaltet ist oder nicht. Zudem wird eine Abfrage durchgeführt ob es sich bei dem zugrundeliegenden Betriebssystem um Windows XP/Vista handelt oder nicht. Access-Tools Vol.1 Über 400 MByte Inhalt Mehr als 250 Access-Beispiele, 25 Add-Ins und ActiveX-Komponenten, 16 VB-Projekt inkl. Source, mehr als 320 Tipps & Tricks für Access und VB |
||||||||||||||||||
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. |