Zur Hauptseite ... Zum Onlinearchiv ... Zum Abonnement ... Zum Newsletter ... Zu den Tools ... Zum Impressum ... Zum Login ...

Achtung: Dies ist nicht der vollständige Artikel, sondern nur ein paar Seiten davon. Wenn Sie hier nicht erfahren, was Sie wissen möchten, finden Sie am Ende Informationen darüber, wie Sie den ganzen Artikel lesen können.

Kompletten Artikel lesen?

Einfach für den Newsletter anmelden, dann lesen Sie schon in einer Minute den kompletten Artikel und erhalten die Beispieldatenbanken.

E-Mail:

Gedrucktes Heft

Diesen Beitrag finden Sie in Ausgabe 1/2006.

Unser Angebot für Sie!

Lesen Sie diesen Beitrag und 500 andere sofort im Onlinearchiv, und erhalten Sie alle zwei Monate brandheißes Access-Know-how auf 72 gedruckten Seiten! Plus attraktive Präsente, zum Beispiel das bald erscheinende Buch 'Access 2010 - Das Grundlagenbuch für Entwickler'!

Diesen Beitrag twittern

Zusammenfassung

Erweitern Sie Access-Formulare um die Möglichkeit, Dateinamen durch Ziehen der Datei auf ein Formular zu erfassen.

Techniken

VBA, Klassen, Subclassing, VB6

Voraussetzungen

Access 2000 und höher

Beispieldateien

DragDrop.mdb, DragDrop_AllInOne.mdb
VBProjekt.zip

Dateinamen per Drag and Drop

André Minhorst, Duisburg

Wenn Sie einen Dateinamen in einer Tabelle speichern oder diesen anderweitig in einer Access-Datenbank verwenden möchten, verwenden Sie den entsprechenden Dateidialog zur Auswahl der gewünschten Datei. Es gibt aber auch Lösungen, die vielleicht eine zusätzliche Variante anbieten möchten: Beispielsweise wäre das Ziehen und Ablegen der Datei aus dem Windows Explorer in ein passendes Textfeld eine sinnvolle Alternative - ganz so, wie Sie es auch mit dem Ausführen-Fenster von Windows tun können.

Häufig verwendet man ja sogar das Ausführen-Fenster (Windows-Startmenü/Ausführen), um schnell einen Dateinamen inklusive Pfad in die Zwischenablage zu befördern und anschließend weiterzuverwenden.

Wenn das in einer Anwendung öfter notwendig ist, kann das aber schnell nerven, denn dieses Fenster wird nicht wie die anderen Anwendungen in der Taskleiste angezeigt.

Also sorgen Sie für eine Alternative, die zwar eine DLL benötigt, aber dennoch das direkte Ziehen von Dateien in Access-Formulare und die dortige Weiterverwendung ermöglicht.

Drag and Drop nachrüsten

Die Funktionalität zum Erfassen von Dateinamen per Drag and Drop kann man in Access auf zwei Arten bereitstellen: Erstens können Sie die dazu notwendigen Module einfach in das VBA-Projekt der gewünschten Access-Datenbank integrieren. Zweitens können Sie eine .dll-Datei mit der Funktionalität erstellen und vom VBA-Projekt der entsprechenden Access-Datenbank aus referenzieren.

Erstere Variante verwendet Subclassing und das kommt sich gelegentlich mit dem VBA-Editor ins Gehege. Daher stellt Access im Unternehmen hier die Variante mit der .dll vor; die Alternative finden Sie allerdings in einer zusätzlichen Beispieldatenbank.

Die DLL können Sie wahlweise selbst erstellen (Visual Studio 6.0 vorausgesetzt) oder einfach der Heft-CD entnehmen und entsprechend registrieren.

DLL selbst erstellen

Wenn Sie die DLL selbst erstellen möchten, führen Sie einfach die folgenden Schritte durch:

Quellcode 1: Code der Klasse CDragDrop

Option Compare Text

Option Explicit

Private frm As Object

Private txt As Object

Public Event FileDropped(Filename As String)

Public Event ManyFilesDropped(Filenames As Variant)

Public Property Set Form(frmIn As Object)

    Set frm = frmIn

End Property

Public Property Set textbox(txtin As Object)

    Set txt = txtin

End Property

Public Sub SubClassHookForm()

    Call DragAcceptFiles(frm.hWnd, 1)

    lpPrevWndProc = SetWindowLong(frm.hWnd, GWL_WNDPROC, _
        AddressOf WindowProc)

    Set CDrag = Me

End Sub

Public Sub SubClassUnHookForm()

    Call SetWindowLong(frm.hWnd, GWL_WNDPROC, lpPrevWndProc)

    Call DragAcceptFiles(frm.hWnd, 0)

End Sub

Sub AcceptDroppedFiles(hDrop As Long)

    Dim lNumOfFiles As Long

    Dim lReturn As Long

    Dim sFilename As String

    Dim lm As Long

    Dim arrFiles() As String

    'Anzahl der Dateien ermitteln

    lNumOfFiles = DragQueryFile(hDrop, GetNumOfFiles, 0&, 0)

    For lm = 0 To lNumOfFiles

        'Variable für den Dateinamen vorbereiten

        sFilename = String$(257, 0)

        'Dateiname ermitteln

        lReturn = DragQueryFile(hDrop, lm, sFilename, _
            Len(sFilename))

        'Dateiname zur Liste hinzufügen

        If lReturn > 0 Then

            sFilename = Trim(Left$(sFilename, _
                InStr(1, sFilename, vbNullChar) - 1))

            txt.Text = txt.Text & sFilename & vbCrLf

        End If

        If lNumOfFiles = 1 And lm = 0 Then

            RaiseEvent FileDropped(sFilename)

        Else

            ReDim Preserve arrFiles(lm)

            arrFiles(lm) = sFilename

        End If

    Next lm

    If lNumOfFiles > 1 Then RaiseEvent _
        ManyFilesDropped(arrFiles)

    'Speicherplatz freigeben

    DragFinish hDrop

End Sub

Vorhandene DLL registrieren

Wenn Sie gerade kein Visual Studio 6.0 zur Hand haben, können Sie auch die fertige DLL von der Heft-CD verwenden.

Diese müssen Sie nur in ein Verzeichnis Ihrer Wahl kopieren (am besten zu den anderen DLLs ins Verzeichnis c:\Windows\System32) und mit folgender Anweisung im Ausführen-Dialog von Windows registrieren:

Regsvr32.exe 
<Name der DLL>

Einbinden der DLL in ein Formular

Nach Fertigstellung der DLL müssen Sie diese in das VBA-Projekt der MDB und die Klasse CDragDrop in das gewünschte Formular einbinden:

Quellcode 2: Code der Klasse CDragDrop

Option Compare Text

Option Explicit

Public CDrag As CDragDrop

Public lpPrevWndProc As Long

Public Const GWL_WNDPROC = (-4)

Public Const WM_DROPFILES = &H233

Public Const GetNumOfFiles = &HFFFF

Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" _

    (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal _

    wParam As Long, ByVal lParam As Long) As Long

Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
    (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long

Public Declare Sub DragAcceptFiles Lib "shell32.dll" (ByVal hWnd As Long, ByVal _
    fAccept As Long)

Public Declare Sub DragFinish Lib "shell32.dll" (ByVal hDrop As Long)

Public Declare Function DragQueryFile Lib "shell32.dll" Alias "DragQueryFileA" _
    (ByVal hDrop As Long, ByVal lFile As Long, ByVal lpFileName As String, ByVal _
    cbLen As Long) As Long

Public Function WindowProc(ByVal hWnd As Long, ByVal Msg As Long, ByVal wp As Long, _
    ByVal lp As Long) As Long

    On Error Resume Next

    WindowProc = CallWindowProc(lpPrevWndProc, hWnd, Msg, wp, lp)    

    'Files have been dropped

    If Msg = WM_DROPFILES Then CDrag.AcceptDroppedFiles wp

End Function

Nun wird es schon Zeit für den ersten Test: Also flugs den Windows Explorer und das Access-Fenster nebeneinander positioniert und los geht’s: Sie ziehen eine beliebige Datei auf das Formular und voilà! - der Dateiname wird im Textfeld angezeigt (s. Abb. 2).

Quellcode 3: Ereignisprozeduren des Formulars frmDragDrop

Option Compare Database

Option Explicit

Dim CDrag As New CDragDrop

Private Sub Form_Load()    

    'Subclass the form

    Set CDrag.TextBox = Me!txtDragDrop

    Set CDrag.Form = Me

    CDrag.SubClassHookForm

End Sub

Private Sub Form_Unload(Cancel As Integer)    

    'UnSubclass the form

    CDrag.SubClassUnHookForm

    Set CDrag.Form = Nothing

    Set CDrag.TextBox = Nothing

    Set CDrag = Nothing

End Sub

Abb. 1: Herstellen eines Verweises auf die DragDrop-DLL

Abb. 2: Das Ziehen und Ablegen einer Datei in das Textfeld txtDragDrop führt zur Anzeige des passenden Dateinamens.

Sie haben das Ende des frei verfügbaren Teils des Artikels erreicht. Lesen Sie weiter, um zu erfahren, wie Sie den vollständigen Artikel lesen und auf viele hundert weitere Artikel zugreifen können.

Sind Sie Abonnent?Jetzt einloggen ...
 

Kompletten Artikel lesen?

Einfach für den Newsletter anmelden, dann lesen Sie schon in einer Minute den kompletten Artikel und erhalten die Beispieldatenbanken.

E-Mail:

© 2003-2015 André Minhorst Alle Rechte vorbehalten.