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: |