質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

1回答

8718閲覧

VB.NET 外部クラスのメソッド使用に関して

sasamaru

総合スコア2

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2021/07/07 00:14

前提・実現したいこと

VB.NETにてデスクトップアプリケーションを作成しております.

外部クラスからPublicなサブメソッドを実装中に以下のエラーメッセージが発生しました。
●エラー BC30469 非共有メンバーを参照するには、オブジェクト参照が必要です。

Public Class Aというクラスにて
メイン画面であるPublic Class MainFormというクラスに定義した
Public Sub Refresh()

自分で作成したPublic Class CommonMethodというクラスに定義した
Public Sub Refresh2()
を呼び出しております.

このときメイン画面であるPublic Class MainFormというクラスのメソッドではエラーが発生しないのに対して
自分で作成したPublic Class CommonMethodというクラスのメソッドではエラーが発生します.

同じPublicの外部クラスからのメソッドの呼び出しであるにも関わらず
なぜ挙動が異なるのか分かりません.

WindowsFormとクラスでは扱い方が異なるのでしょうか.

定義しているメソッドは引数、戻り値も無く単なる作業をやらせたいメソッドになります.

発生している問題・エラーメッセージ

エラー BC30469 非共有メンバーを参照するには、オブジェクト参照が必要です。

該当のソースコード

VB.NET

1Public Class A 2 (途中省略) 3 Private Sub OKrslt_TB_KeyDown(sender As Object, e As KeyEventArgs) Handles OKrslt_TB.KeyDown 4 If e.KeyCode = Keys.Enter Then 5 '正しいシリアルを読込んだ時、次の工程へ進める 6 If OKrslt_TB.Text = CodeFin Then 7 formClosingJdg.FormClosingJdg = True 8 9 FormMain.Refresh() 'エラーが生じない 10 CommonMethod.Refresh2() 'エラー BC30469 非共有メンバーを参照するには、オブジェクト参照が必要です。 11 12 (途中省略) 13End Class

試したこと

CommonMethod.Refresh2()に対してインスタンスの型宣言と生成を行うとエラーが生じない.

しかしそれであれば、FormMain.Refresh()の方は何故インスタンスが必要ないのかが分かりません.

補足情報(FW/ツールのバージョンなど)

VisualStudio2019

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YAmaGNZ

2021/07/07 00:25

CommonMethod.Refresh2の定義を書いてください
neconekocat

2021/07/07 00:25

FormMainはMainFormクラスのインスタンスであることは理解されていますか?
sasamaru

2021/07/07 00:29

ご回答ありがとうございます. Public Class CommonMethod (省略) Public Sub Refresh2() FormMain.RsltView1.RowCount = My.Settings.Packs_Num For i As Integer = 0 To My.Settings.Packs_Num - 1 FormMain.RsltView1.Rows(i).Cells(0).Value = "--" FormMain.RsltView1.Rows(i).Cells(1).Value = "--" FormMain.RsltView1.Rows(i).Cells(2).Value = "--" FormMain.RsltView1.Rows(i).Height = 50 Next End Sub (省略) End Class 上記になります. ちなみにRefresh(), Refresh2()ともに中身を空にしても同様のエラーが生じます. WindowsFormとCLassの違いになるのでしょうか.
sasamaru

2021/07/07 00:31

neconekocat様 ご回答ありがとうございます. ご指摘いただいた点が理解できておりません. Formの場合、自動でインスタンスが生成されているという事でしょうか?
退会済みユーザー

退会済みユーザー

2021/07/07 00:32

質問する前にとりあえずエラーメッセージでググって参考になりそうな記事を調べてみるとかしましたか? 例えば下記: 「オブジェクト参照が必要です」エラーが出たときは? https://www.atmarkit.co.jp/ait/articles/1806/06/news023.html 調べて、対処してみたが効果が無かったとかならそいう言う情報も書いていただけると、回答者・閲覧者に役に立つのですが。 そういうガイドラインも出てますので一度読んでください→ https://teratail.com/help/question-tips
neconekocat

2021/07/07 00:33

MainForm.Refresh()に書き換えて実行すれば意味が分かるかと思います。 質問文に書かれている内容が正しいならエラーになるはずですよ。
sasamaru

2021/07/07 00:38

neconekocat様 ありがとうございます. 質問文が間違っておりました.申し訳ございません. Public Class MainFormではなく Public Class FormMainが正しいクラス名になります. なのでFormMian.Refresh()として、特にNewでインスタンスを生成していないのに エラーが出ない理由が分からず困っております.
sasamaru

2021/07/07 00:41

SurferOnWww様 ググって調べ、エラー自体については”試したこと”欄に記載がある通り解決できております. エラーが生じているいることが問題なのではなく、 なぜ外部クラスのPublic Class FormMainのPublic Subメソッドではインスタンスの生成が不要なのかが分からないという疑問になります.
退会済みユーザー

退会済みユーザー

2021/07/07 00:50 編集

記事に書いてあるこの話とは違うのでしょうか ↓ "なぜこのような違いが生じるのだろうか? それは暗黙のフォームインスタンスにある。詳しくは、「.NET開発者中心 厳選ブログ記事:.NET開発を始めるVB6プログラマーが知るべき9のこと」の「3.Form.Show()はしない」をご覧いただきたい。"
guest

回答1

0

ベストアンサー

VB.NETの仕様です。
Formクラスは、勝手にインスタンスが作成されます。
[VB.NET] 暗黙のFormオブジェクト~My.Forms

自作クラスに関しては、インスタンスが存在しないので作成するか、Sharedに設定する必要があります。

投稿2021/07/07 00:42

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sasamaru

2021/07/07 00:51

ありがとうございます. リンク先の説明がとても分かりやすく理解できました. Formクラスは勝手にインスタンスを生成するのですね。。。 講習テキストにも載っていない内容だったので本当に助かりました! ありがとうございます!
退会済みユーザー

退会済みユーザー

2021/07/07 01:00

.NETの記事はC#が主流で、VB.NETは結構知られていない謎仕様があったりしますので、注意してください。(プロパティ引数とかVB.NETでは出来て何故かC#では出来ない)
neconekocat

2021/07/07 01:20

そういやそんな仕様もありましたっけ。。。 プロパティ引数がC#にないのは設計思想に反してるからですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問