DOBON.NET DOBON.NETプログラミング掲示板過去ログ

メソッドポインタを使いたい

環境/言語:[VB2008]
分類:[.NET]

こんにちは。

練習でメモ帳を作っているのですが
メニューの項目の[新規]でも[開く]でも[メモ帳の終了]でも
同じようなロジックが出てきます。

この時にメソッドポインタとか、そういうもので
この3つをまとめることで、もっと短くすることはできないでしょうか?

メソッドポインタと呼ぶのかどうかわかりませんが
それの使い方を教えてください。


抜粋したソースは次のとおり。

それぞれ、TextBox1.Clear()を呼んでいるのか、
OpenSelectFile()を呼んでいるのか、Me.Close()を呼んでいるのか
の違いだけで、ソースコードが冗長だと思っています。
この3つをまとめたいのです。
よろしくおねがいします。


    Private Sub 新規ToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 新規ToolStripMenuItem.Click
        If TextBox1.Modified Then
            Select Case MessageBox.Show(SaveConfirmDialogMessage, SaveConfirmDialogTitle, _
                       MessageBoxButtons.YesNoCancel, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1)
                Case DialogResult.Yes
                    If System.IO.File.Exists(FilePath) Then
                        FileSave()
                        TextBox1.Clear()
                    Else
                        If SaveFileDialog1.ShowDialog Then
                            FilePath = SaveFileDialog1.FileName
                            FileSave()
                            TextBox1.Clear()
                        End If
                    End If
                Case DialogResult.No
                    TextBox1.Clear()
                Case DialogResult.Cancel
            End Select
        Else
            TextBox1.Clear()
        End If
    End Sub

    Private Sub 開くOToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 開くOToolStripMenuItem.Click
        If TextBox1.Modified Then
            Select Case MessageBox.Show(SaveConfirmDialogMessage, SaveConfirmDialogTitle, _
                       MessageBoxButtons.YesNoCancel, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1)
                Case DialogResult.Yes
                    If System.IO.File.Exists(FilePath) Then
                        FileSave()
                        OpenSelectFile()
                    Else
                        If SaveFileDialog1.ShowDialog Then
                            FilePath = SaveFileDialog1.FileName
                            FileSave()
                            OpenSelectFile()
                        End If
                    End If
                Case DialogResult.No
                    OpenSelectFile()
                Case DialogResult.Cancel
            End Select
        Else
            OpenSelectFile()
        End If
    End Sub

    Private Sub メモ帳の終了ToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles メモ帳の終了ToolStripMenuItem.Click
        If TextBox1.Modified Then
            Select Case MessageBox.Show(SaveConfirmDialogMessage, SaveConfirmDialogTitle, _
                                        MessageBoxButtons.YesNoCancel, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1)
                Case DialogResult.Yes
                    If System.IO.File.Exists(FilePath) Then
                        IO.File.WriteAllText(FilePath, TextBox1.Text, System.Text.Encoding.GetEncoding("Shift-JIS"))
                        Me.Close()
                    Else
                        If SaveFileDialog1.ShowDialog Then
                            FilePath = SaveFileDialog1.FileName
                            FileSave()
                            Me.Close()
                        End If
                    End If
                Case DialogResult.No
                    Me.Close()
                Case DialogResult.Cancel
            End Select
        Else
            Me.Close()
        End If
        Me.Close()
    End Sub
■No23576に返信(FutoNekoさんの記事)
> この3つをまとめることで、もっと短くすることはできないでしょうか?
>

プロシージャとイベントを1対多で結びつける
http://homepage1.nifty.com/rucio/main/dotnet/shokyu/standard10.htm

Private Sub ToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles 新規ToolStripMenuItem.Click,開くOToolStripMenuItem,メモ帳の終了ToolStripMenuItem.Click

sender にイベント対象コントロールが入ってくるので
処理を分ける


Select DirectCast(sender,ToolStripMenuItem).Name
Case 新規ToolStripMenuItem.Name

Case 開くOToolStripMenuItem.Name

Case メモ帳の終了ToolStripMenuItem.Name
End Select
2008/12/13(Sat) 23:15:35 編集(投稿者)

デリゲートを使うと希望の処理を実現できますよ。
 
Private Sub 新規ToolStripMenuItem_Click _
(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 新規ToolStripMenuItem.Click
    共通の処理(AddressOf TextBox1.Clear)
End Sub
 
Private Sub 開くOToolStripMenuItem_Click _
(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 開くOToolStripMenuItem.Click
    共通の処理(AddressOf OpenSelectFile)
End Sub
 
Private Sub メモ帳の終了ToolStripMenuItem_Click _
(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles メモ帳の終了ToolStripMenuItem.Click
    共通の処理(AddressOf Me.Close)
End Sub
 
Private Sub 共通の処理(異なる処理 As Action)
     If TextBox1.Modified Then
         Select Case MessageBox.Show(SaveConfirmDialogMessage, SaveConfirmDialogTitle, _
                    MessageBoxButtons.YesNoCancel, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1)
             Case DialogResult.Yes
                 If System.IO.File.Exists(FilePath) Then
                     FileSave()
                     異なる処理()
                 Else
                     If SaveFileDialog1.ShowDialog Then
                         FilePath = SaveFileDialog1.FileName
                         FileSave()
                         異なる処理()
                     End If
                 End If
             Case DialogResult.No
                 異なる処理()
             Case DialogResult.Cancel
          End Select
     Else
         異なる処理()
     End If
End Sub
返信、ありがとうございます。

SenderでSelectで分ける方法も勉強になりました。

こういう場合はデリゲートを使うとよいのですね。
ソースまで指示いただいたので大変よくわかりました。
すっきりしたコードがかけます。
ありがとうございました。

> デリゲートを使うと希望の処理を実現できますよ。
> Private Sub 新規ToolStripMenuItem_Click _
> (ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 新規ToolStripMenuItem.Click
> 共通の処理(AddressOf TextBox1.Clear)
> End Sub
>
> Private Sub 共通の処理(異なる処理 As Action)
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板