Newsgroup: it.comp.appl.access
Titolo: Utilizzo di WithEvents per una gestione globale degli eventi in una  form

Salve a tutti,
Il mio problema è il seguente:
data una maschera vuota già esistente ho la necessità di creare una
serie di controlli all'interno dinamicamente (in runtime per
intenderci)
Ogni gruppo di controllo avrà degli eventi che a priori non posso
implementare in quanto non so esattamente quanti controlli avrà la
maschera, nè, tanto meno i nomi.
Leggendo i vari forum su internet ho scoperto le potenzialità della
parola chiave WithEvents.
In questi form si spiega come creare una classe esterna con uno o più
membri privati dichiarati appunto con la sintassi
public WithEvents <nomeMembro> As <tipo di controllo access>
dopo di che basta implementare nella classe il metodo voluto (change,
click, after_update, ecc..)
e nella form creare un oggetto di quella classe facendo puntare i
mebri al controllo nella form per intercettare gli eventi.
Ovviamente non ero qui a scrivere questo post se mi fosse funzionato
tutto :D
Non ho capito per quale motivo, l'evento non viene intercettato a meno
che nel modulo della form non metta almeno la dichiarazione dello
stesso metodo relativo al controllo linkato.
Riporto il codice di prova per chiarire:
La mia form ha una commandButton che, per ora, ho creato io a mano
####################
# classe clsGlobalCtrl #
####################
Option Compare Database
Option Explicit
Public WithEvents ctrl As Access.CommandButton
Private Sub ctrl_Click()
    MsgBox "io sono " & 
ctrl.name
End Sub
####################
#         FORM             #
####################
Option Compare Database
Option Explicit
Private cls As clsGlobalCtrl
Private Sub Form_Load()
    Set cls = New clsGlobalCtrl
    Set cls.ctrl = Me.Comando0
End Sub
#######################################################
in questo modo se clicco sul pulsante non succede niente, al contrari
ose modifico il codice della form come segue, cioè aggiungendo la sola
dichiarazione della funzione click del comando0, allora quando clicco,
viene richiamata anche la click di ctrl.
qualcuno sa dirmi in cosa sbaglio nell'utilizzo di WithEvents ?
####################
#         FORM             #
####################
Option Compare Database
Option Explicit
Private cls As clsGlobalCtrl
Private Sub Comando0_Click()
End Sub
Private Sub Form_Load()
    Set cls = New clsGlobalCtrl
    Set cls.ctrl = Me.Comando0
End Sub

 stesso metodo relativo al controllo linkato.
Sulla proprieta' del controllo ci deve essere il richiamo alla =[Routine 
Evento]
--
ac

 ac
Grazie mille, adesso funziona tutto.
Non capisco perché questa cosa non è spiegata da nessuna parte
E' tutto il giorno che mi dimeno tra forum ed MSDN :-/


Non serve che questo sia spiegato in MSDN... è ovvio sia così..!
Tu attivi un Oggetto Classe alla quale associ, anche in modo molto
maldestro un Controllo, per il quale ti ricordo si usano le Property
SET e non la dichiarazione
esplicita di variabili Public, cosa che chi usa le classi non fà....!
Ora che questo oggetto abbia per scontato un'evento da gestire è solo
nell'immaginario collettivo... quindi tu devi scriverlo altrimenti
l'oggetto non espone... ed il Controllo Oggetto dichiarato non può
ereditare.
Studiamo le classi e gli oggetti in modo più funzionale.
http://www.alessandrobaraldi.it/DettaglioFaq.asp?IdFAQ=155
http://www.alessandrobaraldi.it/DettaglioFaq.asp?IdFAQ=156
http://www.alessandrobaraldi.it/DettaglioFaq.asp?IdFAQ=157
http://www.alessandrobaraldi.it/DettaglioFaq.asp?IdFAQ=271
Ciao
@Alex

 @Alex
Ciao Alex,
Grazie per avermi fatto un emerita pezza!
E meno male che avevo scritto che ho implementato un codice di prova,
per capire come usare la parola chiave WithEvents (di cui non ne
conoscevo l'esistenza, visto che non sono un guru di VB/VBA).
PS qualunque sia stato il metodo di assegnazione del membro della
classe, diretto o tramite la classica coppia di metodi (let/get)
non penso che una set di una variabile verso un oggetto attivi un
meccanismo di ereditarietà, se pur lo faccia, mi aspetto che una
classe oggetto,
ad esempio la command button dell'esempio, abbia gia nella sua
definizione la dichiarazione di tutti i metodi che espone nella
casella proprietà.
Andare a dire nelle proprietà che a quella procedura corrisponderà un
routine evento, scrivendogli solo una stringa che glielo dica, è un
meccanismo
super contorto se confrontotato con i moderni linguaggi di
programmazione OO. Gli davo più un senso quando nella form mettevo la
dichiarazione vuota del metodo.
Cmq ribadisco che non sono un esperto di VB, quindi sicuramente mi
sfuggiranno dei meccanismi logici di sviluppo su questo linguaggio
Grazie per i link, quelli sono sempre ben accetti

 Grazie per i link, quelli sono sempre ben accetti
Com'e' che invii (sempre) due messaggi?
Uhmmmm........ qualsiasi oggetto, una volta che lo istanzi, tolte le 
attivita' fatte dal costruttore ti mette a disposizione i metodi ma se 
non li richiami e' difficile che vengano eseguiti ed anche in linguaggi 
sistemi ritenuti piu' evoluti, ad esempio Java, se non attivi il 
listener di evento e' difficile che quell'evento venga intercettato.
Questo e' esattamente cio' che e' successo con il command button.
La classe e' sensibile agli eventi ma se non ne attivo il listener 
([Event Procedure], ma potrebbe essere un qualsiasi nome) quell'evento 
non viene intercettato.
Mettere la dichiarazione vuota del metodo quello si mi sembra, 
abbastanza, contorto. Non ho, ne avevo, guardato il tuo codice poiche', 
diciamo, che sapevo dove era il problema e cmq mettere quel metodo in 
quel modo non so se avrebbe risolto il problema (a logica no).
Il VB e' un linguaggio come un altro, fatto delle solite tre istruzioni, 
limitato nella gestione degli oggetti ma in grado di coprire in modo 
semplice la stragrande maggioranza delle necessita' di sviluppo.
Sono solito ripetere che l'informatica e' semplicemente un macinacaffe', 
entra un chicco, macinata ed esce polvere di chicco. ;-{)
--
ac

 ac
Io li chiamo sistemi "Merd-In/Merd-Out" che rende molto molto meglio
l'idea....!
Ciao
@Alex