C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.102144 の関連記事表示

<< 0 >>
■102144  Re[5]: VBでのイベント未定義の処理
□投稿者/ WebSurfer -(2023/07/09(Sun) 18:42:06)
    No102139 (ぴよ さん) に返信
    
    > Form2にTestがあれば、Test内で処理
    > TestがなければForm1のOnMouseDown内でValueにセットしたいのです。
    
    イベント MyEvent にハンドラがアタッチされてなければ Form1 の OnMouseDown メソッドで
    処理を行い、ハンドラ Test がアタッチされていればそのハンドラで処理を行いたいのだと
    理解しました。
    
    その理解で合っているのであれば、イベントを使うのは、XY 問題とまでは言えないものの、
    適切ではないと思います。
    
    デリゲートを使ってはいかがですか?
    
    質問者さんのコードを動くように直して(動かないコードを貼るのは止めましょう)、イベ
    ントに代えてデリゲートを使って書き直すと以下のようになります。下のコードでは Action 
    がデリゲートです。
    
    
    using System;
    using System.Windows.Forms;
    
    namespace WindowsFormsApp1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
                    
            public Action p;
    
            protected override void OnMouseDown(MouseEventArgs e)
            {
                if (p != null)
                {
                    // デリゲートのポイントするメソッドで処理
                    p();
                }
                else
                {
                    MessageBox.Show("Form1 の OnMouseDown で処理");
                }
    
                base.OnMouseDown(e);
            }
        }
    }
    
    
    using System;
    using System.Windows.Forms;
    
    namespace WindowsFormsApp1
    {
        public partial class Form2 : Form
        {
            public Form1 frm1 = new Form1();
            
            public Form2()
            {
                InitializeComponent();
    
                frm1.TopLevel = false;
                frm1.Height = 100;
                frm1.Width = 100;
                frm1.Visible = true;
                this.Controls.Add(frm1);
    
                // 以下の設定で Test メソッドで処理される
                // コメントアウトすれば From1 の OnMouseDown で処理
                frm1.p = new Action(Test);
            }
    
            public void Test()
            {
                MessageBox.Show("Form2 の Test メソッドで処理");
            }
        }
    }
    
    デリゲートの方が目的に合っているし、上のコードであれば C# ⇒ VB.NET 変換サービスで変換し
    たコードをほぼそのまま使えますので、「VBでのイベント発生方法は RaiseEventと書いているの
    しか見つからず困っています」とかで悩むこともないです。
    
    例えば、上のコードを以下の変換サービスで変換したコードを、
    
    Telerik Code Converter
    https://converter.telerik.com/
    
    ほぼそのまま使って以下のようにできます。
    
    
    Public Class Form1
        Public Sub New()
            InitializeComponent()
        End Sub
    
        Public p As Action
    
        Protected Overrides Sub OnMouseDown(ByVal e As MouseEventArgs)
            If p IsNot Nothing Then
                p()
            Else
                MessageBox.Show("Form1 の OnMouseDown で処理")
            End If
    
            MyBase.OnMouseDown(e)
        End Sub
    End Class
    
    
    Public Class Form2
        Public frm1 As Form1 = New Form1()
    
        Public Sub New()
            InitializeComponent()
            frm1.TopLevel = False
            frm1.Height = 100
            frm1.Width = 100
            frm1.Visible = True
            Me.Controls.Add(frm1)
    
            '以下の設定で Test メソッドで処理される
            'コメントアウトすれば From2 の OnMouseDown で処理
            'frm1.p = New Action(AddressOf Test)
        End Sub
    
        Public Sub Test()
            MessageBox.Show("Form2 の Test メソッドで処理")
        End Sub
    End Class
    
記事No.102127 のレス /過去ログ178より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -