04 settembre, 2007

Gestione della clipboard con Access VBA

Mi sono trovato ultimamente ad utilizzare access per un piccolo progetto e, nel momento del debug,mi sono reso conto che il vba access non ha una gestione della clipboard. A cosa potrà servire la clipboard se hai a disposizione un database, direte voi. Certo la domanda è legittima, ed in effetti si può anche evitare di usarle,inserendo i valori necessari all'interno di una cella, ma per questioni di praticità,efficienza e velocità, mi sono reso conto che la maniera più comoda di gestire il debug del sql di access è proprio la copia della stringa contenente il sql nella clipboard. Cmq poco importa a cosa possa servire questa funzionalità, l'importante è sapere che si può fare e come sono le modalità per farlo.
Per prima cosa dobbiamo creare un nuovo modulo, anche dalla finestra oggetti, e successivamente inserire questo codice che io sinceramente non ho nemmeno letto:
Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) _
As Long
Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) _
As Long
Declare Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, _
ByVal dwBytes As Long) As Long
Declare Function CloseClipboard Lib "User32" () As Long
Declare Function OpenClipboard Lib "User32" (ByVal hwnd As Long) _
As Long
Declare Function EmptyClipboard Lib "User32" () As Long
Declare Function lstrcpy Lib "kernel32" (ByVal lpString1 As Any, _
ByVal lpString2 As Any) As Long
Declare Function SetClipboardData Lib "User32" (ByVal wFormat _
As Long, ByVal hMem As Long) As Long

Public Const GHND = &H42
Public Const CF_TEXT = 1
Public Const MAXSIZE = 4096

Function ClipBoard_SetData(MyString As String)
Dim hGlobalMemory As Long, lpGlobalMemory As Long
Dim hClipMemory As Long, X As Long

' Allocate moveable global memory.
'-------------------------------------------
hGlobalMemory = GlobalAlloc(GHND, Len(MyString) + 1)

' Lock the block to get a far pointer
' to this memory.
lpGlobalMemory = GlobalLock(hGlobalMemory)

' Copy the string to this global memory.
lpGlobalMemory = lstrcpy(lpGlobalMemory, MyString)

' Unlock the memory.
If GlobalUnlock(hGlobalMemory) <> 0 Then
MsgBox "Could not unlock memory location. Copy aborted."
GoTo OutOfHere2
End If

' Open the Clipboard to copy data to.
If OpenClipboard(0&) = 0 Then
MsgBox "Could not open the Clipboard. Copy aborted."
Exit Function
End If

' Clear the Clipboard.
X = EmptyClipboard()

' Copy the data to the Clipboard.
hClipMemory = SetClipboardData(CF_TEXT, hGlobalMemory)

OutOfHere2:

If CloseClipboard() = 0 Then
MsgBox "Could not close Clipboard."
End If

End Function
Il tutto al di sotto della scritta Option Compare Database.
Fatto questo nel codice della nostra form dovremmo scrivere:
ClipBoard_SetData STRINGA

dove STRINGA è il nome della variabile di tipo String che contiene il nostro sql.
Fatto questo basterà creare una query farlocca nel quale inserire di volta in volta il sql presente nella clipboard cliccando il nostro ben conosciuto ctrl+v.

Nessun commento: