You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 22:37:50