[AccessD] Close All Forms

Barbara Ryan BarbaraRyan at cox.net
Fri Aug 19 19:14:45 CDT 2005


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




More information about the AccessD mailing list