Solved

form reloads on it's own

Posted on 2003-12-02
16
379 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
How to improve team productivity

Quip adds documents, spreadsheets, and tasklists to your Slack experience
- Elevate ideas to Quip docs
- Share Quip docs in Slack
- Get notified of changes to your docs
- Available on iOS/Android/Desktop/Web
- Online/Offline

 

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

Free Trending Threat Insights Every Day

Enhance your security with threat intelligence from the web. Get trending threat insights on hackers, exploits, and suspicious IP addresses delivered to your inbox with our free Cyber Daily.

Join & Write a Comment

Introduction While answering a recent question (http://www.experts-exchange.com/Q_27402310.html) in the VB classic zone, I wrote some VB code in the (Office) VBA environment, rather than fire up my older PC.  I didn't post completely correct code o…
If you need to start windows update installation remotely or as a scheduled task you will find this very helpful.
Get people started with the process of using Access VBA to control Outlook using automation, Microsoft Access can control other applications. An example is the ability to programmatically talk to Microsoft Outlook. Using automation, an Access applic…
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…

708 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

12 Experts available now in Live!

Get 1:1 Help Now