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.mdbVBProjekt.zip
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.
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
Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...
den kompletten Artikel im PDF-Format mit Beispieldatenbank
diesen und alle anderen Artikel mit dem Jahresabo