質問: listbox1.selectitem end sub ``` **結果** > > error BC30469: 非共有メンバーを参照するには、オブジェクト参照が必要です。 > > > 広域変数を用意した別モジュールを作成して、その中でform2を呼び出してデータを受け渡す方法を考えていますが、form2だけで完結する記述方法はありませんか?
回答: まず前提知識としてVB.NETでWindows Formsアプリケーションを作成した場合、フォームのデフォルトインスタンスと呼ばれるものが生成されます。これにより`Form`に定義されているインスタンスメンバーに`Shared`の文法でアクセスできます。おそらく質問のコードでは ``` Form2.Show() ``` のような呼び出しがあると思われますが、これは実質的に ``` My.Forms.Form2.Show() ``` という処理です。同様に`Form1`のインスタンスメンバーには`My.Forms.Form1`からアクセスすればよく、`Form1.Label1`のアクセスレベルは既定では`Friend`ですので単純に`Form2`内から ``` My.Forms.Form1.Label.Text = "test" ``` のように記述するのがVB.NETのコンテキストでは一番簡潔になります。 なおVB.NETのアプリケーションフレームワークに依存しないコードの場合は * `Form2`に目的の値(コントロール自体ではなく)を公開するプロパティを定義する * `Form2`をモードレス(`form.Show()`)で表示する場合、上記プロパティの変更イベントを定義する * `Form1`側で`ShowDialog`終了時または上記イベント発生時にプロパティ値を読み出すコードを記述する のがベストだと思います。この方針であれば`Form1`に関する処理を`Form2`に記述する必要がありませんし、`Form2`のコントロールを`Form1`に対して隠ぺいすることもできます。