none
フォームの継承について RRS feed

  • 質問

  •  皆様お世話になります。

    フォームの継承で質問があります。

     

    フォームに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 If

     End Sub

    Button1_Clickの時にDateTimePicker1の日付が現在日付よりも以前の条件で
    処理を行いたいのですが、同じようなフォームを沢山作るので
    フォームを継承させて子のフォームに処理を行いたいのですが
    どのようにコードを記述すれば意図したものになるのでしょうか?

    このままフォームを継承して子のフォームのButton1_Clickにコードを記述すると
    親フォームでのExit Subは親フォームでしか行われず
    子フォームでは何日を選択しても実装処理が行われてしまいます。

    初心者の質問で申し訳ありませんがどなたかアドバイスをよろしくお願いいたします。


     

     

    2008年5月1日 9:14

回答

  • 色んなやり方があると思います。
    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
    -----------------------------------------------------------------------

    継承した場合は、オーバーライドしない限りは
    親→子の順番で処理が実行されるので
    それを覚えておくと色々役立つかもしれません。
    2008年5月2日 12:15

すべての返信

  • さとさとさんこんにちは。

     さとさと さんからの引用

     皆様お世話になります。

    フォームの継承で質問があります。

     

    フォームに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 If

     End Sub

    のFalseの処理を行いたい場所にオーバーライド可能なメソッドAを呼び出すようにして、

    子フォームではFalse時用のメソッドAをオーバーライドすれば希望の処理ができると思います。

     

    2008年5月1日 10:31
  • そのままのコードだと現在の日付を設定した場合もFalseに行きそうですが・・・。
    あと   'Falseの場合処理を行いたい の前にElseが入ってるものと考えて良いのでしょうか。

    そしてボタン付きの親フォームを継承して子フォームを作り、子フォームのボタンクリックイベントを実行しましたが
    親フォームのボタンクリックイベント→子フォームのボタンクリックイベントの順で正常に処理が動きました。
    どういう作り方をしているのか教えて頂けると助かります。


    //ボタンの位置が色々変わる場合にはボタンクリックイベントに直接処理を記述せずに
    //Protectedのメソッドを親フォームに記述しておくと良いかもしれませんね。
    2008年5月1日 18:29
  • 癒耶

    私の説明が悪かったと思います。

    要するに

    親フォームでのボタンクリックイベントでは

    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 If

     End Sub

    だけを記述してあります。

     

    子のフォームでは親イベントの日付のチェックイベントを先に走らせて

    FALSEの場合だけ子のボタンクリックイベントを行いたいのです。

     

     

    継承した子のフォームでは

    ボタンをクリッククした場合

    1.日付が現在日付より後の場合処理を抜ける(共通処理のため親フォームで記述)

    2.日付が現在日付より前の場合それぞれの子のフォームで独自の処理を行う

     

    以上のことが行いたいのですが・・・

    説明が悪くて申し訳ありません。

    2008年5月2日 0:50
  • 色んなやり方があると思います。
    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
    -----------------------------------------------------------------------

    継承した場合は、オーバーライドしない限りは
    親→子の順番で処理が実行されるので
    それを覚えておくと色々役立つかもしれません。
    2008年5月2日 12:15
  • 方法論はいろいろあるので、まず設計をはっきりさせたほうが良いでしょう。

    以下の点を確認してみましょう。

     

    ・派生フォームで基底フォームの条件を意識する必要があるか?

     → 派生フォームにとっての認識は、単なるクリックなのか、条件を満たしたタイミングなのか?

     → 発展すると、派生フォームで基底フォームの処理を制御(キャンセル等)できるようにする必要があるか?

     

    ・派生フォームはボタン(Button1というオブジェクト)の存在を意識する必要があるか?(意識させないようにするのか?)

     

    ・派生フォームでおこなう独自処理とUIの関係は?

     → ここで言いたいのは、イベントなのか、業務処理なので必要時のオーバーライドなのか必須のオーバーライドなのかということ。

     

     

    #タイトルは変更しないようにしましょう。

    #ユーザーが検索する際の項目でもありますし。

    2008年5月7日 4:46
  • handcraft

    癒耶

    まどか

     

    丁寧な書き込みありがとうございました。

     

    もう一度設計を見直ししてみます。

     

    初心者の私にわかりやすいご解説まことにありがとうございました。

     

    またわからないことで質問するかもしれませんが

    その時はよろしくお願いいたします。

     

    2008年5月8日 4:03