none
戻り値を返さないメソッドのデリゲートを定義したい RRS feed

  • 質問

  • 戻り値を返さないメソッドのデリゲートを定義したい

    動作モードに応じて、コマンドボタンを押した時のメソッドの飛び先を変える処理を行いたいと思っています。
    以下はサンプルプログラムですが、戻り値を返すメソッドは正常に動作しますが、戻り値を返さないメソッドの作り方がわかりません。
    どうすればコンパイルエラーが出なくなるのか、教えて下さい。


    ■メインプログラム

    Public Class 共通変数
        Public Delegate Function SampleDelegate(ByVal x As Integer) As Integer
        Public Delegate Sub SampleDelegate2(ByVal x As Integer)
    End Class

    Class MainWindow ’起動と同時に実行

        Private Sub MainWindow_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded

            Dim b1 As New Class1
            Dim b2 As New Class2
            ' 動作モードによってメソッドの飛び先を変える
            Dim mode As Integer = 1 '0 or 1

            Dim w1 As New w1 'ボタンが1つあるだけのWindow
            If mode > 0 Then
                w1.sampleDE = AddressOf b1.C1P1
                w1.sampleDE2 = AddressOf b1.C1P2
            Else
                w1.sampleDE = AddressOf b2.C2P1
                w1.sampleDE2 = AddressOf b2.C2P2
            End If

            w1.ShowDialog()

        End Sub
    End Class



    Public Class Class1
        Public Function C1P1(ByVal x As Integer) As Integer
            Debug.Print("C1P1")
            Return 0
        End Function

        Public Sub C1P2(ByVal x As Integer)
            Debug.Print("C1P2")
        End Sub

    End Class

    Public Class Class2
        Public Function C2P1(ByVal x As Integer) As Integer
            Debug.Print("C2P1")
            Return 0
        End Function

        Public Sub C2P2(ByVal x As Integer)
            Debug.Print("C2P2")
        End Sub
    End Class


    ■w1:WPFウインドウ ボタンが1つあるだけのWindow

    <Window x:Class="w1"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:_0331"
            mc:Ignorable="d"
            Title="w1" Height="300" Width="300">
        <Grid>
            <Button Content="Button" HorizontalAlignment="Left" Height="64" Margin="95,96,0,0" VerticalAlignment="Top" Width="92" Click="Button_Click"/>

        </Grid>
    </Window>

    Public Class w1

        Public Property sampleDE As 共通変数.SampleDelegate 'Public Delegate Function SampleDelegate(ByVal x As Integer) As Integer
        Public Property sampleDE2 As 共通変数.SampleDelegate2 ' Public Delegate Sub SampleDelegate2(ByVal x As Integer)


        Private Sub Button_Click(sender As Object, e As RoutedEventArgs)
            'デリゲートを使用してFunctionを実行 これは正常に動作する
            Dim result As Integer = sampleDE(2)

            'デリゲートを使用してSubを実行したい
            sampleDE2(5) ' ← ここで「Public Property sampleDE As 共通変数.SampleDelegate' の引数が多すぎます。」のコンパイルエラーが出る
        End Sub
    End Class









    2018年3月31日 6:44

回答

  • 引数付きプロパティと区別が付かなくなってる感じですかね。

    一旦SampleDelegate型のローカル変数に代入してから実行する、hoge(4)と直接呼び出す代わりにhoge.Invoke(4)とInvokeメソッドで呼び出す、といった回避策が考えられます。

    が、一般的には、PublicなDelegateプロパティを定義することは推奨されません。Eventとして公開するのが推奨されます。

    • 回答としてマーク huahi11112 2018年3月31日 7:25
    2018年3月31日 6:59

すべての返信

  • 引数付きプロパティと区別が付かなくなってる感じですかね。

    一旦SampleDelegate型のローカル変数に代入してから実行する、hoge(4)と直接呼び出す代わりにhoge.Invoke(4)とInvokeメソッドで呼び出す、といった回避策が考えられます。

    が、一般的には、PublicなDelegateプロパティを定義することは推奨されません。Eventとして公開するのが推奨されます。

    • 回答としてマーク huahi11112 2018年3月31日 7:25
    2018年3月31日 6:59
  • 先ほど確認し、正常にコンパイルできました。

    Web上での情報が少なく、解決方法が分かりませんでした。この度も分かりやすい御教授をありがとうございました!

    2018年3月31日 7:27