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

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

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

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

VB.NET

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

Q&A

解決済

2回答

5557閲覧

public propertyの正しい使い方とは

hanbee.com

総合スコア52

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

VB.NET

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

0グッド

0クリップ

投稿2021/03/28 07:57

編集2021/03/28 07:59

お世話になっております。
プログラム初心者のものですが、以前フォーム間の変数の受け渡しについて質問した際、YamaGNZさんに
「public property 〇〇 as string 」と宣言することを教わりました。
このページより→   https://teratail.com/questions/294325

どのクラスからでもアクセスできる?っぽいので、私はこの方法を多用していましたが、
ここにきて、なんでだろうということが起こっています。
public propertyを子フォーム→孫フォームと移していくのですが、最後のところで
messageBoxが空になるのです。
作っているコードは以下のようなものです。

Public class form1 'ここで宣言するtana_kigouを親フォーム→子フォーム→孫フォーム→ひ孫フォーム→玄孫フォーム→ '・・・→tuika_finalと移していく Public Property tana_kigou as string 'データベースに項目を追加するプログラム Private Sub b_tuika_Click(sender As Object, e As EventArgs) Handles b_tuika.Click Dim t As New tuika tuika_final.tana_f = tana_kigou MessageBox.Show(tuika_final.tana_f) t.ShowDialog(Me) t.Dispose() End Sub End class 'tuikaフォームを開く Public class tuika Private Sub b_tuika_Click(sender As Object, e As EventArgs) Handles b_tuika.Click Dim t1 As New tuika1 MessageBox.Show(tuika_final.tana_f) t1.ShowDialog(Me) t1.Dispose() End Sub End class 'tuika1フォームを開く Public class tuika1 Private Sub b_tuika_Click(sender As Object, e As EventArgs) Handles b_tuika.Click Dim t2 As New tuika2 MessageBox.Show(tuika_final.tana_f) t2.ShowDialog(Me) t2.Dispose() End Sub End class 'tuika2,3,4,5と同様・・・ '・・・ 'tuika_finalフォームを開く Public class tuika_final Public Property tana_f As String Private Sub tuika_final_Load(sender As Object, e As EventArgs) Handles MyBase.Load 'ここでtana_fがなぜか空になる MessageBox.Show(Me.tana_f) End Sub End class

私のコードにつまらないミスがあればすみません。
まず、そもそもネット検索していたら、私が多用しているようなPublic propertyの使い方はどこにも書いておらず、以下のような書き方をしているものについて説明されているものしかなかったです。
参照: https://dobon.net/vb/dotnet/vb6/property.html

Public Property Number1() As Integer Get Return _number1 End Get Set(ByVal value As Integer) _number1 = value End Set End Property

私が使っている方法と比べると、tuika_finalフォームにPublic writeonly propertyを作って、
form1からSetすればよさそうな気もするのですが、私が使っている方法は何なのか、この記事を見てから
よくわからなくなってしまいました。

分かる方おられれば、ご教授いただければ幸いです。
以上、長文失礼しました。

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

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

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

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

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

guest

回答2

0

ベストアンサー

以前の質問の回答に関してはプロパティにて実装する方法で回答致しましたが、他にもいろいろと方法はあります。
例にあるようなものであれば、プロパティで実装するのではなくコンストラクタの引数として値を渡すような実装の方がいいかもしれません。

VB.NET

1 Public Property Number1() As Integer

VB.NET

1 Public Property Number1() As Integer 2 Get 3 Return _number1 4 End Get 5 Set(ByVal value As Integer) 6 _number1 = value 7 End Set 8 End Property

については自動実装プロパティ (Visual Basic)
こちらを読んでみてください。

質問を読む限りクラスやプロパティ、インスタンスについて基本的なことを学習する必要があるかと思います。

投稿2021/03/28 08:18

YAmaGNZ

総合スコア10469

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

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

hanbee.com

2021/03/28 08:30

ご回答ありがとうございます。 自動実装プロパティというものだったのですね。毎度勉強になります。ありがとうございます。 ちなみに私が書いたコードは間違いがなければ目的の動作をしそうでしょうか。 ここからすでに間違えているのでしょうか。
hanbee.com

2021/03/28 08:32

>>コンストラクタの引数として値を渡すような実装 ですね。ちょっと考えてみたいと思います。ありがとうございます。
YAmaGNZ

2021/03/28 08:37

提示されているソースに関してはtuika_finalのインスタンスがどうなっているのか分かりませんので答えようがありません。 それぞれで参照しているインスタンスが別になっていませんか? こういったことも含めてクラスやインスタンスの基本的なことですので、基本から学習することをお勧めします。
hanbee.com

2021/03/28 08:41

たしかに、いまYamaGNZ様が言われた内容が理解できていませんので、学習が足りていません。 Dim t As New tuika ここでインスタンス?を作っていると思っていますが、 何を懸念されているのか理解できていません。。。
hanbee.com

2021/03/28 08:48

学習したいと思います。
YAmaGNZ

2021/03/28 08:50

各フォームで参照しているtuika_finalは同一のインスタンスなのかということです。
hanbee.com

2021/03/28 09:03

調べてみました。まずform1でtuika_finalのインスタンスを作っていないので、 作る必要があるよ、ということでしょうか。 https://dobon.net/vb/dotnet/form/accessanotherformdata.html 'tuika_finalオブジェクトを保持するためのフィールド Private Shared _tuika_finalInstance As tuika_final 'tuika_finalのインスタンスの作成 Dim t_f As New tuika_final 'tuika_finalInstanceに代入 Form1.tuikafinalInstance = t_f 以上をform1のloadイベントに追加して、 t_f.tana_f = me.tana_kigou とすればよいということだったりしますかね。
hanbee.com

2021/03/28 09:19

また、 Dim t As New tuika このコードでインスタンスが作成されている?のかはわかりませんが、 インスタンスを作成する必要があるのはなんでなのでしょうか。 質問ばっかりですいません。
YAmaGNZ

2021/03/28 10:39

VBの便利かつやっかいなところとして、form1というフォームをデザイナで作成したら、コード上でインスタンスを作成するコードを明記しなくても form1.Show() といった感じで書いて実行することができます。 これはVBが内部で自動でform1のインスタンスを作成して利用できるようにしている為です。 なので、フォームのインスタンスをあまり意識せずに作成できてしまいます。 多分、form1とかで使っているtuika_finalはこれに当たるのではないかと予想しています。 そして、下位のフォームのなかでnewしている部分があるのではないでしょうか? そうすると、VBで自動作成されたインスタンスとは別のインスタンスが出来上がります。 このインスタンスをShowしてしまうと、form1でtana_fプロパティに値をセットしたインスタンスとは別のインスタンスをShowするので、tuika_finalのロードイベントにて値を見た場合は空になっているのではないかと予想しています。 なので、インスタンスについて学習しましょうということです。
hanbee.com

2021/03/28 11:15

なるほど。分かりやすい解説をありがとうございます。 >下位のフォームのなかでnewしている部分があるのではないでしょうか? 仰る通り、tuika5で以下のようにNewしてtuika_finalをshowしています。 Dim t_f As New tuika_final t_f.ShowDialog(Me) t_f.Dispose() これでは新しく別のインスタンスを作っていることになるのですね。 とても理解が進んだ気がします。 本当にありがとうございます。 https://www.umayadia.com/VBStandard2/Standard20.htm#A2_7 いま、このページを参考に、YAmaGNZ様のご提案のあったコンストラクタの引数として渡していくやり方でコードを作ろうとしています。 それについても、進展があれば追記させてください。
YAmaGNZ

2021/03/28 11:49

コンストラクタの引数での実装をしたとしても、自分が操作している、操作すべきインスタンスは重要ですので、このあたりはしっかり理解できるようにならないといけません。
hanbee.com

2021/03/28 13:55

了解しました。自分が操作しているインスタンスについて意識するようにします。 YAmaGNZ様の回答を参考にして、コンストラクタの引数を使って、目的の動作を実現できました。 自分の回答のところに書きましたので、何かまだ足りないものなどあればご指摘お願い致します。
guest

0

YAmaGNZ様、ご回答ありがとうございました。
コンストラクタの引数として値を渡す方法で解決できました。
また、プログラムもすっきりしてよかったです。

Public class form1 'ここで宣言するtana_kigouを親フォーム→子フォーム→孫フォーム→ひ孫フォーム→玄孫フォーム→ '・・・→tuika_finalと移していく Public Property tana_kigou as string 'データベースに項目を追加するプログラム Private Sub b_tuika_Click(sender As Object, e As EventArgs) Handles b_tuika.Click Dim t As New tuika(tana_kigou) t.ShowDialog(Me) t.Dispose() End Sub End class 'tuikaフォームを開く Public class tuika Private Sub b_tuika_Click(sender As Object, e As EventArgs) Handles b_tuika.Click Dim t1 As New tuika1(tana_) t1.ShowDialog(Me) t1.Dispose() End Sub Private tana_ As String Public Sub New(tana_add as string) tana_ = tana_add End Sub End class 'tuika1フォームを開く Public class tuika1 Private Sub b_tuika_Click(sender As Object, e As EventArgs) Handles b_tuika.Click Dim t2 As New tuika2(tana_) MessageBox.Show(tuika_final.tana_f) t2.ShowDialog(Me) t2.Dispose() End Sub Private tana_ As String Public Sub New(tana_add as string) tana_ = tana_add End Sub End class 'tuika2,3,4,5と同様・・・ '・・・ 'tuika_finalフォームを開く Public class tuika_final Private Sub tuika_final_Load(sender As Object, e As EventArgs) Handles MyBase.Load 'これでちゃんと表示される MessageBox.Show(tana_) End Sub Private tana_ As String Public Sub New(tana_add as string) tana_ = tana_add End Sub End class

したい動作をしてくれることも確認できました。

コンストラクタを初めて使ったりできましたし、
インスタンスなどについて、いままで回答いただいた回答者様の書いていた文章がやっと理解できたような気がします。1つ壁を越えられたような気がします。
とても親身な回答をいただき、本当にありがとうございました。

投稿2021/03/28 13:51

編集2021/03/28 14:33
hanbee.com

総合スコア52

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問