投稿者 魔界の仮面弁士  (社会人) 投稿日時 2014/6/13 00:36:15
>>フォーム非依存の Main プロシージャから始めるという処理方法です。
> http://rucio.cloudapp.net/ThreadDetail.aspx?ThreadId=17599を参考に、
>「プロジェクト」→「項目の追加」→「クラス」で新規作成するという事でしょうか?

『スタートアップ』を変更して、Form_Load ではなく Main から開始するように
変更するということです。
http://rucio.cloudapp.net/ThreadDetail.aspx?ThreadId=10588


> FmLoginをHideする理由なんですが、実際にフォーム移動した際にFmLoginが二つ表示されるようになっています。
でもそれは、意図した動作では無いのですね?
どこかで、誤って FmLogin のフォームインスタンスをもう一つ生成し、
それを表示してしまっているのかも知れません。


> FmLoginのShowとCloseはコメント化にして動作確認をして変化が無かったので消しました。
もしそれが、 2014/6/5 17:45:45 時点のコードを
Me.Hide()
Dim Main As New fmmain
Main.Label1.Text = FmLogin.UserName
Main.ShowDialog(Me)
'Me.Show()    '除去 
'Me.Close()    '除去 
のように変更したのだとしたら、もしかしたら、少々問題があるかもしれません。

たとえば新規プロジェクトで、下記を実行してみて下さい。
Public Class Form1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Me.Hide()
        Using f As New Form()
            f.ShowDialog()
        End Using
        'Me.Close() 
    End Sub
End Class


ボタンを押すとその画面は消えて、代わりに別のフォームが表示されます。
その後、その別画面を×で閉じてみてください。

そうすると、表示されている画面は一つもないのに、アプリケーションは
実行されたままになってしまいます。

開発環境から実行した場合、再生ボタン▶は使えず、停止ボタン■や一時停止ボタン▮▮が
使える状態になっていることでしょう。
(最後の Close のコメントを解除した場合は、フォームを閉じたときにアプリも終了します)


> ・モーダルフォームを展開中は、他のフォームをアクティブやデータの加工が出来ない。
> ・モードレスフォームを展開中は、他のフォームをアクティブやデータの加工は出来る
> という認識で当たっていますか?
その通りです。「『他のフォーム』の操作ができるかどうか」が鍵となります。

つまり「他のフォーム」が表示されていない状態の場合、本来はわざわざ
モーダルにする必要が無いのです。


> ・DialogResultは、何かしらのデータを保存する際に使用するコード?
DialogResult とは要するに、「メッセージボックス」や「ダイアログ」の戻り値のことです。

標準の MessageBox.Show や MsgBox で利用されているほか、
モーダルダイアログを自作する際にも使われます。


この値は、ユーザーが押したボタンが、OK / Cancel / はい / いいえ / 中止 / 再試行 / 無視 の
いずれであったのかを表すものです。
(Form の DialogResult プロパティは、ShowDialogResult の戻り値と連動しています)

たとえば、ログイン画面が表示された時、ユーザーはログイン作業を中止するために、
キャンセルボタンを押したり、あるいはログイン画面を右上の×で閉じたりするかも知れません。

そのような場合、呼び出し側では
 x = ログイン画面.ShowDialog()
 If x = DialogResult.OK Then
  'ログインが行われた時の処理 
 ElseIf x = DialogResult.Cancel Then
  'ログイン画面をキャンセルした時の処理 
 ElseIf …
のようにして、キャンセルされたかどうかを判定できるわけです。

この時、呼び出されたログイン画面側では、ログイン成功時に Me.DialogResult に OK を
セットし、ログインせずに閉じられる場合は、Cancel をセットするように実装します。 

なお、そのログイン画面では、OK ボタンの DialogResult プロパティを OK に設定し、
キャンセルボタンの DialogResult プロパティを Cancel に設定しておくと便利です。

そうすると、キャンセルボタンの Click イベントを一切書かなかったとしても、
「キャンセルボタンが押されたら、自フォームの DialogResult プロパティに Cancel をセットし、自画面を閉じる」
に相当する処理が自動的に行われるようになるからです。(もちろん、Click イベントを併用しても構いません)


なお、DialogResult プロパティが利用されるのは、モーダルフォームのみです。
モードレスで呼び出されたフォームでは使いません。