トップ回答者
フォームの継承について

質問
-
皆様お世話になります。
フォームの継承で質問があります。
フォームにDateTimePicker1と Button1を貼り付けて
ボタンが押されたときの実行処理をしてあります。
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
'日付が現在日付より後の場合処理を抜ける
If CDate(DateTimePicker1.Text) > Today Then
MsgBox("日付を現在日付より前の日で指定してください")
Exit Sub
'Falseの場合処理を行いたい
End IfEnd Sub
Button1_Clickの時にDateTimePicker1の日付が現在日付よりも以前の条件で
処理を行いたいのですが、同じようなフォームを沢山作るので
フォームを継承させて子のフォームに処理を行いたいのですが
どのようにコードを記述すれば意図したものになるのでしょうか?このままフォームを継承して子のフォームのButton1_Clickにコードを記述すると
親フォームでのExit Subは親フォームでしか行われず
子フォームでは何日を選択しても実装処理が行われてしまいます。初心者の質問で申し訳ありませんがどなたかアドバイスをよろしくお願いいたします。
回答
-
色んなやり方があると思います。
1つは既に出ているオーバーライドを利用した方法
親フォームにオーバーライド可能なメソッドを作成
子フォームでオーバーライドして処理を記述。
-----------------------------------------------------------------------
親フォーム
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
'日付が現在日付より後の場合処理を抜ける
If CDate(DateTimePicker1.Text) >= Today Then
MsgBox("日付を現在日付より前の日で指定してください")
Exit Sub
Else
Me.過去年月処理()
End If
End Sub
MustOverride Sub 過去年月処理()
-----------------------------------------------------------------------
子フォーム
Public Overrides Sub 過去年月処理()
'False時の処理を記述
End Sub
-----------------------------------------------------------------------
もしくは深く考えずに変数に一度格納してやる方法も。
-----------------------------------------------------------------------
親フォーム
Protected m_b過去年月 As Boolean = False
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Me.m_b過去年月 = (CDate(DateTimePicker1.Text) < Today)
' 過去日付ではない場合、メッセージを出力
If Not Me.m_b過去年月 Then
MsgBox("日付を現在日付より前の日で指定してください")
Exit Sub
End If
End Sub
-----------------------------------------------------------------------
子フォーム
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
' 過去日付の場合は処理を行なう
If Me.m_b過去年月 Then
' 過去年月時の処理を記述
End If
End Sub
-----------------------------------------------------------------------
継承した場合は、オーバーライドしない限りは
親→子の順番で処理が実行されるので
それを覚えておくと色々役立つかもしれません。
すべての返信
-
さとさとさんこんにちは。
さとさと さんからの引用 皆様お世話になります。
フォームの継承で質問があります。
フォームにDateTimePicker1と Button1を貼り付けて
ボタンが押されたときの実行処理をしてあります。
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
'日付が現在日付より後の場合処理を抜ける
If CDate(DateTimePicker1.Text) > Today Then
MsgBox("日付を現在日付より前の日で指定してください")
Exit Sub
'Falseの場合処理を行いたい
End IfEnd Sub
のFalseの処理を行いたい場所にオーバーライド可能なメソッドAを呼び出すようにして、
子フォームではFalse時用のメソッドAをオーバーライドすれば希望の処理ができると思います。
-
そのままのコードだと現在の日付を設定した場合もFalseに行きそうですが・・・。
あと 'Falseの場合処理を行いたい の前にElseが入ってるものと考えて良いのでしょうか。
そしてボタン付きの親フォームを継承して子フォームを作り、子フォームのボタンクリックイベントを実行しましたが
親フォームのボタンクリックイベント→子フォームのボタンクリックイベントの順で正常に処理が動きました。
どういう作り方をしているのか教えて頂けると助かります。
//ボタンの位置が色々変わる場合にはボタンクリックイベントに直接処理を記述せずに
//Protectedのメソッドを親フォームに記述しておくと良いかもしれませんね。 -
癒耶 様
私の説明が悪かったと思います。
要するに
親フォームでのボタンクリックイベントでは
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
'日付が現在日付より後の場合処理を抜ける
If CDate(DateTimePicker1.Text) > Today Then
MsgBox("日付を現在日付より前の日で指定してください")
Exit Sub
End IfEnd Sub
だけを記述してあります。
子のフォームでは親イベントの日付のチェックイベントを先に走らせて
FALSEの場合だけ子のボタンクリックイベントを行いたいのです。
継承した子のフォームでは
ボタンをクリッククした場合
1.日付が現在日付より後の場合処理を抜ける(共通処理のため親フォームで記述)
2.日付が現在日付より前の場合それぞれの子のフォームで独自の処理を行う
以上のことが行いたいのですが・・・
説明が悪くて申し訳ありません。
-
色んなやり方があると思います。
1つは既に出ているオーバーライドを利用した方法
親フォームにオーバーライド可能なメソッドを作成
子フォームでオーバーライドして処理を記述。
-----------------------------------------------------------------------
親フォーム
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
'日付が現在日付より後の場合処理を抜ける
If CDate(DateTimePicker1.Text) >= Today Then
MsgBox("日付を現在日付より前の日で指定してください")
Exit Sub
Else
Me.過去年月処理()
End If
End Sub
MustOverride Sub 過去年月処理()
-----------------------------------------------------------------------
子フォーム
Public Overrides Sub 過去年月処理()
'False時の処理を記述
End Sub
-----------------------------------------------------------------------
もしくは深く考えずに変数に一度格納してやる方法も。
-----------------------------------------------------------------------
親フォーム
Protected m_b過去年月 As Boolean = False
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Me.m_b過去年月 = (CDate(DateTimePicker1.Text) < Today)
' 過去日付ではない場合、メッセージを出力
If Not Me.m_b過去年月 Then
MsgBox("日付を現在日付より前の日で指定してください")
Exit Sub
End If
End Sub
-----------------------------------------------------------------------
子フォーム
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
' 過去日付の場合は処理を行なう
If Me.m_b過去年月 Then
' 過去年月時の処理を記述
End If
End Sub
-----------------------------------------------------------------------
継承した場合は、オーバーライドしない限りは
親→子の順番で処理が実行されるので
それを覚えておくと色々役立つかもしれません。 -
方法論はいろいろあるので、まず設計をはっきりさせたほうが良いでしょう。
以下の点を確認してみましょう。
・派生フォームで基底フォームの条件を意識する必要があるか?
→ 派生フォームにとっての認識は、単なるクリックなのか、条件を満たしたタイミングなのか?
→ 発展すると、派生フォームで基底フォームの処理を制御(キャンセル等)できるようにする必要があるか?
・派生フォームはボタン(Button1というオブジェクト)の存在を意識する必要があるか?(意識させないようにするのか?)
・派生フォームでおこなう独自処理とUIの関係は?
→ ここで言いたいのは、イベントなのか、業務処理なので必要時のオーバーライドなのか必須のオーバーライドなのかということ。
#タイトルは変更しないようにしましょう。
#ユーザーが検索する際の項目でもありますし。