jwcolby
jwcolby at colbyconsulting.com
Fri Mar 21 21:15:42 CDT 2008
Class_Terminate not running means the class is not closing. The class does not close because there is still a reference to the class somewhere. The last reference to the class being set to nothing causes the VBA garbage collector to shut it down and destroy the instance, returning the memory to the pool. The only time I have ever seen something inside the class from preventing shutdown is when the class references itself. This technique is used to hold an instance open without an external pointer to the class, and this is usually only used for multiple instances of forms. If a class references itself (holds itself open) then it has to be capable of setting its self reference to nothing. Something has to trigger that or the class will never close. Again this is very rare though. More than likely you have several pointers to the class and one of them is not being set to nothing. Every single pointer to the class has to be set to nothing. The _Terminate will fire whenever that last pointer is set to nothing. John W. Colby Colby Consulting www.ColbyConsulting.com -----Original Message----- From: accessd-bounces at databaseadvisors.com [mailto:accessd-bounces at databaseadvisors.com] On Behalf Of Robert Sent: Friday, March 21, 2008 8:48 PM To: 'Access Developers discussion and problem solving' Subject: Re: [AccessD] Closing & Destroying Objects John, Thank you... How do you find the cause of setting a class to nothing, and the Class_Terminate sub not running.. I'm assuming something is still open within the class, but just can't see it.. Set qbc = Nothing Does not cause the Class_Terminate() sub to run.. Thanks Again. WBR Robert -----Original Message----- From: accessd-bounces at databaseadvisors.com [mailto:accessd-bounces at databaseadvisors.com] On Behalf Of jwcolby Sent: Friday, March 21, 2008 7:12 PM To: 'Access Developers discussion and problem solving' Subject: Re: [AccessD] Closing & Destroying Objects You need to set pointers to nothing EVERYWHERE. You need to close before setting pointers to nothing in the last place that the recordset is used. John W. Colby Colby Consulting www.ColbyConsulting.com -----Original Message----- From: accessd-bounces at databaseadvisors.com [mailto:accessd-bounces at databaseadvisors.com] On Behalf Of Robert Sent: Friday, March 21, 2008 6:09 PM To: 'Access Developers discussion and problem solving' Subject: [AccessD] Closing & Destroying Objects Hello Group, I have a question about how to close an object correctly.. Dim rstWOS As DAO.Recordset Set rstWOS = db.OpenRecordset("qryServicesNavigator", dbOpenDynaset, dbInconsistent) I do a findfirst on rstWOS which I pass to another form. Like such.. DoCmd.OpenForm "frmMsgboxWODelete", , , , , acHidden With Form_frmMsgboxWODelete .CallingForm = "Calander" .RN = EventRN Set .rst = rstWOS .Visible = True End With In the form it's a property Private m_objRst As DAO.Recordset Public Property Set rst(objRst As DAO.Recordset) Set m_objRst = objRst End Property Where do I Properly close and destroy the recordset, in the first or the second or both? I'm thinking that I need to destroy it on the first, as if I destroy it on second via: Private Sub Form_Unload(Cancel As Integer) If Not m_objRst Is Nothing Then m_objRst.Close Set m_objRst = Nothing End If End Sub Then I get some very strange problems trying to destroy in on the first.. Like and Error 3420 Oject Invalid or No Longer Set Via: (because the recordset is already closed??) If Not rstWOS Is Nothing Then rstWOS.Close Set rstWOS = Nothing End If TIA... WBR Robert -- AccessD mailing list AccessD at databaseadvisors.com http://databaseadvisors.com/mailman/listinfo/accessd Website: http://www.databaseadvisors.com -- AccessD mailing list AccessD at databaseadvisors.com http://databaseadvisors.com/mailman/listinfo/accessd Website: http://www.databaseadvisors.com -- AccessD mailing list AccessD at databaseadvisors.com http://databaseadvisors.com/mailman/listinfo/accessd Website: http://www.databaseadvisors.com