ACC2002: Simulieren von Drag/Drop-Fähigkeiten

Dieser Artikel ist eine Übersetzung des folgenden englischsprachigen Artikels der Microsoft Knowledge Base:
287642 ACC2002: How to Simulate Drag-And-Drop Capabilities
Fortgeschritten: Erfordert Fachkenntnisse in den Bereichen Kodierung und Interoperabilität sowie Mehrbenutzerfähigkeiten.

Dieser Artikel bezieht sich auf eine Microsoft Access-Datenbank (.mdb) und ein Microsoft Access-Projekt (.adp).

Eine Microsoft Access 2000-Version dieses Artikels finden Sie unter 233274 .

Zusammenfassung

Microsoft Access verfügt nicht wie Visual Basic über ein integriertes DragDrop-Ereignis für Steuerelemente. Dieser Artikel beschreibt, wie Sie eine Drag/Drop-Prozedur erstellen, die ausgeführt wird, wenn ein Microsoft Access-Steuerelement auf ein anderes Steuerelement gezogen wird.

Dieser Artikel enthält zwei Beispiele, die die Verwendung der Drag/Drop-Prozedur zeigen. Das erste Beispiel zeigt, wie Sie den Wert in einem Steuerelement auf einem Formular auf ein Steuerelement auf einem zweiten Formular ziehen. Das zweite Beispiel zeigt, wie Sie Elemente mittels einer Drag/Drop-Prozedur von einem Listenfeld in ein zweites Listenfeld verschieben. Wenn Sie eine Drag/Drop-Prozedur bei gedrückter [Strg]-Taste durchführen, werden alle Elemente von einer Liste in die zweite Liste verschoben.

Weitere Informationen

Die folgenden vier Prozeduren, DragStart, DragStop, DropDetect and DragDrop sind erforderlich, um Drag/Drop-Fähigkeiten zwischen Steuerelementen in Microsoft Access zu implementieren.

DragStart, DragStop

Verleiht einem Steuerelement die Fähigkeit, gezogen zu werden (Drag-Steuerelement). DragStart und DragStop werden vom MouseDown- bzw. MouseUp-Ereignis für jedes Steuerelement aufgerufen, das die Drag-Fähigkeit haben soll.

Syntax:

Sub DragStart(DragFrm As Form)
wobei DragFrm das Formular mit dem Drag-Steuerelement ist.
Sub DragStop()

Beispiel:

Private Sub MyControl_MouseDown(Button As Integer, Shift As Integer, ...             
DragStart Me
End Sub

Private Sub MyControl_MouseDown(Button As Integer, Shift As Integer, ...
DragStop
End Sub

DropDetect

Verleiht einem Steuerelement die Fähigkeit, ein Drop-Ziel zu sein (Drop-Steuerelement). DropDetect sollte von dem MouseMove-Ereignis für jedes Steuerelement aufgerufen werden, das ein Drop-Ziel für ein Drag-Steuerelement sein soll.

Syntax:

Sub DropDetect(DropFrm As Form, DropCtrl As Control, _
Button As Integer, Shift As Integer, _
X As Single, Y As Single)
wobei:
  • DropFrm das Formular mit dem Drop-Steuerelement ist.
  • DropCtrl das Drop-Steuerelement ist.
  • Button, Shift, X und Y die Parameter des MouseMove-Ereignisses sind.

Beispiel:

Private Sub MyControl_MouseMove(Button As Integer, Shift As ...

DropDetect Me, Me![Personal-Nr], Button, Shift, X, Y
End Sub
Hinweis: Ein Steuerelement kann gezogen werden und ein Drop-Ziel sein, indem DragStart, DragStop und DropDetect von den Ereignissen MouseDown, MouseUp bzw. MouseMove aufgerufen werden.

DragDrop

Diese Prozedur wird aufgerufen, wenn ein Steuerelement mit Drag-Fähigkeit auf ein Steuerelement mit Drop-Fähigkeit gezogen wird. Sie können Ihren eigenen Code zu dieser Prozedur hinzufügen, um zu steuern, welche Reaktion auf eine Drop-Operation folgt. Sie können zum Beispiel den Inhalt des Drag-Steuerelements auf das Drop-Steuerelement kopieren.

Syntax:

Sub DragDrop (DragFrm As Form, DragCtrl As Control, DropFrm As Form, _
DropCtrl As Control, Button As Integer, Shift As Integer, _
X As Single, Y As Single)
wobei:
  • DragFrm das Formular mit dem Drag-Steuerelement ist.
  • DropCtrl das Drag-Steuerelement ist.
  • DropFrm das Formular mit dem Drop-Steuerelement ist.
  • DropCtrl das Drop-Steuerelement ist.
  • Button der Status der Maustasten im Moment der Drop-Operation ist.
  • Shift der Status der Tasten [Umschalt], [Strg] und [Alt] im Moment der Drop-Operation ist.
  • X und Y die x- und y-Koordinaten der Maus an der Stelle sind, an der die Drop-Operation erfolgt ist.

    Hinweis: Für weitere Informationen zu den Argumenten Button, Shift, X und Y suchen Sie nach Hilfethemen zum MouseMove-Ereignis.

Beispiel:

Bei dem folgenden Beispiel wird der Inhalt des Drag-Steuerelements auf das Drop-Steuerelement kopiert, wobei auftretende Fehler erfasst und angezeigt werden:
Sub DragDrop (DragFrm As Form, DragCtrl As Control, ...
On Error Resume Next
DropCtrl = DragCtrl
If Err Then MsgBox Error$
End Sub

BEISPIEL 1: Drag und Drop zwischen Steuerelementen auf zwei Formularen

Das folgende Beispiel zeigt, wie Sie das Kombinationsfeld "Verkäufer" auf dem Nordwind-Formular "Bestellungen" definieren, indem Sie das Feld "Personal-Nr" vom Formular "Personal" ziehen und im Kombinationsfeld "Verkäufer" ablegen.
  1. Öffnen Sie die Beispieldatenbank "Nordwind.mdb".
  2. Erstellen Sie ein neues Modul und geben Sie die folgenden Zeilen in den Deklarationsbereich ein:
    Option Explicit

    Dim DragFrm As Form
    Dim DragCtrl As Control
    Dim DropTime

    Const MAX_DROP_TIME = .1

    Dim CurrentMode As Integer
    Const NO_MODE = 0
    Const DROP_MODE = 1
    Const DRAG_MODE = 2
  3. Geben Sie die folgenden drei Prozeduren ein:
    Sub DragStart (SourceFrm As Form)
    ' Hinweis: Sie sollten nicht Screen.ActiveForm anstelle von SourceFrm
    ' verwenden, weil Sie sonst möglicherweise von einem Unterformular ziehen.
    Set DragFrm = SourceFrm
    Set DragCtrl = Screen.ActiveControl
    CurrentMode = DRAG_MODE
    End Sub

    Sub DragStop ()
    CurrentMode = DROP_MODE
    DropTime = Timer
    End Sub

    Sub DropDetect (DropFrm As Form, DropCtrl As Control, _
    Button As Integer, Shift As Integer, _
    X As Single, Y As Single)

    ' Wenn kein Drop erfolgt ist, Prozedur beenden.
    If CurrentMode <> DROP_MODE Then Exit Sub
    CurrentMode = NO_MODE

    ' Das Zeitgeberintervall ist zwischen dem MouseUp-Ereignis und dem
    ' MouseMove-Ereignis zulässig. Dadurch wird sichergestellt, dass das
    ' MouseMove-Ereignis die Drop-Prozedur nicht startet, sofern es nicht
    ' das MouseMove-Ereignis ist, das Microsoft Access automatisch für
    ' das Drop-Steuerelement auslöst, nachdem das MouseUp-Ereignis
    ' eines Drag-Steuerelements stattgefunden hat. Nachfolgende MouseMove-
    ' Ereignisse bestehen den Zeitgebertest nicht und werden ignoriert.

    If Timer - DropTime > MAX_DROP_TIME Then Exit Sub

    ' Erfolgte Drag/Drop-Operation auf uns selbst?
    If (DragCtrl.Name <> DropCtrl.Name) Or _
    (DragFrm.hWnd <> DropFrm.hWnd) Then
    ' Wenn nicht, war Drag/Drop-Operation erfolgreich.
    DragDrop DragFrm, DragCtrl, DropFrm, DropCtrl, Button, Shift, X, Y
    End If
    End Sub
  4. Geben Sie die folgende DragDrop-Prozedur ein.

    Hinweis: Diese Prozedur muss nicht im selben Modul wie die oben eingegebenen Prozeduren erscheinen. Da Sie den Inhalt der DragDrop-Prozedur so anpassen, dass sie auf eine erfolgreiche Drag/Drop-Operation reagiert, ist es möglicherweise besser, die Prozedur in ein separates Modul zu setzen.
    Sub DragDrop (DragFrm As Form, DragCtrl As Control, _
    DropFrm As Form, DropCtrl As Control, _
    Button As Integer, Shift As Integer, _
    X As Single, Y As Single)

    On Error Resume Next
    DropCtrl = DragCtrl
    If Err Then MsgBox Error$
    End Sub
  5. Öffnen Sie das Formular "Bestellungen" in der Entwurfsansicht und fügen Sie den folgenden OnMouseMove-Ereignisprozedurcode für das Kombinationsfeld "Verkäufer" hinzu:
    Private Sub Personal-Nr_MouseMove (Button As Integer, Shift As Integer, _
    X As Single, Y As Single)
    DropDetect Me, Me![Personal-Nr], Button, Shift, X, Y
    End Sub
    Hinweis: Dieses Steuerelement wird nur ein Drop-Ziel sein.
  6. Öffnen Sie das Formular "Personal" in der Entwurfsansicht und setzen Sie die Eigenschaft Enabled des Textfelds "Personal-Nr" auf Yes.
  7. Fügen Sie den folgenden OnMouseDown-Ereignisprozedurcode für das Steuerelement "Personal-Nr" hinzu:
    Private Sub Personal-Nr_MouseDown (Button As Integer, Shift As Integer, _
    X As Single, Y As Single)
    DragStart Me
    End Sub
    Hinweis: Dieses Steuerelement wird nur ein Drag-Ziel sein.
  8. Fügen Sie den folgenden OnMouseUp-Ereignisprozedurcode für das Steuerelement "Personal-Nr" hinzu:
    Private Sub Personal-Nr_MouseUp (Button As Integer, Shift As Integer, _
    X As Single, Y As Single)
    DragStop
    End Sub
  9. Zeigen Sie das Formular "Bestellungen" in der Formularansicht an und positionieren Sie das Formular in der oberen linken Ecke des Bildschirms.
  10. Zeigen Sie das Formular "Personal" in der Formularansicht an und positionieren Sie es über das Formular "Bestellungen", aber verschieben Sie es so nach rechts, dass das Kombinationsfeld "Verkäufer" auf dem Formular "Bestellungen" noch sichtbar ist.
  11. Halten Sie die Maustaste im Textfeld "Personal-Nr" des Formulars "Personal" gedrückt und ziehen Sie den Mauszeiger (bei gedrückter Maustaste) über das Kombinationsfeld "Verkäufer" im Formular "Bestellungen". Lassen Sie anschließend die Maustaste los.

    Ergebnis: Das Kombinationsfeld "Verkäufer" enthält den Verkäufer, den Sie vom Formular "Personal" gezogen haben. Versuchen Sie, verschiedene Personal-Datensätze zu verschieben und die Personal-Nr in das Kombinationsfeld "Verkäufer" zu ziehen.

BEISPIEL 2: Ziehen und Verschieben von Elementen von einem Listenfeld in ein anderes

Das folgende Beispiel zeigt, wie Sie einem Benutzer eine Liste von Elementen in einem Listenfeld präsentieren und wie Sie diese Elemente mittels einer Drag/Drop-Operation in ein zweites Listenfeld und zurück verschieben.
  1. Führen Sie die ersten vier Schritte von "BEISPIEL 1" aus, um die Drag/Drop-Prozeduren in der Nordwind-Datenbank zu erstellen.
  2. Öffnen Sie die Tabelle "Kunden" in der Entwurfsansicht und fügen Sie das folgende neue Feld hinzu:

    Feldname: Selected
    Datentyp: Yes/No
  3. Erstellen Sie eine neues leeres Formular mit den folgenden Eigenschaften:

    Formular: Listenfeld-Beispiel
    ----------------------
    Beschriftung: Listenfelder
    Datensatzmarkierer: Nein
    Navigationsschaltflächen: Nein
    Bildlaufleisten: Keine

    Listenfeld
    --------------------------------------------------------------
    Name: Liste1
    Herkunftstyp: Tabelle/Abfrage
    Datensatzherkunft: SELECT Kunden-Nr, Firma FROM Kunden WHERE
    Selected=False ORDER BY Firma;
    Spaltenanzahl: 2
    Spaltenbreiten: 0
    Breite: 1,5"
    Höhe: 1,5"

    Listenfeld
    --------------------------------------------------------------
    Name: Liste2
    Herkunftstyp: Tabelle/Abfrage
    Datensatzherkunft: SELECT Kunden-Nr, Firma FROM Kunden WHERE
    Selected=True ORDER BY Firma;
    Spaltenanzahl: 2
    Spaltenbreiten: 0
    Breite: 1,5"
    Höhe: 1,5"
  4. Geben Sie die folgenden Ereignisprozeduren für die Mausereignisse Liste1 und Liste2 ein:
    Private Sub Liste1_MouseDown (Button As Integer, Shift As Integer, _
    X As Single, Y As Single)
    DragStart Me
    End Sub

    Private Sub Liste1_MouseMove (Button As Integer, Shift As Integer, _
    X As Single, Y As Single)
    DropDetect Me, Me![Liste1], Button, Shift, X, Y
    End Sub


    Private Sub Liste1_MouseUp (Button As Integer, Shift As Integer, _
    X As Single, Y As Single)
    DragStop
    End Sub

    Private Sub Liste2_MouseDown (Button As Integer, Shift As Integer, _
    X As Single, Y As Single)
    DragStart Me
    End Sub

    Private Sub Liste2_MouseMove (Button As Integer, Shift As Integer, _
    X As Single, Y As Single)
    DropDetect Me, Me![Liste2], Button, Shift, X, Y
    End Sub

    Private Sub Liste2_MouseUp (Button As Integer, Shift As Integer, _
    X As Single, Y As Single)

    DragStop
    End Sub
  5. Ändern Sie die in Schritt 4 in "Beispiel 1" erstellte DragDrop-Prozedur, so dass sie folgendermaßen aussieht:
    Sub DragDrop (DragFrm As Form, DragCtrl As Control, _
    DropFrm As Form, DropCtrl As Control, _
    Button As Integer, Shift As Integer, _
    X As Single, Y As Single)

    ' Auf welchem Formular wurde abgelegt?
    ' Die DragDrop-Prozedur eignet sich sehr gut, um zu
    ' bestimmen, welche Drag/Drop-Operation erfolgt ist;
    ' anschließend kann der entsprechende Code
    ' aufgerufen werden, um die Sonderfälle zu behandeln.
    Select Case DropFrm.Name
    Case "Listenfeld-Beispiel"
    ListBoxExample DragFrm, DragCtrl, DropFrm, DropCtrl, _
    Button, Shift, X, Y
    Case Else
    ' Bei allen anderen Fällen Inhalt von Drag-
    ' in Drop-Steuerelement kopieren.
    On Error Resume Next
    DropCtrl = DragCtrl
    If Err Then MsgBox Error$
    End Select

    End Sub
  6. Geben Sie die folgende neue Prozedur in das Modul mit der DragDrop-Prozedur ein:
    Sub ListBoxExample (DragFrm As Form, DragCtrl As Control, _
    DropFrm As Form, DropCtrl As Control, _
    Button As Integer, Shift As Integer, _
    X As Single, Y As Single)

    Dim DB As DAO.Database
    Dim SQL As String

    Set DB = CurrentDB()

    ' SQL-Anweisung erstellen, um Feld Selected von
    ' .. Drag/Drop-Listenfeldelement zu aktualisieren.
    SQL = "UPDATE Kunden SET Selected="

    ' Ziehen von Liste1 aktiviert/deaktiviert Selected=True, Liste2
    ' aktiviert/deaktiviert False.
    SQL = IIF(DragCtrl.Name = "Liste1", SQL & "True", SQL & "False")
    ' Wenn [Strg]-Taste nicht verwendet wird, nur gezogenen Wert ändern.
    If (Shift And CTRL_MASK) = 0 Then
    SQL = SQL & " WHERE [Kunden-Nr]='" & DragCtrl & "'"
    End If

    ' Aktualisierungsabfrage ausführen, um Feld Selected von
    ' Kunden-Datensatz/-sätzen zu aktivieren/deaktivieren.
    DB.Execute SQL

    ' Listenfeld-Steuerelemente neu abfragen, um
    ' Aktualisierungslisten anzuzeigen.
    DragCtrl.Requery
    DropCtrl.Requery

    End Sub
  7. Zeigen Sie das Formular "Listenfeld-Beispiel" in der Formularansicht an und ziehen Sie anschließend Firmennamen von einer Liste in die andere und zurück. Drücken Sie die [Strg]-Taste und ziehen Sie ALLE Zeilen, um sie von einer Liste in die andere zu verschieben.


Bitte beachten Sie: Bei diesem Artikel handelt es sich um eine Übersetzung aus dem Englischen. Es ist möglich, dass nachträgliche Änderungen bzw. Ergänzungen im englischen Originalartikel in dieser Übersetzung nicht berücksichtigt sind. Die in diesem Artikel enthaltenen Informationen basieren auf der/den englischsprachigen Produktversion(en). Die Richtigkeit dieser Informationen in Zusammenhang mit anderssprachigen Produktversionen wurde im Rahmen dieser Übersetzung nicht getestet. Microsoft stellt diese Informationen ohne Gewähr für Richtigkeit bzw. Funktionalität zur Verfügung und übernimmt auch keine Gewährleistung bezüglich der Vollständigkeit oder Richtigkeit der Übersetzung.
Eigenschaften

Artikelnummer: 287642 – Letzte Überarbeitung: 24.04.2003 – Revision: 1

Feedback