投稿者 魔界の仮面弁士  (社会人) 投稿日時 2014/6/10 22:29:31
>> メインフォーム経由のログインフォームより、ログインフォームの方が良いのでは無いかと思います。
> メインフォームをスタートアップにするのも、
> ログインフォームをスタートアップにするのも、
> どちらも適切ではない、と思います。(不正解ではありませんが)

参考までに、スタートアップを Sub Main にした場合のコード案を書いてみました。
るきおさんの UserInfo クラスを用意する案も盛り込んでいます。

' fmLogin_Load や fmBase_Load から始めるのではなく、Sub Main から始めるように設定しておく 
Public Sub Main()
 Application.EnableVisualStyles()
 Application.SetCompatibleTextRenderingDefault(False)

 '現在のユーザー情報は、るきおさん提案の UserInfo クラスで管理する 
 Dim account As UserInfo = Nothing '未ログイン時には、初期値として Nothing にしておく 

 '---- ログイン処理 ---- 
 Using login As New fmLogin()
  'ログイン画面をモーダルで表示する 
  If login.ShowDialog( ) = System.Windows.Forms.DialogResult.OK Then
   '認証が終わったら、認証結果を UserInfo クラスとして受け取る 
   account = login.LoginAccount   '←新たにLoginAccount というプロパティを自作 
  Else
   '認証がキャンセルされたり、入力ミスが続いたときは、メイン画面に移行せずにアプリ終了 
   Return
  End If
 End Using

 '---- メイン画面 ---- 
 If account IsNot Nothing Then
  '認証が済んだら、その認証結果情報(UserInfoクラス)を 
  'メイン画面に引き渡して表示する。 
  Application.Run( New fmMain( account ) ) 'コンストラクタを追加 
 End If

End Sub



【ログインダイアログ】
・フォーム名を fmLogin と仮定しました。
・認証の成否やキャンセル判定に、DialogResult を利用しています。
・モーダルフォームの呼び出しなので、Using ブロックを利用しています。
・ログイン結果(UserInfo)の返却のため、LoginAccount プロパティを自作しています。


【メイン画面】
・フォーム名を「fmMain」と仮定しました。
・標準では、引数無しの New しか使えませんが、上記コードではfmMain に
 『Sub New(account As UserInfo)』のコンストラクタを追加する前提で記述しています。
・コンストラクタではなく、メソッドやプロパティ、あるいはフィールド変数などで
 受け渡すこともできます。ですが、Load 時点で使えるのようにすることを
 考えると、コンストラクタで渡しておくのが良いであろうという判断です。


【SQL Server への問い合わせ】
・今回のメインどころではありますが、上記ではあえて省略しています。
・今までのコードを見ると、CMD.ExecuteScalar() で問い合わせるまでは合っていますが、
 何故か、データベースから返されるユーザー名(山田太郎などの日本人の名前)を、
 String で受け取るのではなく、ToInt32 で数値変換しようとされていました。流石に
 "山田太郎" という文字列を RESULT As Integer に代入するのは不可能なので、
 その部分は見直して下さい。
・実際の運用では、サーバーへの接続に失敗した場合などに備えて、
 Try~Catch 構文を併用することが望ましいです。


【UserInfo クラス】
・宣言方法については、るきおさんが解説されているので省略します。
・認証時にセットしたユーザー名などの情報を、メイン画面等から
 どのように再利用するかは御随意に。
・認証が成功するたびに、新たに UserInfo のインスタンスが生成されます。工夫すれば、
 SQL Server Management Studio のように、複数ユーザーでマルチログインするなどの
 応用も効くかと思います。


【スタートアップ】
・スタートアップフォームは用いず、Sub Main からの実行にしています。
 これにより、スタートアップフォームを動的に変更できるなどの融通さが生まれます。
・たとえば、「通常はログイン画面が初期表示されるが、認証情報をコマンドライン引数で
 指定した場合には、いきなりメイン画面からスタートさせる」なんてことも可能です。