英文:
Access form doesn't appear but procedure runs
问题
I have an Access form titled frmReportMetrics that opens as the Display Form. On Open it uses UserIsInGroup() to verify authority. If the user is not in the specified group then a Select Case - Case False statement closes frmReportMetrics and opens frmAccessDenied which is just a stop sign image with text alerting the individual that they do not have permission to use the application.
'设置表单项的默认值
Private Sub Form_Open(Cancel As Integer)
'检查用户是否具有运行前端的权限
Select Case UserIsInGroup("The Reports")
Case False
DoCmd.Close acForm, Me.Name, acSaveNo
DoCmd.OpenForm "frmAccessDenied", acNormal, "", "", , acNormal
Exit Sub
End Select
Me.lblTabGoToManagersReportsPage.Visible = False
'只有用户是安全组的成员才显示标签
Select Case UserIsInGroup("The Reports - Managers")
Case True
Me.lblTabGoToManagersReportsPage.Visible = True
End Select
End Sub
I then want the app to close automatically after 5 seconds displaying a countdown. So I used pause() in frmAccessDenied
Private Sub Form_Activate()
Me.lblClosingIn.Caption = "This form will close in 5 seconds"
Pause (1)
Me.lblClosingIn.Caption = "This form will close in 4 seconds"
Pause (1)
Me.lblClosingIn.Caption = "This form will close in 3 seconds"
Pause (1)
Me.lblClosingIn.Caption = "This form will close in 2 seconds"
Pause (1)
Me.lblClosingIn.Caption = "This form will close in 1 second"
Pause (1)
Application.Quit
End Sub
I'm sure it could be shorter...
Trouble is when testing, and I remove myself from the AD security group and open the Access front-end, the frmAccessDenied form does not pop up as expected but the app does exit in 5 seconds. I don't ever see frmReportMetrics either. I've tried _Load, _Open, _Activate, and _Current in frmAccessDenied but none of them allow frmAccessDenied to appear. _GoftFocus works and frmAccessDenied appears and I see the stop sign and alerts but then the countdown does not proceed and the app does not quit in 5 seconds.
As I step through frmAccessDenied I can Reset at any point and frmAccessDenied appears and I see the stop sign with the alerts as well as the appropriate Me.lblClosingIn.Caption at the bottom and if I step all the way through the app quits.
Am I missing something like an Exit Sub somewehere? Or what Event Procedure should I use?
Both UserIsInGroup() and pause() work as expected, thanks @Nigel Heffernan and @Steve Mallory, respectively
TIA,
Tim
PS @Erik A I added DoEvents all over and still frmAccessDenied is not painted.
Private Sub Form_Activate()
DoEvents
Dim I As Integer
Dim sFirstPart As String
Dim sSecondPart As String
Dim sCompleteSentence As String
sFirstPart = "This form will close in "
sSecondPart = " seconds!"
For I = 5 To 2 Step -1
sCompleteSentence = sFirstPart & I & sSecondPart
DoEvents
Me.lblClosingIn.Caption = sCompleteSentence
Pause (1)
Next
DoEvents
Me.lblClosingIn.Caption = "This form will close in 1 second!"
Pause (1)
'Application.Quit
DoEvents
Me.lblClosingIn.Caption = "This form will close in 5 seconds"
Pause (1)
DoEvents
Me.lblClosingIn.Caption = "This form will close in 4 seconds"
Pause (1)
DoEvents
Me.lblClosingIn.Caption = "This form will close in 3 seconds"
Pause (1)
DoEvents
Me.lblClosingIn.Caption = "This form will close in 2 seconds"
Pause (1)
DoEvents
Me.lblClosingIn.Caption = "This form will close in 1 second"
Pause (1)
'Application.Quit
End Sub
And I tried a For Next but that didn't help either.
As I debug and run through the _Open, _Load, _Activate, and _Current with breakpoints at each, frmAccessDenied never becomes visible. I even tried with liberal applications of DoEvents!
Option Compare Database
Option Explicit
Private Sub Form_Activate()
DoEvents
Me.txtMessage.Value = "This application will close in 3 seconds!"
End Sub
Private Sub Form_Current()
DoEvents
Me.txtMessage.Value = "This application will close in 2 seconds!"
End Sub
Private Sub Form_Load()
DoEvents
Me.txtMessage.Value = "This application will close in 4 seconds!"
End Sub
Private Sub Form_Open(Cancel As Integer)
DoEvents
Me.txtMessage.Value = "This application will close in 5 seconds!"
End Sub
And when the form finally pops up it is with the value "This application will close in 2 seconds!"
What am I missing?
Voila! @Tom Robinson! That is a nice little nugget to understand the inner workings of Access. The form, though created is not visible until Access let's it be visible or until you make it visible. I went ahead and made the form visible on _Open and the countdown in _Load. Works to spec!
Option Compare Database
Option Explicit
Private Sub Form_Load()
Dim i As Integer
Dim txtFirstPart As String
Dim txtSecondPart As String
txtFirstPart = "This application will close in "
txtSecondPart = " seconds!"
For i = 5 To 2 Step -1
Me.txtMessage.Value = txtFirstPart & i & txtSecondPart
Pause (1)
End For
Me.txtMessage.Value = "This application will close in 1 second!"
Pause (1)
DoCmd.Close acForm, Me.Name, acSaveNo
End Sub
Private Sub Form_Open(Cancel As Integer)
Me.Visible = True
End Sub
英文:
I have an Access form titled frmReportMetrics that opens as the Display Form. On Open it uses UserIsInGroup() to verify authority. If the user is not in the specified group then a Select Case - Case False statement closes frmReportMetrics and opens frmAccessDenied which is just a stop sign image with text alerting the individual that they do not have permission to use the application.
'Set default values to form items
Private Sub Form_Open(Cancel As Integer)
'Check to assure user has privileges to run front-end
Select Case UserIsInGroup("The Reports")
Case False
DoCmd.Close acForm, Me.Name, acSaveNo
DoCmd.OpenForm "frmAccessDenied", acNormal, "", "", , acNormal
Exit Sub
End Select
Me.lblTabGoToManagersReportsPage.Visible = False
'Only display the label if the user is a member of the security group
Select Case UserIsInGroup("The Reports - Managers")
Case True
Me.lblTabGoToManagersReportsPage.Visible = True
End Select
End Sub
I then want the app to close automatically after 5 seconds diplaying a countdown. So I used pause() in frmAccessDenied
Private Sub Form_Activate()
Me.lblClosingIn.Caption = "This form will close in 5 seconds"
Pause (1)
Me.lblClosingIn.Caption = "This form will close in 4 seconds"
Pause (1)
Me.lblClosingIn.Caption = "This form will close in 3 seconds"
Pause (1)
Me.lblClosingIn.Caption = "This form will close in 2 seconds"
Pause (1)
Me.lblClosingIn.Caption = "This form will close in 1 seconds"
Pause (1)
Application.Quit
End Sub
I'm sure it could be shorter...
Trouble is when testing, and I remove myself from the AD security group and open the Access front-end, the frmAccessDenied form does not pop up as expected but the app does exit in 5 seconds. I don't ever see frmReportMetrics either. I've tried _Load, _Open, _Activate, and _Current in frmAccessDenied but none of them allow frmAccessDenied to appear. _GoftFocus works and frmAccessDenied appears and I see the stop sign and alerts but then the countdown does not proceed and the app does not quit in 5 seconds.
As I step through frmAccessDenied I can Reset at any point and frmAccessDenied appears and I see the stop sign with the alerts as well as the appropriate Me.lblClosingIn.Caption at the bottom and if I step all the way through the app quits.
Am I missing something like an Exit Sub somewehere? Or what Event Procedure should I use?
Both UserIsInGroup() and pause() work as expected, thanks @Nigel Heffernan and @Steve Mallory, respectively
TIA,
Tim
PS @Erik A I added DoEvents all over and still frmAccessDenied is not painted.
Private Sub Form_Activate()
DoEvents
Dim I As Integer
Dim sFirstPart As String
Dim sSecondPart As String
Dim sCompleteSentence As String
sFirstPart = "This form will close in "
sSecondPart = " seconds!"
For I = 5 To 2 Step -1
sCompleteSentence = sFirstPart & I & sSecondPart
DoEvents
Me.lblClosingIn.Caption = sCompleteSentence
Pause (1)
Next
DoEvents
Me.lblClosingIn.Caption = "This form will close in 1 second!"
Pause (1)
'Application.Quit
DoEvents
Me.lblClosingIn.Caption = "This form will close in 5 seconds"
Pause (1)
DoEvents
Me.lblClosingIn.Caption = "This form will close in 4 seconds"
Pause (1)
DoEvents
Me.lblClosingIn.Caption = "This form will close in 3 seconds"
Pause (1)
DoEvents
Me.lblClosingIn.Caption = "This form will close in 2 seconds"
Pause (1)
DoEvents
Me.lblClosingIn.Caption = "This form will close in 1 second"
Pause (1)
'Application.Quit
End Sub
And I tried a For Next but that didn't help either.
As I debug and run through the _Open, _Load, _Activate, and _Current with breakpoints at each, frmAccessDenied never becomes visible. I even tried with liberal applications of DoEvents!
Option Compare Database
Option Explicit
Private Sub Form_Activate()
DoEvents
Me.txtMessage.Value = "This application will close in 3 seconds!"
End Sub
Private Sub Form_Current()
DoEvents
Me.txtMessage.Value = "This application will close in 2 seconds!"
End Sub
Private Sub Form_Load()
DoEvents
Me.txtMessage.Value = "This application will close in 4 seconds!"
End Sub
Private Sub Form_Open(Cancel As Integer)
DoEvents
Me.txtMessage.Value = "This application will close in 5 seconds!"
End Sub
And when the form finally pops up it is with the value "This application will close in 2 seconds!"
What am I missing?
Voila! @Tom Robinson! That is a nice little nugget to understand the inner workings of Access. The form, though created is not visible until Access let's it be visible or until you make it visible. I went ahead and made the form visible on _Open and the countdown in _Load. Works to spec!
Option Compare Database
Option Explicit
Private Sub Form_Load()
Dim i As Integer
Dim txtFirstPart As String
Dim txtSecondPart As String
txtFirstPart = "This application will close in "
txtSecondPart = " seconds!"
For i = 5 To 2 Step -1
Me.txtMessage.Value = txtFirstPart & i & txtSecondPart
Pause (1)
Next
Me.txtMessage.Value = "This application will close in 1 second!"
Pause (1)
DoCmd.Close acForm, Me.Name, acSaveNo
End Sub
Private Sub Form_Open(Cancel As Integer)
Me.Visible = True
End Sub
答案1
得分: 2
因为你的子程序运行是同步的,它不会给访问时间来显示表单,因为你的代码在表单被绘制之前运行。
为了解决这个问题,在你的子程序开始时使用DoEvents()
,并在改变表单内容后重复使用它。
或者,你可以使用_Timer
来倒计时并关闭表单,而不会导致应用程序无响应。
英文:
Because your sub runs synchronously, it does not give Access time to display the form, as your code runs before the form gets painted.
To work around this, start your sub with DoEvents()
, and repeat it after changing the form contents.
Alternatively, you could use _Timer
to count down and close the form without making the application unresponsive.
答案2
得分: 1
将 Me.Visible = True
添加为 Form_Activate
的第一行代码。
默认情况下,新打开的窗体直到各种窗体事件完成之前才会变为可见。这是为了让用户不会看到令人分心的启动活动。
英文:
Add Me.Visible = True
as the first line of Form_Activate
.
By default, a newly-opened form does not become visible until various form events have completed. This is so the user doesn't see distracting startup activities.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论