在Sub Main外部调用时,调用Application.Run(New myForm())不起作用

时间:2012-05-02 15:17:06

标签: vb.net compact-framework

我在Symbol MC50上使用Compact Framework 3.5。

在我的Sub Main中,它首先检查数据库是否存在。如果是,则使用以下代码显示登录屏幕:

Dim login As frmLogin = New frmLogin()
    If login.ShowDialog() = DialogResult.OK Then            
        Application.Run(New frmMain())
    End If

这一切都正常,当我关闭frmMain时,它会按预期退出应用程序。

但是,如果Sub Main中的数据库检查失败,我会调用另一个用于从实时服务器创建和填充数据库的表单的ShowDialog()方法。以下是调用此表单的代码:

If Not File.Exists(SETTINGS_LOCALDB) Then
        databaseExists = False
        MessageBox.Show("Local DB does not exist. The database must be created before using the application.")
        Dim update As frmUpdateData = New frmUpdateData()
        update.ShowDialog()
Else
    .....
End If

我遇到的第一个问题是,当关闭frmUpdateData时,Sub Main中的其余代码没有执行,因此Application.Run从未被命中。

因此,在frmUpdateData上的“关闭”按钮的单击事件中,我添加了以下代码:

If SystemUserSecurityId() = Nothing Then
        Dim login As frmLogin = New frmLogin()
        If login.ShowDialog() = DialogResult.OK Then
            DebugTrace("Init - login complete, starting application.")
            Application.Run(New frmMain())
        End If
    End If
    Me.Hide()

所有这些代码都被击中,而frmMain确实加载了。但是,当我单击右上角的关闭按钮时没有任何反应,没有事件发生。就像Windows事件没有发生一样。

我做错了什么?

2 个答案:

答案 0 :(得分:1)

我无法看到整个应用程序是如何组合在一起的,但我会通过删除“else”子句来提出这个小改动:

If Not File.Exists(SETTINGS_LOCALDB) Then
  databaseExists = False
  MessageBox.Show("Local DB does not exist. The database must be created before using the application.")
  Dim update As frmUpdateData = New frmUpdateData()
  update.ShowDialog() ' Is this what populates your database???
' Else (removed the else clause)
End If
If File.Exists(SETTINGS_LOCALDB) Then ' now it is OK to run, correct?
  If SystemUserSecurityId() = Nothing Then
    Dim login As frmLogin = New frmLogin()
    If login.ShowDialog() = DialogResult.OK Then
      DebugTrace("Init - login complete, starting application.")
      Application.Run(New frmMain())
    End If
  End If
End If

答案 1 :(得分:1)

您的主窗体无法关闭的原因是因为您的应用程序“卡在”对话框结束事件的调用堆栈中,因为您启动了主窗体的Windows消息循环。

我建议您稍微调整一下代码。

而不是在“main”子中进行有效性检查,而是加载主窗体:

Application.Run(New frmMain())

将计时器放到主表单上并设置一个非常快的间隔(例如10毫秒)。在主窗体的加载事件中启用它。像这样实现Tick事件处理程序(请注意,我的VB语法可能并不完美,我在这里wing)):

   Sub TmrOneShot_Tick(ByVal sender as Object, ByVal e as System.EventArgs)
    'prevent timer from firing again.
    tmrOneShot.Enabled = False;
    Dim bContinue as Boolean = False;

    If Not File.Exists(SETTINGS_LOCALDB) Then
      databaseExists = False
      MessageBox.Show("Local DB does not exist. The database must be created before using the application.")
      Dim update As frmUpdateData = New frmUpdateData()
      update.ShowDialog() ' Is this what populates your database???

      'analyze result of update form to determine if you should continue...
      bContinue = WasUpdateDataOperationSuccessful();

    End If

   If bContinue Then
      If SystemUserSecurityId() = Nothing Then
        Dim login As frmLogin = New frmLogin()
        bContinue = login.ShowDialog() = DialogResult.OK
        if bContinue Then
          DebugTrace("Init - login complete, starting application.")              
        End If
      End If
    End If

  If Not bContinue Then
     'can't continue, terminate app
     Application.Exit()
  End if
End Sub