VB.NET 他画面へのデータのセット


りな  2004-10-29 19:13:16  No: 86311

画面Aから画面Bをモーダルで開き、画面Bでボタン押下したとき、選択した値を画面Aのテキストボックスに表示したいのですが、うまく表示されません。VB.NETで開発を行っています。
よろしくおねがいします。ソースは以下です。

    Private Sub btnOK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnOK.Click

        Dim f As GAMEN_A
        f = New GAMEN_A

  f.txtMaker.Text = txtMakerName.Text

        Close()

    End Sub

何かおかしいところはありますでしょうか??


java.lang.Nullpo  2004-11-01 23:40:57  No: 86312

> 何かおかしいところはありますでしょうか??

はい。おかしいところがあります。

> Dim f As GAMEN_A
> f = New GAMEN_A
> f.txtMaker.Text = txtMakerName.Text

画面Aの新しいインスタンスを生成してますので、
呼び出し側の、画面Aとは「別物」になることに注意してください。

画面Aとおっしゃっている Form を引数で渡すようにするか、
唯一のインスタンス変数を公開しておき、プロパティを通して渡すべきでしょう。

ちなみに、前者の方法は OOPを無視した仕様なのでお勧めしません。
後者の方法を使うべきでしょう。


りな  2004-11-04 20:19:32  No: 86313

返答ありがとうございます。
後者のやり方というのは
画面AでPublicの
dim f = New GAMEN_Aというインスタンス変数を宣言しておくということでしょうか?
やってみたのですがうまくいかないので、理解していないのだと思います><
「インスタンス変数を公開しておき、プロパティを通して渡す」
というのはどのようにするのでしょうか??><


medaka  2004-11-05 04:30:40  No: 86314

> Dim f As GAMEN_A
> f = New GAMEN_A
> f.txtMaker.Text = txtMakerName.Text

2行目削ってそのままいけると思いますが・・・


java.lang.Nullpo  2004-11-05 05:35:51  No: 86315

> 2行目削ってそのままいけると思いますが・・・

オブジェクト指向言語では、インスタンス化できる Form クラスそのものを扱うことは概念的にNG。
VB6以前もそういう扱いをするPGのせいで、VBは未熟言語扱いを受けている。
(VB6でクラスを意識して組むと、VB.NETのアプグレも非常に問題なくできる)
# まあ、VB6はオブジェクト指向言語に分類されていませんから、しょうがないのですが...。

閑話休題。

エントリポイントでインスタンス化したもので、アクセスすればよいかと。

Friend fFormMain As FormMain

' エントリポイント
Friend Sub Main()
    fFormMain = New FormMain()

    Application.Run(fFormMain)
End Sub

このfFormMainに対して、

  fFormMain.txtMaker.Text = txtMakerName.Text

とすれば一応は動く。

ただ、Formをクラスとして考えると、「txtMaker」というコントロールはPrivateとして隠蔽されているべき。
まあ、この辺りはVB.NETの Modfiersの初期値が、「Friend」だからしょうがないのですが。
(C#は両方ともにPrivateが初期値)

だから、
「プロパティを通して渡すべきでしょう」
という発言をしました。

# このあたりの説明は省くとしましょう。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加