C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


(過去ログ 169 を表示中)
■97545 / )  Re[1]: 新しいプロジェクトを複数追加してコンボ標示されない
□投稿者/ 魔界の仮面弁士 (3119回)-(2021/06/03(Thu) 20:59:47)
2021/06/03(Thu) 21:00:08 編集(投稿者)

No97544 (エイ さん) に返信
> App2.exeを直接著起動する時はコンボ標示されるんですが・・・。
標示
表示


> Mainプロジェクト(スタートアップ起動時設定)
> Main.vb
> 参照→App2.exe追加
> App2プロジェクト(アプリケーションフォーム)
> Form1.vb
> モジュール1.vb

ソリューション エクスプローラーで見ると、こういう階層ですね。

YourSolution.sln
├App1.vbproj
│└Main.vb
└App2.vbproj
 ├Form1.vb
 └モジュール1.vb


> 疑問1
> dim Fom As new App2.Form1

App2.exe を参照するのは珍しいですね。
App2.dll を参照することはよくありますが。


> Public Sub Test
> Form1.Combobox1.Items.Add("AAA")

たとえば、
 Dim f1 As New App2.Form1()
 Dim f2 As New App2.Form1()
 f1.Show()
 f2.Show()
のようにすれば、Form1 が 2 つ表示されるわけです。

モジュール1 上に書かれた Form1.ComboBox1 というコードは、
上記のように同じフォームが複数表示されていた場合に、一体
どちらのフォームの ComboBox を指していることになるでしょう?

はい、実際はどちらでもありません。

暗黙的な Form1 変数(既定のフォーム インスタンス)と
New App2.Form1() で生成したフォームは別物です。
https://docs.microsoft.com/ja-jp/dotnet/visual-basic/language-reference/objects/my-forms-object


ですので、Form1.ComboBox1 でのアクセスは使わないようにしましょう。

暗黙的なフォームインスタンスではなく、常に
明示的なフォームインスタンスを使うようにします。
(たとえば Form1 型の変数を用意しておき、それを通じてアクセスします)


> ・mainからApp2を開くとコンボボックスが表示されません。なぜでしょうか?
開くだけなら Process.Start メソッドで App2.exe を起動する方法が使えます。


> モジュール使わないでForm1のコードに書けば問題ないんですけど。
Public Sub Test(f As Form1)
 f.ComboBox1.Items.Add("XXX")
End Sub
のようにして、呼び出し時に引数で Form1 のインスタンスを渡せば OK。

引数ではなくフィールド変数で管理しても良いですが、その場合は、
そのフォームを生成する役目を App1 / App2 のどちらに担当させるのかを
明確にしておくようにしましょう。
返信 編集キー/


管理者用

- Child Tree -