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

あるFormでPublic宣言したSubを他Formから呼び出せない

環境/言語:[Windows8.1、VB.NET2012]
分類:[.NET]

お世話になります。


変数ではなく、Subのスコープについて、お伺いさせてください。


Form1、Form2の2つのFormがあります。
Form1にはbtnOpen、btnOKの2つのボタンがあります。
Form2にはbtnClose、btnOKの2つのボタンがあります。


EXEを起動すると、Form1が開きます。
Form1のbtnOpenを押すと、Form2が開きます。
Form2のbtnCloseを押すと、Form1に戻ります。


両FormのbtnOKを押すと、共に「OK」とメッセージが出ます。
これを以下のように書いています。
Form用の変数宣言は、別のモジュールmodHensu.vbで宣言しています。


Module modHensu
'フォーム
Public pbfm1 As Form1
Public pbfm2 As Form2
End Module


Public Class Form1
Private Sub btnOpen_Click(sender As Object, e As EventArgs) Handles btnOpen.Click
pbfm2 = New Form1
pbfm2.Show()
Me.Hide()
End Sub

Private Sub btnOK_Click(sender As Object, e As EventArgs) Handles btnOK.Click
HYOUJI()
End Sub

Public Sub HYOUJI()
MsgBox("OK")
End Sub
End Class


Public Class Form2
Private Sub btnExit_Click(sender As Object, e As EventArgs) Handles btnExit.Click
pbfm1 = New Form1
pbfm1.Show()
Me.Close()
End Sub

Private Sub btnOK_Click(sender As Object, e As EventArgs) Handles btnOK.Click
HYOUJI()
End Sub
End Class


このコードでビルドしますと、Form2のbtnOK.ClickにおけるHYOUJI()の呼び出しが、エラーになります。


Public Sub HYOUJI()を、modHensu.vbの中に置くと、エラーにはなりません。


Publicを使用している場合、他のFormからでも参照出来る、と説明にあったのですが、エラーの原因が分かりません。


シンプルな質問かもしれませんが、どうぞよろしくお願いします。
■No32611に返信(ERIさんの記事)
> Public Class Form1
>   Private Sub btnOK_Click(sender As Object, e As EventArgs) Handles btnOK.Click
>     HYOUJI()
>   End Sub
>   Public Sub HYOUJI()
>     MsgBox("OK")
>   End Sub
> End Class

この場合、Click イベント内から呼び出しは、「Me.HYOUJI()」を意味します。
すなわち、自フォーム時に記載された Public Sub HYOUJI() のことです。


> Public Class Form2
>   Private Sub btnOK_Click(sender As Object, e As EventArgs) Handles btnOK.Click
>     HYOUJI()
>   End Sub
> End Class

同様に、「何某.HYOUJI()」という記載がされていませんので、
自フォーム上の HYOUJI メソッドを探そうとします。しかしながら、
そのようなメソッドは定義されていないため、エラーとなります。

Form1 のそれを呼び出したいのであれば、たとえば
 If pbfm1 IsNot Nothing Then
   pbfm1.HYOUJI()
 End If
などの記述が必要になるでしょう。

> Publicを使用している場合、他のFormからでも参照出来る、と説明にあったのですが、エラーの原因が分かりません。
たとえば、基底となる Form クラスには Show メソッドがあります。
Form クラスはいくつでも New でインスタンス化できますから、
どのフォームを表示させたいのか、明示して「何某.Show()」と呼びますよね。

それと同様、自作したメソッドであっても、対象となるオブジェクトを
指定することが必要となります。オブジェクト名を省略した場合は
自分自身もしくは Module 上のメンバーとして解釈されます。
■No32611に返信(ERIさんの記事)

> Publicを使用している場合、他のFormからでも参照出来る、と説明にあったのですが、エラーの原因が分かりません。
>

■No32612の魔界の仮面弁士さんの記事
でも良いと思いますが

Form1をForm2が継承していればいい様に思いますがどうでしょうか?


後どうでもいい事かもしれませんが
■No32611のERIさんの記事
に書かれたソースはもともとコンパイルが通らないと思います。
以下にコンパイルが通らない個所を記述します。
>Public Class Form1
> Private Sub btnOpen_Click(sender As Object, e As EventArgs) Handles btnOpen.Click
ここ↓
> pbfm2 = New Form1

> pbfm2.Show()
> Me.Hide()
> End Sub


>Public Class Form2
> Private Sub btnOK_Click(sender As Object, e As EventArgs) Handles btnOK.Click
ここ↓
> HYOUJI()
> End Sub


> シンプルな質問かもしれませんが、どうぞよろしくお願いします。

シンプルな質問に、シンプルな質問で返しますが
質問の内容が解った所で結局”何をしたかった”んでしょうか?

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