MartyConnelly
martyconnelly at shaw.ca
Fri Aug 19 23:29:14 CDT 2005
You could also try a decompile just in case something flakey happened in the p-code Barbara Ryan wrote: >Since the application is now Access 2002, I can ditch the code I'm using and >use Charlotte's approach or Marty's....Thanks! Barb > > >----- Original Message ----- >From: "Charlotte Foust" <cfoust at infostatsystems.com> >To: "Access Developers discussion and problem solving" ><accessd at databaseadvisors.com> >Sent: Friday, August 19, 2005 6:33 PM >Subject: RE: [AccessD] Close All Forms > > > > >>Yes, I know that Lambert. I just wondered if it blew up the other way >>too, because if so it suggests something is corrupted. Of course, there >>is an entirely different way to do it in Access 2000 and later: use the >>AccessObject and loop through the Application.CurrentProject.AllForms >>collection test the form's IsLoaded property before closing it. ;-} >> >>Charlotte >> >> >>-----Original Message----- >>From: Heenan, Lambert [mailto:Lambert.Heenan at aig.com] >>Sent: Friday, August 19, 2005 2:14 PM >>To: 'Access Developers discussion and problem solving' >>Subject: RE: [AccessD] Close All Forms >> >> >>It's normal practice to go in reverse when destroying items in a >>collection. Here's why... >> >>Say there are three forms open. With this code >> >>For i = Forms.Count - 1 To 0 Step -1 >> >>On the first time through Forms.Count - 1 is evaluated as 2, and I is >>set to 2. >> >>Then DoCmd.Close acForm, Forms(i).Name will close some form in the >>collection (which is closed is unspecified as collections are not >>sorted). >> >>Next time round the loop i is set to 1 and another form is closed. Etc. >>etc. >> >>But if we try doing this in a 'forward' direction we have... >> >> For i = 0 to Forms.Count - 1 >> If Forms(i).Name <> "frmMainMenu" Then >> DoCmd.Close acForm, Forms(i).Name >> End If >> Next i >> >>First time round Count = 3, i is set to 0 and "forms(0)" closes. Next >>time round Count = 2, i = 1 and "forms(1)" closes Next time round Count >>= 1, i = 2 and "Forms(2).Name" generates an error 2456, "The number you >>user to refer to the form is invalid", which is the collection's >>equivalent of "Subscript out of range" >> >>The For loop is optimized by the compiler so that the termination >>condition >>(Forms.Count-1) is only evaluated once. That's why you do it in reverse. >> >> >> >>None of this explains why Barbara is seeing Access crash though. Her >>code is totally legitimate. It's not even anything to do with the fact >>that the 'Function' does not return a value. I'm sure she's set it up >>like that so it can be called from an AutoKey macro. >> >>So we are left with the possibility that the applications p-code is >>corrupt. Time to back it up, then decompile and compact. With any luck >>that will fix it. If not, import all the objects into a new database. >> >>Lambert >> >>-----Original Message----- >>From: accessd-bounces at databaseadvisors.com >>[mailto:accessd-bounces at databaseadvisors.com] On Behalf Of Charlotte >>Foust >>Sent: Friday, August 19, 2005 4:36 PM >>To: Access Developers discussion and problem solving >>Subject: RE: [AccessD] Close All Forms >> >> >>Is there any particular reason you're using a reverse step in this? Have >>you tried it like this: >> >> For i = 0 to Forms.Count - 1 >> If Forms(i).Name <> "frmMainMenu" Then >> DoCmd.Close acForm, Forms(i).Name >> End If >> Next i >> >>Does that also bail out on End Function? >> >>Charlotte Foust >> >> >>-----Original Message----- >>From: Barbara Ryan [mailto:BarbaraRyan at cox.net] >>Sent: Friday, August 19, 2005 11:52 AM >>To: Access List >>Subject: [AccessD] Close All Forms >> >> >>I have used the following code successfully in Access 97 to close all >>forms when a specific function key is pressed. However, in Access 2002, >>this code causes the error box to appear (with the 2 options to send an >>error report to Microsoft or not) and then closes Access. Does anyone >>know why? >> >> Function CloseAllForms() >> Dim i As Integer >> ' Loop through the collection of open forms and close them >>(except for the main menu) >> If Forms.Count > 0 Then >> For i = Forms.Count - 1 To 0 Step -1 >> If Forms(i).Name <> "frmMainMenu" Then >> DoCmd.Close acForm, Forms(i).Name >> End If >> Next i >> End If >> End Function >> >>Thanks, >>Barb Ryan >> >>-- >>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 >>-- >>AccessD mailing list >>AccessD at databaseadvisors.com >>http://databaseadvisors.com/mailman/listinfo/accessd >>Website: http://www.databaseadvisors.com >> >> > > > -- Marty Connelly Victoria, B.C. Canada