0

SymbolMC50でCompactFramework3.5を使用しています。

私のサブメインでは、最初にデータベースが存在するかどうかを確認します。含まれている場合は、次のコードを使用してログイン画面が表示されます。

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

これはすべて正しく機能し、frmMainを閉じると、期待どおりにアプリケーションを終了します。

ただし、サブメインでのデータベースチェックが失敗した場合は、ライブサーバーからデータベースを作成して入力するために使用される別のフォームの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が閉じられたときに、サブメインの残りのコードが実行されていなかったため、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イベントが発生していないかのようです。

私は何を間違えましたか?

4

2 に答える 2

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
于 2012-05-03T12:47:40.293 に答える
1

メインフォームが閉じない理由は、メインフォームのWindowsメッセージループを開始した場所であるため、アプリケーションがダイアログの終了イベントのコールスタックに「スタック」しているためです。

コードをいくらか再構築することをお勧めします。

「メイン」サブで有効性チェックを行う代わりに、代わりにメインフォームをロードします。

Application.Run(New frmMain())

メインフォームにタイマーをドロップし、非常に速い間隔(たとえば10ミリ秒)を設定します。メインフォームのloadイベントで有効にします。Tickイベントハンドラーをそのように実装します(私のVB構文はおそらく完全ではないことに注意してください、私はここでそれを翼にしています):

   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
于 2012-05-07T13:18:21.793 に答える