投稿者 魔界の仮面弁士  (社会人) 投稿日時 2023/1/21 09:27:09
> 2~3週間ぐらい後になってしまうかもしれませんが
了解です!
レビューを読んでいただけると分かったので、安心して指摘できます。(^^;


=====
(5) 他フォームの表示方法について
-----
フォームを表示する際には、
  Show メソッドによる、モードレスな呼び出し
  ShowDialog メソッドによる、モーダルでの呼び出し
がありますが、今回はすべて ShowDialog の方を使っておられるようですね。

で、その ShowDialog の呼び出し方がちょっと間違っています。

tempMainMenu フォームを例に挙げてみると、
Dim f = New FormWordMaster(Me.LanguageSelecter1.Value)
f.ShowDialog()
のように書かれていましたが、これらは正しくは
Using f As New FormWordMaster(Me.LanguageSelecter1.Value)
    f.ShowDialog(Me)
End Using
もしくは
Dim f As New FormWordMaster(Me.LanguageSelecter1.Value)
f.ShowDialog(Me)
f.Disoise()
のように、「Using ブロック」もしくは「Dispose() メソッド」を併用せねばならないのです。
※この点は、初級講座「第29回 2つ目のフォーム」でも触れられていません。

自作のダイアログのみならず、.NET Framework 標準の各種ダイアログについても同様です。
'下記の ColorDialog クラスは、標準で用意されている色選択ダイアログです 
Using dialog As New ColorDialog()
    dialog.FullOpen = True

    'ShowDialog は、戻り値で OK/Cancel などを返すことができます 
    If dialog.ShowDialog() = DialogResult.OK Then

        '閉じられた後でも、ダイアログのインスタンスはメモリ上に非表示で残り続けるので 
        'ダイアログが閉じられた後であったとしても、ユーザー選択した情報を 
        '後からプロパティで取り出すことができます 
        TextBox1.BackColor = dialog.Color

    End If

End Using  'ShowDialog 後もメモリ上に残っているので、明示的に破棄せねばなりません! 


ただし、このダイアログをまた後で再利用する場合(New しなおさない)には、
Using や Dispose での処分は不要です。
たとえば、上記の ColorDialog をフォームに貼って使う場合には、
 If Me.ColorDialog1.ShowDialog() = DialogResult.OK Then
  TextBox1.BackColor = Me.ColorDialog1.Color
 End If
と書くだけで済みます。この場合、ShowDialog は何度でも呼び出せます。


ShowDialog メソッドについて、公式ドキュメントで確認してみると、
フォームを表示し終わった後で「testDialog.Dispose()」と書いていますよね。
(言語モードが VB になっていない場合は、ページ右上に言語切替のドロップダウンリンクで切り替えます)
https://learn.microsoft.com/ja-jp/dotnet/api/system.windows.forms.form.showdialog?view=netframework-3.5

上記には、以下の記述があります…が、機械翻訳がちょっとわかりにくいので、
単純引用ではなく、私なりに少し意訳しなおして記述してみます。

>>
>> フォームがモーダル ダイアログ ボックスとして表示された場合、
>> ユーザーが [ 閉じる ] ボタン (フォームの右上隅にある X ボタン) をクリックすると、
>> そのフォームは非表示となり、DialogResult プロパティには DialogResult.Cancel が返されます。
>> 
>> 非モーダル フォームとして呼び出された場合とは異なり、ユーザーがダイアログ ボックスの
>> 閉じるボタンをクリックしたり、DialogResult プロパティに値を設定したりしたとしても、
>> この時に .NET Frameworkによって Close メソッドが呼び出されることはありません。
>> 
>> その代わりに、フォームは単に非表示となります。そのため、ダイアログ フォームを
>> 再度表示しなおす際にも、新しいインスタンスを作成しなおす必要はありません。
>> ダイアログ ボックスとして表示されるフォームは閉じるのではなく非表示になるため、
>> あなたのアプリケーションでそのフォームが不要になった場合は、
>> 必ず Dispose メソッドを呼び出さねばなりません。(you must call the Dispose method)
>>

15年前は機械翻訳ではなく、ちゃんとした人力翻訳だったのですけれどね…。
一応、VS2008 当時の人力翻訳版も、ダウンロード版として存在してはいるのですが。
https://www.microsoft.com/ja-jp/download/details.aspx?id=20955


ちなみに、ColorDialog/FolderBrowserDialog/FontDialog/OpenFileDialog/SaveFileDialog といった
.NET Framework 標準のダイアログ コンポーネントについては、フォーム デザイナ上で
画面に貼って使う場合、それらのコンポーネントは、そのフォームが破棄される際に、
一緒に自動破棄される設計になっています。