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

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

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

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

Q&A

解決済

2回答

9777閲覧

【VB.NET】クラスとモジュールの扱い方

momo842

総合スコア7

VB.NET

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

0グッド

0クリップ

投稿2020/08/21 00:04

編集2020/08/21 01:36

前提・実現したいこと

お世話になります。
VB.NETにおけるクラスとモジュールに関してです。

VB.NET初心者です。
現在Windowsフォームアプリケーションでソフトを作成中です。
面倒な構造ですが、フォームが多岐にわたっているため、下位モジュール、上位モジュール
内に関数を作成し、それらをフォームクラスに反映させています。

今回お聞きしたいことは、クラスで定義した値をモジュールで使用できないのか です。
クラス上でPublicで設定した変数をモジュール上で使用したいのですが、
できませんでした。やりたいことは下記例のようなことです。


VBNET

1Public Class FormA '値を設定するためのフォームクラス 2public a as integer 3a = TextBox1.text 4end Class 5 6Public Module Kansu1 '下位関数 7Public Sub kan1(Byval c as integer) 8Dim b as integer 9b = a * 2 10end Sub 11 12Public Module Kansu2() '上位関数:下位関数を使用している 13Public Sub kan2() 14kan1(a) 15end Sub 16 17Public Class FormB '上位関数を用いて演算結果を表示するフォームクラス 18Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 19Dim d as integer 20d = kan2 21TextBox2.Text = d 22end Sub

※例のため意味のない関数になっています、、、
一応図にもしておきます。
イメージ説明

クラスもモジュールも含めてグローバル変数を設定できるわけではないのでしょうか。
(クラスで設定したグローバル変数がモジュール上でも同じ名前で変数設定できて困惑しています、、、)

つたない説明で申し訳ありません。
宜しくお願い致します。

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

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

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

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

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

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

momo842

2020/08/21 00:40

回答ありがとうございます。 VBと表記するとVB6を示すことになってしまうんですね、、、 知りませんでした。。。
dodox86

2020/08/21 00:49

> 回答ありがとうございます。 > VBと表記するとVB6を示すことになってしまう 「回答」ではないのですけれどもね。単なる質問文の修正依頼です。 "VB"(のタグ)はまぎらわしいですが、"Visual Basic”に関してはExcelマクロなどで使う"VBA"(Visual Basic for Applications)や、クラシックASP、WSHで使う"VBScript"もあります。違いを意識するのは他の閲覧者や回答者にとっても大事です。
退会済みユーザー

退会済みユーザー

2020/08/21 00:52

知らないとこのへん結構紛らわしいですよね。 どれか一つしか触った事ない人だと、なんじゃそりゃってなるのは正直分からなくもない…
dodox86

2020/08/21 01:03

>@radianさん > どれか一つしか触った事ない人だと、なんじゃそりゃってなるのは正直分からなくもない… 私も実はそう思っています。回答せずにコメントのみで細かいことを書きたくもないのですけど、間違いや誤解が生じそうなことを放置しておくわけにもいかないでしょうし。
momo842

2020/08/21 01:14

お二人ともありがとうございます。 質問文の修正をしました。 今後は気を付けて質問しようと思います。
dodox86

2020/08/21 01:15

> 質問文の修正をしました。 もうひとつ指摘させてもらったつもりでしたが、コードの整形(マークダウン記法を使う)は無し、でしょうか?
momo842

2020/08/21 01:37

こういう風に皆さんコード書いていたんですね、、、 勉強になります。
guest

回答2

0

moduleにメソッドを書いて共通関数みたいな形で使えますが、各オブジェクトの変数をアクセスするのではなく引数として与えるべきです。
Moduleに変数を定義してグローバル変数として使うこともできますが、なるべくならグローバル変数を使用すべきではありません。

今回挙げられた例ですと、

VBNET

1Public Module Kansu1 '下位関数 2 Public Function kan1(Byval c As Integer) As Integer 3 Return c * 2 4 End Function 5End Module 6 7Public Module Kansu2() '上位関数:下位関数を使用している 8 Public Function kan2(a As Integer) As Integer 9 Return kan1(a) 10 End Function 11End Module

と戻り値なしではなく戻り値を返すようFunctionで定義し、関数の入力、出力を他のものに依存する形ではなく独立させるべきです。

そして、利用する側ですが

VBNET

1Public Class FormA '値を設定するためのフォームクラス 2 '表示する時にFormB.aから値を取得して表示する 3 4 '値が確定した時にFormB.aに値をセットする 5 Private Sub OKButton_Click(sender As Object, e As EventArgs) Handles OKButton.Click 6 FormB.a = Integer.Parse(TextBox1.Text) 7 End Sub 8End Class 9 10Public Class FormB '上位関数を用いて演算結果を表示するフォームクラス 11 '可変項目を設定、取得するためのプロパティ 12 Public Property a As Integer 13 14 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 15 '可変項目aを引数としてKansu2を呼び出す 16 TextBox2.Text = kan2(Me.a).ToString() 17 End Sub 18End Class

といった感じで、各オブジェクトのやりとりはプロパティやメソッドを利用する形で行うべきです。

投稿2020/08/21 00:48

編集2020/08/21 02:03
YAmaGNZ

総合スコア10258

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

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

momo842

2020/08/21 01:55

ご回答ありがとうございます。 丁寧に礼まで書いて下さり感謝です。 なるほど!戻り値を返させて利用するのは完全に抜けていました、、、 早速試してみます。
guest

0

ベストアンサー

クラスのオブジェクトを渡さないと、そのクラス内のメンバにはアクセスできません。
その図のKansu1かFormAのメンバにアクセスするのであれば、FormAのオブジェクトをどこかで作成し、それを渡してやる必要があります。
あと、Publicな変数を公開するのは、.NETプログラミングでは通常ご法度なので、プロパティにしてください。(プロパティが判らなければ、まず言語の基本から勉強してください)

Sharedで宣言すると、同じクラスのオブジェクトを複数作っても、その全てで共有されます。
Public Sharedプロパティで公開すれば、一応外部からも直接アクセスは可能です。
ただ、何でもかんでも公開するのは正直オススメしないです。

vbnet

1Public Class FormA 2 3 Public Shared Property PropertyA As Integer = 100 4 5 ... 6 7End Class 8 9'' このようにアクセスできる 10'' Dim i As Integer = FormA.PropertyA

複数のオブジェクト間で値を共有する必要があるのであれば、共有する値のプロパティを持たせたシングルトンのクラスを一つ作って、そのクラス経由で共有する、などした方がよいでしょう。

投稿2020/08/21 00:20

編集2020/08/21 00:44
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

momo842

2020/08/21 00:42

ご回答ありがとうございます。 そういうプロパティ設定があるんですね。 まずは調べてみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問