投稿者 魔界の仮面弁士  (社会人) 投稿日時 2021/12/18 15:45:53
> 自作クラスを通った後にエラーになってるようです。
プロジェクトのプロパティの [アプリケーション] タブから
右下の[アプリケーション イベントの表示]を使い、
MyApplication の UnhandledException イベントにて、
e.Exception.StackTrace を記録してみたら、何か分かりませんか?


> Public Function FindControl(ByVal hParent As Control, ByVal stName As String) As Control
上記の再帰探索は、
 Return hParent.Controls.Find(stName, searchAllChildren:=True).FirstOrDefault()
の一行だけで済むかも。

> Public Property Form_Name As New Form

クラス内で生成されるフォームなのであれば、それを保持するプロパティは
Public ReadOnly Property にするべきなのでは…?

Writable にしておくということは、外部から Nothing を代入されたりすることも
許容することになるわけですが、それを考慮したコードには見えませんでした。
(Protected ならまだ分かりますが)

> Form_Name をClose() しないといけませんか??
表示していないなら Close() する必要は無いでしょう。
表示している、あるいは Hide() 状態であるなら、どこから処分すべきですが。

そもそも、この Form の処分処理は、どこに記載されているのでしょうか?
Form や Control は IDisposable なので、使用後には Dispose が必要です。

※ちなみに DataSet や DataTable も IDisposable ですが、それらは Dispose 不要です。

・モードレス表示の Form の場合は、フォームが閉じられたときに自動的に処分されます。
・モーダル表示の Form の場合は、開発者が自分で Dispose せねばなりません。(Using 推奨)
・フォーム上に貼られたコントロールは、親フォームの破棄時に、一緒に処分されます。
・Controls コレクションに加えられていないコントロールは、明示的な Dispose 処理が必要です。(Controls.Remove した時などに忘れがち)
・Timer などのコンポーネントも、Me.components に参加させていないならば、使用後に Dispose が必要です。

もちろん Application.OpenForms には加わりますので、アプリ終了時には解放されますが、
シャットダウンモード:「最後のフォームが閉じるとき」の設定にしてある場合、
非表示状態のフォームが残っていると、アプリを閉じたつもりでも、タスクマネージャー上に
プロセスが残り続けてしまう結果となります。

クラスの外部から Form 参照を得るのであれば、ComboBox_Set 側で
Form の破棄責任をとる必要はありませんが、ComboBox_Set 内で New しておき、
それをフィールド変数として保持するのであれば、ComboBox_Set クラスを
Component 継承クラスにするなどして、「Disposeパターン」にて実装するべきかと思います。