VB.NET应用问题:开放时段CloseForm2无法隐藏
问题描述
我开发了一款可在开放时段自动切换显示窗体的应用,包含3个窗体(Form1、OpenForm、CloseForm)和1个模块(Module1)。当前遇到的问题是:处于开放时段时,CloseForm无法隐藏,尝试使用Hide()和Close()方法均无效。
相关代码
Form1.vb
Public Class Form1 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load Me.Visible = False Main() End Sub End Class
Module1.vb
Module Module1 Private WithEvents openTimer As New Timer() Private WithEvents closeTimer As New Timer() Sub Main() openTimer.Start() closeTimer.Start() End Sub Private Sub openTimer_Tick(sender As Object, e As EventArgs) Handles openTimer.Tick Dim currentTime As String = DateTime.Now.ToString("HH:mm") Dim startTime As String = "08:33" Dim endTime As String = "08:35" If (currentTime >= startTime AndAlso currentTime <= endTime) Then Dim openForm As New OpenForm() Dim closeForm As New CloseForm() openForm.Show() closeForm.Hide() Form1.Hide() openTimer.Stop() End If End Sub Private Sub closeTimer_Tick(sender As Object, e As EventArgs) Handles closeTimer.Tick Dim currentTime As String = DateTime.Now.ToString("HH:mm") Dim startTime As String = "08:33" Dim endTime As String = "08:35" Form1.Label1.Text = currentTime Form1.Label2.Text = startTime Form1.Label3.Text = endTime If (currentTime < startTime OrElse currentTime > endTime) Then Dim closeForm As New CloseForm() Dim openForm As New OpenForm() closeForm.Show() openForm.Hide() Form1.Hide() closeTimer.Stop() End If End Sub End Module
问题原因
核心问题是每次Timer触发时都新建了窗体实例,而非操作已经显示的那个实例:
- 在
closeTimer_Tick中显示的CloseForm是一个全新的实例,没有被全局引用; - 到了
openTimer_Tick时,又新建了一个CloseForm实例并调用Hide(),但这个实例从未被显示过,自然看不到隐藏效果; - 用字符串比较时间存在潜在风险,可能因格式或区域设置导致判断错误。
解决方法
1. 声明全局窗体实例
在Module1中声明全局的窗体引用,避免每次事件触发都新建实例:
Module Module1 Private WithEvents openTimer As New Timer() Private WithEvents closeTimer As New Timer() ' 全局窗体实例 Private openFormInstance As OpenForm Private closeFormInstance As CloseForm Sub Main() openTimer.Start() closeTimer.Start() End Sub
2. 修改Timer事件逻辑
操作全局实例,同时用DateTime类型直接比较时间,避免字符串比较的问题:
修改openTimer_Tick:
Private Sub openTimer_Tick(sender As Object, e As EventArgs) Handles openTimer.Tick Dim currentTime As DateTime = DateTime.Now ' 构造当日的开始/结束时间 Dim startTime As DateTime = New DateTime(currentTime.Year, currentTime.Month, currentTime.Day, 8, 33, 0) Dim endTime As DateTime = New DateTime(currentTime.Year, currentTime.Month, currentTime.Day, 8, 35, 0) If currentTime >= startTime AndAlso currentTime <= endTime Then ' 初始化并显示OpenForm If openFormInstance Is Nothing Then openFormInstance = New OpenForm() End If openFormInstance.Show() ' 隐藏已显示的CloseForm If closeFormInstance IsNot Nothing Then closeFormInstance.Hide() End If Form1.Hide() openTimer.Stop() End If End Sub
修改closeTimer_Tick:
Private Sub closeTimer_Tick(sender As Object, e As EventArgs) Handles closeTimer.Tick Dim currentTime As DateTime = DateTime.Now Dim startTime As DateTime = New DateTime(currentTime.Year, currentTime.Month, currentTime.Day, 8, 33, 0) Dim endTime As DateTime = New DateTime(currentTime.Year, currentTime.Month, currentTime.Day, 8, 35, 0) Form1.Label1.Text = currentTime.ToString("HH:mm") Form1.Label2.Text = startTime.ToString("HH:mm") Form1.Label3.Text = endTime.ToString("HH:mm") If currentTime < startTime OrElse currentTime > endTime Then ' 初始化并显示CloseForm If closeFormInstance Is Nothing Then closeFormInstance = New CloseForm() End If closeFormInstance.Show() ' 隐藏已显示的OpenForm If openFormInstance IsNot Nothing Then openFormInstance.Hide() End If Form1.Hide() closeTimer.Stop() End If End Sub
3. 处理窗体关闭事件
如果用户手动关闭了窗体,需要重置全局实例,避免后续操作出现空引用:
在OpenForm中添加:
Private Sub OpenForm_FormClosed(sender As Object, e As FormClosedEventArgs) Handles MyBase.FormClosed Module1.openFormInstance = Nothing End Sub
在CloseForm中添加:
Private Sub CloseForm_FormClosed(sender As Object, e As FormClosedEventArgs) Handles MyBase.FormClosed Module1.closeFormInstance = Nothing End Sub
内容的提问来源于stack exchange,提问作者ZERO_BRAIN
相关产品推荐
相关产品推荐

