- PR -

Form1に設定したMainMenu1のプロパティをForm2内のコードで変更したい

投稿者投稿内容
Q
会議室デビュー日: 2004/07/27
投稿数: 6
投稿日時: 2004-07-27 13:28
実行したいこと
 ログインしていないときは、MainMenu1のログアウトを選択不可状態に
 また、ログアウトしているときはMainMenu1のログインを選択不可状態にしたい。


状況
 Form1にMainMenu1を作ります。
 ファイル  ヘルプ ...
  ログイン  <<< デザイン(name)を mnuログイン としています。
  ログアウト
  終了

 このプロパティをForm2内のコード(プログラム)で変更したいのですがうまく動作しません。

 Form1ではMainMenu1のために特にコードを記述していません。
 Form2ではログイン画面を作っており
   Private frmM As Form1

    frmM.mnuログイン.Visible = False
 などを記述しています。

 コンパイル時にはエラーは出ていません。
 でも実行しても思った動作で動作してくれずに困っています。
どなたか教えていただけませんでしょうか。よろしくお願いします。

一郎
ぬし
会議室デビュー日: 2002/10/11
投稿数: 1081
投稿日時: 2004-07-27 13:55
引用:

Qさんの書き込み (2004-07-27 13:28) より:
実行したいこと
 ログインしていないときは、MainMenu1のログアウトを選択不可状態に
 また、ログアウトしているときはMainMenu1のログインを選択不可状態にしたい。


また、ログインしているときはMainMenu1のログインを選択不可状態にしたい。
の間違いですか?

引用:

 このプロパティをForm2内のコード(プログラム)で変更したいのですがうまく動作しません。

・・・・・・・・・・

 実行しても思った動作で動作してくれずに困っています。


「うまく動かない」では、どうなったのかが本人以外分かりません。「思った動作で動作してくれずに」どうなったのかが分かりませんので、
●どうなって欲しい(どうしたい)
●実際どうした
●結果どうなった
を書いてください。
Qさんがおかしいと思っている動作が正しい動作の可能性があります。

「実際どうした」も情報が足りません。
引用:

   Private frmM As Form1

    frmM.mnuログイン.Visible = False
 などを記述しています。


これだけでは、実行時に例外が出ませんか?
それとも出ているけど書いていないだけですかね。
Q
会議室デビュー日: 2004/07/27
投稿数: 6
投稿日時: 2004-07-27 14:44
一郎様

早速の回答ありがとうございました。

●どうなって欲しい(どうしたい)
 ログインしているときはMainMenu1のログインを選択不可状態にしたい
 ログアウトしているときはMainMenu1のログアウトを選択不可状態にしたい
 (一郎様のご指摘どおり、その通りです。)

 ・Form1 MainMenu1があるメインフォーム
  Form2 ログインフォーム
   の2つのフォームを作成しています。
 ・Form1にMainMenu1を設定しており、以下のような状態になっています。
   ファイル  ヘルプ ...
    ログイン  <<< デザイン(name)を mnuログイン としています。
    ログアウト  <<< Form1がloadされるときmnuログアウト.Visible = False
    終了          としているので選択できない
 ・起動するとForm1が表示されます。ここでMainMenu1にログインを選択すると
  Form2が表示されます。ここでログイン処理(ID、パスワード入力)して
  ログイン時にエラーがでないとForm2は消えて、Form1だけが残ります。
  このとき、MainMenu1のログインを選択不可状態にしたいのです。

●実際どうした
Form1側

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'メインフォームが開かれたときに処理するもの
mnuログイン.Visible = True
mnu終了.Visible = True
mnuログアウト.Visible = False
End Sub

Private Sub mnuログイン_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuログイン.Click
'ログイン
'
'ログインフォームを表示
Dim cForm As New Form2 ' Form2のインスタンスを作成 Form2 は データベース接続のためのログインフォーム
cForm.MdiParent = Me '親ウインドウを設定
cForm.Show() '子ウインドウを表示
ChildrenForm.Add(cForm) '格納する

'メニューの「ログイン」を操作不可にする
mnuログイン.Visible = False

End Sub
 −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
Form2側

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDB接続実行.Click

Dim cn As New SqlConnection("data source= master....")
Try
cn.Open()
' Insert code to process data.
Catch ex As Exception
'ログイン失敗したとき
' メニューの「ログイン」を操作可に戻す
frmM.mnuログイン.Visible = True
' ログインフォームを閉じる
Me.Close()
' ログイン失敗のメッセージを表示する
MessageBox.Show("ログインに失敗しました") '接続失敗
' メニューの「ログイン」を操作可に戻す
frmM.mnuログイン.Visible = True
Finally
cn.Close() '接続成功、失敗に関わらず閉じる
End Try
  ' ログインフォームを閉じる
Me.Close()
End Sub

●結果どうなった
 ログイン時にエラーが出ずにForm2は消えて、Form1だけが残りますが、
 MainMenu1のログインは選択不可状態になったが、ログアウトが
 選択不可状態になったままになった。

あと、実行時に例外は出ませんでした。

ご指摘に従い追記しましたが、また不備があれば追記します。よろしくお願いします。

[ メッセージ編集済み 編集者: Q 編集日時 2004-07-27 14:46 ]
soluna
ベテラン
会議室デビュー日: 2004/06/15
投稿数: 59
投稿日時: 2004-07-27 15:28
あの〜、mnuログアウトを制御していませんが?
記載漏れですか?

引用:
Qさんの書き込み (2004-07-27 14:44) より:
Form2側

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDB接続実行.Click

Dim cn As New SqlConnection("data source= master....")
Try
cn.Open()
' Insert code to process data.
Catch ex As Exception
'ログイン失敗したとき
' メニューの「ログイン」を操作可に戻す
frmM.mnuログイン.Visible = True
' ログインフォームを閉じる
Me.Close()
' ログイン失敗のメッセージを表示する
MessageBox.Show("ログインに失敗しました") '接続失敗
' メニューの「ログイン」を操作可に戻す
frmM.mnuログイン.Visible = True
Finally
cn.Close() '接続成功、失敗に関わらず閉じる
End Try
  ' ログインフォームを閉じる
Me.Close()
End Sub



frmM.mnuログイン.Visible = True
が、二度実行するようになっているのはなぜ?
Q
会議室デビュー日: 2004/07/27
投稿数: 6
投稿日時: 2004-07-27 15:58
soluna様

返答ありがとうございます。

mnuログアウトを制御していませんが?
 (回答)投稿時に削りすぎました。すいません。

frmM.mnuログイン.Visible = True
が、二度実行するようになっているのはなぜ?
 (回答)これはミスです。一つは不要です。

Form2側

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As   
  System.EventArgs) Handles btnDB接続実行.Click

 Dim cn As New SqlConnection("data source= master....")
 dbcon = 0 '成功=0 失敗=1

 Try
  cn.Open()
  ' Insert code to process data.
 Catch ex As Exception
  'ログイン失敗したとき
  dbcon = 1 '成功=0 失敗=1
  ' メニューの「ログイン」を操作可に戻す
  frmM.mnuログイン.Visible = True
  ' ログインフォームを閉じる
  Me.Close()
  ' ログイン失敗のメッセージを表示する
  MessageBox.Show("ログインに失敗しました") '接続失敗
 Finally
 cn.Close() '接続成功、失敗に関わらず閉じる
 End Try

 If dbcon = 0 Then
  frmM.mnuログアウト.Visible = True <<<< ここで下記のようなエラーがでます。
 End If

  ' ログインフォームを閉じる
 Me.Close()
End Sub

ご指摘ありがとうございました。

エラー内容
'System.NullReferenceException' のハンドルされていない例外が SQLDataAccess.exe で発生しました。

追加情報 : オブジェクト参照がオブジェクト インスタンスに設定されていません。

最初に指摘頂いた時、デバッグモードにしていなかったためエラーが分りませんでした。

[ メッセージ編集済み 編集者: Q 編集日時 2004-07-27 16:33 ]
soluna
ベテラン
会議室デビュー日: 2004/06/15
投稿数: 59
投稿日時: 2004-07-27 17:36
たぶん、frmMが正しく設定出来ていないのでしょう。
frmMは、何時、どこで、どのように初期化しています?

引用:
Qさんの書き込み (2004-07-27 15:58) より:
Form2側

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As   
  System.EventArgs) Handles btnDB接続実行.Click

 Dim cn As New SqlConnection("data source= master....")
 dbcon = 0 '成功=0 失敗=1

 Try
  cn.Open()
  ' Insert code to process data.
 Catch ex As Exception
  'ログイン失敗したとき
  dbcon = 1 '成功=0 失敗=1
  ' メニューの「ログイン」を操作可に戻す
  frmM.mnuログイン.Visible = True
  ' ログインフォームを閉じる
  Me.Close()
  ' ログイン失敗のメッセージを表示する
  MessageBox.Show("ログインに失敗しました") '接続失敗
 Finally
 cn.Close() '接続成功、失敗に関わらず閉じる
 End Try

 If dbcon = 0 Then
  frmM.mnuログアウト.Visible = True <<<< ここで下記のようなエラーがでます。
 End If

  ' ログインフォームを閉じる
 Me.Close()
End Sub


dbconは可能ならば、boolean型にしてはどうです?
Try〜Catch〜Finallyのヘルプよく呼んで下さい。無駄なことをしています。

Form1メンバのことは、Form1にやらせた方がいいと思いますよ。
Q
会議室デビュー日: 2004/07/27
投稿数: 6
投稿日時: 2004-07-27 18:09
soluna様

返答ありがとうございます。

frmMは、何時、どこで、どのように初期化しています?
(回答)
Form2側
Public Class frmConect
Inherits System.Windows.Forms.Form

Private frmM As Form1

  Windows フォーム デザイナで生成されたコード
  いくつかの Private Sub と End Sub

End Class


dbconは可能ならば、boolean型にしてはどうです?
Try〜Catch〜Finallyのヘルプよく呼んで下さい。無駄なことをしています。
(回答)
 ご指摘、ご指導ありがとうございます。
 Try〜Catch〜Finallyはサンプルからよく分らずに使いました。勉強中。

Form1メンバのことは、Form1にやらせた方がいいと思いますよ。
(回答)
 見直しを検討しています。あまりにもややこしくなりそうなので。。。
きくちゃん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 854
お住まい・勤務地: 都内某所
投稿日時: 2004-07-27 18:25
Qさん、こんばんは。

引用:

見直しを検討しています。あまりにもややこしくなりそうなので。。。


ログインフォームをMDI子フォームにしてます?
これをやめてモーダルダイアログにしませんか?

以下サンプルです。

コード:

Public Class Form1
    Inherits System.Windows.Forms.Form

'(省略)

    Private Sub mnuLogin_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuLogin.Click
        Dim F2 As Form2 = New Form2

        If F2.ShowDialog(Me).Equals(DialogResult.OK) Then
            Me.mnuLogin.Enabled = False
            Me.mnuLogout.Enabled = True
        End If
    End Sub

End Class

Public Class Form2
    Inherits System.Windows.Forms.Form

'(省略)

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        If Login(TextBox1.Text, TextBox2.Text) Then
            Me.DialogResult = DialogResult.OK
        End If

    End Sub

    Private Function Login(ByVal UserName As String, ByVal Password As String) As Boolean
        Try

            '// ログイン処理

            Return True
        Catch ex As Exception
            If MsgBox(ex.Message, MsgBoxStyle.Exclamation + MsgBoxStyle.RetryCancel).Equals(MsgBoxResult.Cancel) Then
                Me.DialogResult = DialogResult.Abort
            End If
            Return False
        End Try
    End Function

End Class


スキルアップ/キャリアアップ(JOB@IT)