Sto cercando di intercettare gli eventi scatenati in un subform per gestirli all'interno di una classe.
Attualmente ho un form che contiene 1 subform. Nel form ho dichiarato ed instanziato una classe che ha tra gli altri compiti, quello di ricevere gli eventi provenienti dai controlli (label, text,button, etc) presenti nel form e nel subform e gli eventi provenienti dal form e dai subform (afterupdate, dirty, etc). Riesco a intercettare gli eventi che mi interessano tranne gli eventi dei subform (i.e. dirty).
Ecco un poco di codice ...
ANCF_REPL (Form Principale) :
Public WithEvents mFMR As clsFormRepl ' Classe principale (DEVE ESSERE PUBLIC)
Private Sub Form_Load()
Set mFMR = New clsFormRepl
' routine che carica i controlli per i quali voglio gestire gli eventi
Dummy = mFMR.FormREPL_Load(Me)
....
End Sub
clsFormRepl (Classe) :
Nota : questa classe memorizza in una collection i controlli per i quali voglio gestire gli eventi. Per questo scopo viene utilizzata la classe cls_EVListener_REPL (mostrata successivamente).
Private WithEvents mFCaller As Access.Form ' Form Chiamante
Private mColControls As Collection ' Collection di controlli del form chiamante
Private Sub Class_Initialize()
Set mFCaller = Application.CodeContextObject
Set mColControls = New Collection
...
End Sub
Public Function FormREPL_Load(accFR As Access.Form) As Boolean
' Carica collection di Controlli
mDummy = REPL_LoadControls(accFR)
...
End Sub
Private Function REPL_LoadControls(ReplForm As Access.Form) As Boolean
Dim ctItem As control
Dim sKey As String
Dim iFind As Integer
'
' Funzione ricorsiva : passo il riferimento del form chiamante (non uso MFCaller)
'
For Each ctItem In ReplForm.Controls
If ctItem.ControlType = acSubform Then
sKey = "C" & Format(Me.CountControl + 1, "0000")
AddControl ctItem, sKey
'
mDummy = REPL_LoadControls(ctItem.Form)
Else
'
' Memorizzo i Controlli per i quali voglio, eventualmente,
' gestirne gli eventi in Cls_EvListener_REPL
'
Select Case ctItem.ControlType
Case Is = acCommandButton
'
Case Is = acLabel
If ctItem.Parent.Name = ReplForm.Name Then
If InStr(1, UCase(ctItem.Name), "TITLE") > 0 Then
sKey = "C" & Format(Me.CountControl + 1, "0000")
AddControl ctItem, sKey
End If
End If
End Select
End If
DoEvents
Next ctItem
Set ctItem = Nothing
REPL_LoadControls = True
End Function
Private Function AddControl(obj As control, sKey As String) As Boolean
Dim curClass As cls_EvListener_REPL
If Not ExistsControl(sKey) Then
Set curClass = New cls_EvListener_REPL
curClass.SetObjectControl obj, Me
curClass.Key = sKey
' memorizzo in una collection i controlli
mColControls.Add curClass, sKey
Else
Set curClass = mColControls(obj.Name)
End If
Set curClass = Nothing
AddControl = True
End Function
Private Sub mFCaller_Dirty(cancel As Integer)
'Evento Dirty (del FORM principale) nella classe : regolarmente intercettato
End Sub
cls_EvListener_REPL (Classe che intercetta gli eventi dei controlli)
Private mParent As clsFormRepl ' Classe Chiamante
Private mPassedCtrl As control
Private WithEvents Lbl As Access.Label
Private WithEvents SFm As Access.SubForm
....
Public Property Set control(ByRef PassedControl As control)
Set mPassedCtrl = PassedControl
'
' Aggiungere gli eventi da gestire per ogni controllo
'
Select Case TypeName(mPassedCtrl)
Case "Label"
' Gli eventi sulla label sono disponibili SOLO se la label è detached ...
mPassedCtrl.OnClick = "[Event Procedure]"
Set Lbl = mPassedCtrl
Case "SubForm"
mPassedCtrl.Form.OnDirty = "[Event Procedure]" -> FORSE Sbaglio la sintassi per intercettare l'evento
Set SFm = mPassedCtrl
....
End Select
'
' Nota : occorre creare le sub degli eventi da gestire per i vari tipi di controllo
' i.e. : evento Click su CommandButton -> Public Sub Btn_Click()
'
End Property
Public Sub SetObjectControl(ctl As control, ParentClass As clsFormRepl)
Set Me.Parent = ParentClass
Set Me.control = ctl
End Sub
Public Sub SFm_Dirty(cancel As Integer)
' Evento Dirty Subform nella Classe -> questo evento NON riesco ad intercettarlo
End Sub
Public Sub Lbl_Click()
' Evento Click su label in SubFrom nella Classe -> questo evento riesco ad intercettarlo
End Sub
Credo di aver inserito le parti salienti di codice.
Di fatto riesco ad intercettare gli eventi provenienti dai controlli presenti nel subform ma non riesco ad intercettare gli eventi del subform stesso.
Credo che la parte incriminata sia in questa parte di codice :
Case "SubForm"
mPassedCtrl.Form.OnDirty = "[Event Procedure]" -> FORSE Sbaglio la sintassi per intercettare l'evento
Set SFm = mPassedCtrl
Se scrivo mPassedCtrl.OnDirty ottengo errore runtime 438 (proprietà o metodo non supportati dall'oggetto).
Sono conscio che si tratta di un utilizzo non proprio basico di Access ma spero che qualcuno intraveda quello che a me sfugge.