Verzeichnis in ein Listenfeld auslesen

By , 14. Februar 2010

Kürzlich hatte ich ein Projekt bei dem XML-Dateien importiert wurden. Zur Auswahl der Dateien mussten diese zuvor aus einem Verzeichnis in ein Listenfeld ausgelesen werden.
Um das zu bewerkstelligen bedienen wir uns wieder einmal der „Microsoft Scripting Runtime“ Bibliothek. Diese wird seit Office 2000 mit dem Office-Paket ausgeliefert und beinhaltet verschiedene Objekte die Dateizugriff möglich machen, u.a. auch das aus einem anderen Artikel bekannte FileSystemObject, kurz FSO genannt. Des weiteren werden die Objekte Files() und Folder() im Beispiel verwendet.

Das FileSystemObject hat verschiedene Methoden zum Datei- und Verzeichniszugriff. Wir verwenden im unteren Beispiel die Methoden GetFolder() und FolderExists(). Die Methode Files des Folder-Objektes liefert eine Collection von Dateiobjekten zurück. Diese Objekte kann man über die „Name“ Eigenschaft überprüfen, ob es sich auch um den gewünschten Dateityp handelt, also z.B. „XML“.

Soweit erst mal die graue Theorie, kommen wir zum VBA-Code.
Zuerst die Deklaration der benötigten Objektvariablen. Benötigt wird dazu der Verweis auf Microsoft Scripting Runtime.

    Dim oFSO As Scripting.FileSystemObject
    Dim oFolder As Scripting.Folder
    Dim oFile As Scripting.FILE
    Dim cFile As String

Dann die Zuweisung von oFSO und oFolder:

Set oFSO = New Scripting.FileSystemObject
    If oFSO.FolderExists(Me!Folder) Then
        Set oFolder = oFSO.GetFolder(Me!Folder)

In einer Schleife über oFolder.Files, welches eine Collection aller Dateiobjekte ist, erfolgt das Auslesen der Dateinamen im Verzeichnis:

        For Each oFile In oFolder.Files
            DoEvents
            cFile = oFile.NAME
            If Right(cFile, 3) = "xml" Then
                ReDim Preserve aFiles(i)
                aFiles(i) = cFile
                i = i + 1
            End If
        Next

Zuletzt noch die Zuweisung der Dateinamen an das Listenfeld:

Me!Listenfeld1.RowSource = Join(aFiles, ";")

Read more »

Müssen Formulare immer rechteckig sein?

By , 13. Februar 2010

Hallo,
ich hab mich in letzter Zeit ein wenig mit den Möglichkeiten der GDI32.dll API Bibliothek befasst. Die GDI (Graphik Device Interface) beinhaltet Funktionen um z.B. das Aussehen eines Formulares zu verändern. Ob dreieckig, rund, abgerundet etc ist alles möglich. Auch Kombinationen von Formen sind zulässig.
OK, zugegeben, braucht eigentlich niemand. Aber man darf auch schon mal beim Design der Formulare etwas mehr an Kreativität zeigen als sonst.

Ich möchte euch jetzt zeigen wie ihr Coole runde Formulare erstellt.
Zuerst braucht ihr einen Hintergrund. Benützt dazu euer Grafikprogramm wie z.B. Photoshop etc. und erstellt eine Grafik. macht diese gleich etwas größer als das spätere Formular. Eine Verlaufsebene einfügen, darauf mit einem coolen Stil ein Kreis malen, in den Kreis ein weiterer Kreis mit weissem Hintergrund malen. Dies gibt der Rand eures Formulars.

Dann erstellt ein leeres Formular.
Plaziert darauf eure Steuerelemente wie gewohnt, denkt aber an die spätere Formular form.

Dann kommt der Code-Teil dran. Wir benötigen 3 API Funktionen, SetWindowRgn(), DeleteObject() und CreateEllipticRgn().

Hier der Deklarationsteil:

Private Declare Function SetWindowRgn _
                          Lib "user32" (ByVal hWnd As Long, _
                                        ByVal hRgn As Long, _
                                        ByVal bRedraw As Boolean) As Long

Private Declare Function DeleteObject Lib "gdi32" ( _
                                      ByVal hObject As Long) As Long

Private Declare Function CreateEllipticRgn Lib "gdi32.dll" ( _
                                           ByVal X1 As Long, _
                                           ByVal Y1 As Long, _
                                           ByVal X2 As Long, _
                                           ByVal Y2 As Long) As Long

Dim Region1 As Long

Dann im Ereignis „Beim Laden“ wird die Form geändert. Die Koordinaten müsst ihr entsprechend anpassen, damit es bei euch passt.

Private Sub Form_Load()
    X1 = 29
    Y1 = 50
    X2 = 533
    Y2 = 552
    Me.Picture = CurrentProject.Path & "\hintergrund.gif"
    Region1 = CreateEllipticRgn(X1, Y1, X2, Y2)
    SetWindowRgn Me.hWnd, Region1, True
End Sub

Wenn das Formular entladen wird sollte auch die Form zurückgesetzt werden:

Private Sub Form_Unload(Cancel As Integer)
    DeleteObject Region1
End Sub

Hier noch ein Beispiel wie das ganze aussehen könnte:

Auf www.vbAchiv.net findet ihr zu den API-Funktinonen und zu weiteren Funktionen der GDI Erklärungen.
Ein komplexeres Beispiel als Download findet ihr auf access-o-mania

AV 2010

OfficeFolders theme by Themocracy