2012-05-02 7 views
0

Symbol MC50でCompact Framework 3.5を使用しています。Sub Mainの外で呼び出されたときにApplication.Run(New myForm())が動作しない

私のSub Mainでは、まずデータベースが存在するかどうかを確認します。私はfrmMain閉じたときに、予想通り、それはアプリケーションを終了し、これは、すべてが正常に動作し

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

をして:それがない場合は、次のコードを使用してログイン画面が表示されます。

しかし、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を閉じたとき、サブメインのコードの残りの部分は、このようにApplication.Runがヒットしなかっされなかった、実行されなかったことです。

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が実際に負荷を行います。

だからfrmUpdateData上の[閉じる]ボタンのクリックイベントに私は、次のコードを追加しました。しかし、右上の閉じるボタンをクリックしても何も起こらず、イベントは発生しません。 Windowsイベントが発生していないかのように。

どうしたのですか?

+1

これが役立つかどうかはわかりませんが、 Application.Runは、ShowDialogを呼び出すのではなく、frmLoginおよびfrmUpdateDataフォームを表示します。アプリケーションメッセージループに参加していないときに、.NETがダイアログやメッセージボックスを表示するのにどれだけの時間がかかりますか分かりません。 –

答えて

1

理由あなたのメインフォームはしません閉じるのは、アプリケーションがメインウィンドウのメッセージループを開始したときと同じように、アプリケーションがダイアログの終了イベントの呼び出しスタックに「スタック」しているためです。

あなたのコードを幾分再構成することをお勧めします。

の代わりに「メイン」サブであなたの妥当性チェックを行って、代わりにメインフォームをロード:

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 
1

私はあなたのアプリケーションの全体が一緒に入れているかを確認することはできませんが、私は「他の」句を削除することによって、この小さな変更を提案します:

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 
関連する問題