Visual Basic 中学校 掲示板 投稿の管理
タグのない投稿を抽出
統計
RSS
Visual Basic 中学校
投稿一覧
System.AccessViolationException
この投稿へのリンク
https://keijiban.umayadia.com/ThreadDetail.aspx?ThreadId=30682#CommentId84896
この投稿の削除
削除パスワード
削除する
コメント本文
投稿者
魔界の仮面弁士
 (社会人)
投稿日時
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パターン」にて実装するべきかと思います。