BEISPIEL
Einfügen von Text aus der Zwischenablage (Anfügen):
Text1.SetFocus
Text1.SelStart = Len(Text1.Text)
Text1.SelLength = 0
DoCmd.RunCommand acCmdPaste
Ein Clipboard-Objekt programmieren
Im Folgenden wollen wir selbst ein Clipboard-Objekt programmieren
1
, welches die Funktionalität zum
Kopieren, Einfügen und Löschen der Zwischenablage bereitstellt .
Der erste Schritt ist die Definition eines neuen Klassenmoduls (Menü: Einfügen/Klassenmodul).
Quelltext (Klassendefinition)
Übernehmen Sie folgenden Code in das Klassenmodul:
Option Explicit
Zunächst ein paar Deklarationen, um die entsprechenden API-Funktionen einzubinden:
Private Const CF_TEXT = 1
Private Declare Function OpenClipboard Lib "user32" (ByVal Hwnd As Long) As Long
Private Declare Function CloseClipboard Lib "user32" () As Long
Private Declare Function SetClipboardData Lib "user32" (ByVal wFormat As Long, _
ByVal hMem As Long) As Long
Private Declare Function GetClipboardData Lib "user32" (ByVal wFormat As Long) As Long
Private Declare Function EmptyClipboard Lib "user32" () As Long
Private Declare Function IsClipboardFormatAvailable Lib "user32" (ByVal wFormat As Long) As Long
Speicherverwaltung:
Private Declare Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, ByVal dwBytes As Long) _
As Long
Private Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Function lstrcpy Lib "kernel32" Alias "lstrcpyA" _
(ByVal lpString1 As Long, ByVal lpString2 As String) As Long
Private Declare Function lstrcpy1 Lib "kernel32" Alias "lstrcpyA" _
(ByVal lpString1 As String, ByVal lpString2 As Long) As Long
Private Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As Long
1
VB-Programmierern dürfte das Objekt bekannt vorkommen, ist es doch dort bereits unter dem Namen »Clipboard« implementiert.
827
Zwischenablage
Kapitel 13: Programmschnittstellen
Private Declare Function lstrlen Lib "kernel32" Alias "lstrlenA" (ByVal lpString As Long) As Long
Die leichteste Übung ist noch das Löschen der Zwischenablage:
Public Sub Clear()
If OpenClipboard(0&) = 0 Then Exit Sub
EmptyClipboard
CloseClipboard
End Sub
Etwas aufwändiger wird schon das Abrufen von Informationen aus der Zwischenablage, hat doch Access
immer noch Probleme mit Pointern (aus diesem Grund finden Sie in den obigen API-Deklarationen auch
einige Funktionen zur Speicherverwaltung).
Public Function GetText() As String
Dim hglb As Long, lptstr As Long, zw As String
GetText = ""
If IsClipboardFormatAvailable(CF_TEXT) = 0 Then Exit Function
If OpenClipboard(0&) = 0 Then Exit Function
hglb = GetClipboardData(CF_TEXT)
If (hglb <> 0) Then
lptstr = GlobalLock(hglb)
If (lptstr <> 0) Then
zw = Space(lstrlen(lptstr))
lstrcpy1 zw, lptstr
GlobalUnlock (hglb)
End If
End If
CloseClipboard
GetText = zw
End Function
Der Ablauf ist mit wenigen Worten zusammengefasst:
Testen, ob sich Text in der Zwischenablage befindet.
Öffnen der Zwischenablage.
Einen Handle auf die Zwischenablagedaten abrufen.
Den zugehörigen Speicherbereich sperren.
Einen Puffer (mit Leerzeichen gefüllt) bereitstellen.
Die Daten in diesen Puffer kopieren.
Speicher und Clipboard wieder freigeben.
Ähnlich, aber in umgekehrter Reihenfolge, läuft das Kopieren von Text ab:
Public Sub SetText(zw As String)
Dim hGM As Long, lpGM As Long
hGM = GlobalAlloc(&H42, Len(zw) + 1)
lpGM = GlobalLock(hGM)
lpGM = lstrcpy(lpGM, zw)
If GlobalUnlock(hGM) <> 0 Then Exit Sub
If OpenClipboard(0&) = 0 Then Exit Sub
EmptyClipboard
828
SetClipboardData CF_TEXT, hGM
If CloseClipboard() = 0 Then Exit Sub
End Sub
Beim Speichern der Klasse geben Sie den Namen Clipboard an.
Eine kleine Beispielanwendung soll die Verwendung der o. g. Funktionen
1
verdeutlichen.
Quelltext (Beispielanwendung)
Erstellen Sie ein Formular mit zwei ungebundenen Textfeldern. Fügen Sie weiterhin zwei Befehlsschalt-
flächen ein, über die wir auf die Methoden unseres Clipboard-Objekts zugreifen:
Abbildung 13.1 Testen der Klasse Clipboard
Die Verwendung der Klasse Clipboard ist recht simpel:
Option Explicit
Eine Instanz der Klasse erzeugen:
Private Clipboard As New Clipboard
Private Sub Befehl9_Click()
Kopieren von Text in die Zwischenablage
Clipboard.SetText text1.Value
Einfügen von Text aus der Zwischenablage (Anfügen):
Text2.Value = Clipboard.GetText
End Sub
Private Sub Button2_Click()
DoCmd.Close acForm, Me.Name
End Sub
1
Eigentlich handelt es sich um Methoden, da diese von einer Klasse bereitgestellt werden.
829
Zwischenablage

Get Microsoft Office Access 2007-Programmierung - Das Handbuch now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.