Objects




Dim objImage As Image
Dim WithEvents MovingObject As Image

'Copia il puntatore sulla variabile del tipo giusto

'ottenendo un'istanza "illegale" del controllo:

'NOTA: lpImageMove = ObjPtr(ControlloImage)

CopyMemory objImage, lpImageMove, 4

Set MovingObject = objImage
'Rilascia l'istanza 'illegale' delcontrollo senza

'decrementare il reference-countDeve essere sempre eseguito!!

'NON usare Set objImage = Nothing. CRASH!!!

CopyMemory objImage, 0&, 4

'La cosa interessante e' che la variabile MovingObject cosi'

'ottenuta e' perfettamente utilizzabile per ricevere gli

'eventi grazie alla dichiarazione WithEvents.

'A questo punto se vogliamo creare una classe "standard"

'riutilizzabile per lo spostamento di controlli Image

'basta inserire un metodo pubblico nella classe

'(ad esempio Create()) che prende in input un puntatore

'Long alla Image ottenuto con ObjPtr() ed usarlo per

'creare un vero oggetto Image sensibile agli eventi come

'nell'esempio.

'Con un piccolo sforzo in piu' e' addirittura possibile

'implementare un sistema standard per il

'trascinamento-riposizionamento di controlli

'(almeno di quelli intrinseci di VB, come Label, TextBox,

'ecc.) su un Form a run-time: basta aggiungere il supporto

'per gli altri controlli nella classe.

'Per scaricare il codice completo con un esempio pratico

'per VB5 e VB6,

'http://www.beginend.com/vbasic/files/tipsfiles/move.zip

Come tutti sanno, non e' possibile passare come parametro ad
un membro pubblico di una classe pubblica
(intesa come DLL/OCX) un oggetto non definito nella classe
stessa. Normalmente e' possibile farlo dichiarando i
parametri come "As Object", perdendo pero' molte possibilita'
e accettando un calo di prestazioni.

Tempo fa mi sono trovato nelle condizioni di dover
implementare un sistema di trascinamento per alcuni
controlli Image (non drag-drop, ma trascinamento
dell'immagine visibile).

Sarebbe semplice creare una classe riutilizzabile che si
incarica di spostare le Image potendo passare la Image
stessa alla classe.

In questo modo il codice che implementa il movimento
sarebbe presente solo nella classe, e non nelle routine
evento di ogni controllo Image da spostare.

Purtroppo usando un parametro "As Object" non e' possibile
usare WithEvents, quindi la classe non riuscirebbe a
ricevere gli eventi dei controlli Image.

L'illuminazione e' scaturita dalla funzione VBA
nondocumentata ObjPtr(), che restituisce un puntatore
(un numero Long positivo) all'oggetto passatole come
parametro.

E' possibile ottenere dal puntatore restituito da ObjPtr()
unaistanza dell'oggetto originale usando la funzione API
CopyMemory, in questo modo:










( objects.html )- by Paolo Puglisi - Modifica del 17/12/2023