Solved

form reloads on it's own

Posted on 2003-12-02
16
383 Views
Last Modified: 2010-05-01
i have a form that has a timer control.  in the form_unload procedure i make the timer.enabled=false.  sometimes the form reloads immediately after it's form_unload completes (happens intermittenylty, maybe once out 10, always randomly).  i have a feeling that even though the timer is disabled, a function that is called in the timer has not finished and is referencing a control's event after the form has unloaded, therefore the form reloads to facilitate the event.

is this plausible? and if so how can one prevent this from happening?
0
Comment
Question by:howardsd
  • 7
  • 3
  • 3
  • +2
16 Comments
 
LVL 26

Expert Comment

by:EDDYKT
ID: 9861057
Do you have doevents in your code?
0
 

Author Comment

by:howardsd
ID: 9861106
no
0
 
LVL 2

Expert Comment

by:devoted2christ
ID: 9861199
Is disabling the timer the only thing in your form_unload procedure? And when the form reloads, is the timer enabled or disabled?
0
 
LVL 26

Expert Comment

by:EDDYKT
ID: 9861222
shows us the queryunload routine
0
 

Author Comment

by:howardsd
ID: 9861350
here's the unload routine.  in the form_load routine the timer gets enabled.

Private Sub Form_Unload(Cancel As Integer)

On Error GoTo err
  Timer1.Enabled = False

  If dbvalueconnection.state = adStateOpen Then
    dbvalueconnection.Close
  End If

  closeRecordsets rsvalueread, rsvalueidread
 
  Screen.MousePointer = vbDefault
 
  Set dbvalueconnection = Nothing
  Set rsvalueread = Nothing
  Set rsvalueidread = Nothing

  Exit Sub
 
err:
  If err <> 0 Then
    MsgBox err.Source & "-->" & err.Description, vbOKOnly, "Form unload failure"
  End If
End Sub
0
 
LVL 2

Expert Comment

by:devoted2christ
ID: 9861524
Try putting a Sleep in there (after the disabling) to delay the rest of the events...
0
 

Author Comment

by:howardsd
ID: 9861831
with a Sleep(2000) i get the same result.  i close the form, its waits 2 seconds, closes, then the form pops right back up.  still occuring randomly, no real pattern for when it does/doesn't happen).
0
 
LVL 85

Expert Comment

by:Mike Tomlinson
ID: 9862299
I think you need to show us what is in the Timer routine.

Idle_Mind
0
Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

 

Author Comment

by:howardsd
ID: 9862323
Private Sub Timer1_Timer()
Dim d As String

  d = String(200, 0)
  l = SCardComand(0, "Card,Info,Status", 0, nil, 0, d, 200)
  d = Left(d, InStr(d, Chr(0)) - 1)
 
  If l = 0 Then
    If d = "active" Then
      cardStatus.Caption = "card in reader"
      If iSnglRead = False Then
        ' if no problems during read and loyalty id the active screen make form able
        If fillForm = True Then
          cmdAdd.Enabled = True
          cmdSub.Enabled = True
          cmdWriteCustCrd.Enabled = True
          cmdWriteRetailerCrd.Enabled = True
        End If
        iSnglClr = False
        iSnglRead = True
      End If
    ElseIf d = "wait" Then
      cardStatus.Caption = "insert card"
      If iSnglClr = False Then
        Call clearControlsValue
        lblCardHolder.Caption = ""
        cmdAdd.Enabled = False
        cmdSub.Enabled = False
        cmdWriteCustCrd.Enabled = False
        cmdWriteRetailerCrd.Enabled = False
        iSnglClr = True
        iSnglRead = False
      End If
    Else
      cardStatus.Caption = d
      cmdAdd.Enabled = False
      cmdSub.Enabled = False
    End If
  End If
End Sub
0
 

Author Comment

by:howardsd
ID: 9862351
the fillForm function reads a smart card and fills the form with the contents of the card
0
 
LVL 2

Expert Comment

by:ramyhh
ID: 9862391
add in the unload:

set form1 = nothing ' where form1 is the name of the form
0
 
LVL 2

Expert Comment

by:devoted2christ
ID: 9862440
Where is the form being controlled from? Is it the main form of the program, or is there another form or procedure that opens it? If the second is true, then is there any call being made to the form by the form that called it?
0
 

Author Comment

by:howardsd
ID: 9862499
this is the main form, but it is loaded by a splash form that flashes the user when the app is started. here is the form_load procedure for the splash form

valueSplash is the splash form (duh)
loyalty is the main form

Private Sub Form_Load()
  valueSplash.Show 0    
  Refresh  
  Sleep 2500
  valueSplash.Hide
  Unload valueSplash
  Load loyalty
End Sub
0
 
LVL 85

Accepted Solution

by:
Mike Tomlinson earned 50 total points
ID: 9862590
If there is code executing in a loop or timer sub, it will prevent a form from unloading.    I have also seen cases where refreshing a control on the form will make it appear.

You could try adding a global boolean variable "unloading" and then set it to true in your form_unload sub.
Then in your timer code, check it before attempting to update your form controls.

Idle_Mind

Give this a whirl and see if it makes a difference.

' Code Follows...
Private unloading As Boolean

Private Sub Form_Load()
    unloading = False
End Sub

Private Sub Form_Unload(Cancel As Integer)

On Error GoTo err
  unloading = True ' <----- added line
  Timer1.Enabled = False

  If dbvalueconnection.state = adStateOpen Then
    dbvalueconnection.Close
  End If

  closeRecordsets rsvalueread, rsvalueidread
 
  Screen.MousePointer = vbDefault
 
  Set dbvalueconnection = Nothing
  Set rsvalueread = Nothing
  Set rsvalueidread = Nothing

  Exit Sub
 
err:
  If err <> 0 Then
    MsgBox err.Source & "-->" & err.Description, vbOKOnly, "Form unload failure"
  End If
End Sub

Private Sub Timer1_Timer()
Dim d As String

  d = String(200, 0)
  l = SCardComand(0, "Card,Info,Status", 0, nil, 0, d, 200)
  d = Left(d, InStr(d, Chr(0)) - 1)
 
  If l = 0 Then
    If d = "active" And Not unloading Then ' <--- if we are not unloading....
      cardStatus.Caption = "card in reader"
      If iSnglRead = False And Not unloading Then ' <--- if we are not unloading....
        ' if no problems during read and loyalty id the active screen make form able
        If fillForm = True And Not unloading Then ' <--- if we are not unloading....
          cmdAdd.Enabled = True
          cmdSub.Enabled = True
          cmdWriteCustCrd.Enabled = True
          cmdWriteRetailerCrd.Enabled = True
        End If
        iSnglClr = False
        iSnglRead = True
      End If
    ElseIf d = "wait" And Not unloading Then ' <--- if we are not unloading....
      cardStatus.Caption = "insert card"
      If iSnglClr = False And Not unloading Then ' <--- if we are not unloading....
        Call clearControlsValue
        lblCardHolder.Caption = ""
        cmdAdd.Enabled = False
        cmdSub.Enabled = False
        cmdWriteCustCrd.Enabled = False
        cmdWriteRetailerCrd.Enabled = False
        iSnglClr = True
        iSnglRead = False
      End If
    ElseIf  Not unloading then ' <--- if we are not unloading....
      cardStatus.Caption = d
      cmdAdd.Enabled = False
      cmdSub.Enabled = False
    End If
  End If
End Sub
0
 

Author Comment

by:howardsd
ID: 9862712
that seemed to have done it.  i tested 30 times without the occurence whereas before it happened at least 1 in 10

thnx!!!
0
 
LVL 85

Expert Comment

by:Mike Tomlinson
ID: 9862749
No Problem.

Glad I could help.

Idle_Mind
0

Featured Post

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Introduction While answering a recent question about filtering a custom class collection, I realized that this could be accomplished with very little code by using the ScriptControl (SC) library.  This article will introduce you to the SC library a…
Have you ever wanted to restrict the users input in a textbox to numbers, and while doing that make sure that they can't 'cheat' by pasting in non-numeric text? Of course you can do that with code you write yourself but it's tedious and error-prone …
As developers, we are not limited to the functions provided by the VBA language. In addition, we can call the functions that are part of the Windows operating system. These functions are part of the Windows API (Application Programming Interface). U…
This lesson covers basic error handling code in Microsoft Excel using VBA. This is the first lesson in a 3-part series that uses code to loop through an Excel spreadsheet in VBA and then fix errors, taking advantage of error handling code. This l…

895 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

18 Experts available now in Live!

Get 1:1 Help Now