Vb6.0を使用しています。
フォームを閉じる際に
Unload Me
Set Form1 = Nothing
としているのですが、
Unload時に動くForm_Unloadイベント内に
Set Form1 = Nohting
記述しても正常に動作しているように思えます。
ただ、ネット上ではこのような処理は見かけません。
イベント内に記述してもTerminateイベントが動いているので
問題ないのではないかと考えているのですが
実際のところ何か不具合がないかご存知の方が居られましたら
お教えいただけますでしょうか。
宜しくお願い致します。
たとえば、Form1 から Form2 をモードレスで表示するには、
以下の 2 つの方法があります。
(Form2 を、フォームの×ボタンで閉じる場合)
(1)暗黙のフォーム変数を使う方法
Load Form2
Form2.Show vbModeless, Me
(2)明示的なフォーム変数を使う方法
Set F = New Form2 'Set F = Forms.Add("Form2")
Load F
F.Show vbModeless, Me
'---------
Set Form2 = Nothing が意味を持つのは、前者に対してだけです。
後者の場合は、Set F = Nothing を書くことはありますが、
この場合には Set Form2 = Nothing を行うべきではありません。
また、(2)の 変数 F が、Form1 のモジュールレベル変数として
Private F As Form2 などと宣言されている場合には Nothing を
代入するべきですが、たとえば Command1_Click の中などで
宣言されたローカル変数であれば、Nothing 代入は不要です。
——以上の点について、認識に相違はありますか?
魔界の仮面弁士様
お返事ありがとうございます。
使用方法は前者の方法で、引数は省略しているので
モーダルで表示させています。
後者の方法は使用した事はありませんが
オブジェクトを変数として定義した場合は仰られたような処理で
開放していますので、相違は無いかと思います。
>> ただ、ネット上ではこのような処理は見かけません。
Unload イベント内での Nothing 代入ですよね?
流石に 15 年も前の言語なので、かなりのコンテンツが失われていますが、
google 等で探したところ、そういったコード例も幾つか見つかりましたよ。
http://www.drive.co.jp/asp/faq/faq_sanka.asp?q_id=12088&genre=VisualBasic
http://microsoft.public.vb.general.discussion.narkive.com/P7K98gdm/how-can-a-modeless-form-totally-destroy-itself
http://www.gizcollabo.jp/vbtomo/log/archive/vbqanda_29986_0.html
一応、それ自体は VB6 登場よりも、さらに以前でも使われていた手法の一つであり
かつてはnewsgroupや mailing list、あるいは専門誌などのサンプルでも
使われていたことがあります。
この他、暗黙ロードされたフォームが残っていないか調べるために
「DoEvents 関数の戻り値」と Forms コレクションの Count を比較するとか、
自身以外のフォームをすべて解放するために、Forms コレクションをループ処理で
順次解放するような処理とかもありましたね。(本題からは外れますが)
> 使用方法は前者の方法で、引数は省略しているので
> モーダルで表示させています。
引数を省略しているのなら、モードレスになるはずでは…?
結局、モーダルなのでしょうか。それともモードレスなのでしょうか。
とりあえず、VB6ヘルプの「Visual Basic フォームの有効期間」の項と
その関連ページを再読しておきましょう。VB の Form オブジェクトにおける
生成・ロード・表示・非表示・アンロード・破棄について記されています。
> イベント内に記述してもTerminateイベントが動いているので
> 問題ないのではないかと考えているのですが
動作上の問題はありません。どちらかというと管理上の問題でしょうね。
たとえばコモンダイアログの場合、
CommonDialog1.ShowOpen
Text1.Text = CommonDialog1.FileName
のようなコードを書きますよね。
コモンダイアログは、モーダルダイアログの一種です。
これと似たようなものを、Form を使って自作して、
Load Form2
Form2.Show vbModal
Text1.Text = Form2.OriginalPropertyName
と書くようなこともあるでしょう。このような使い方をする場合、
Unload 時に、勝手に「Set Form2 = Nothing」されては困るわけです。
モードレスの場合は、どのタイミングで閉じられるのかが曖昧なので、
コードを簡素化するため、自フォーム自身で破棄することも珍しくありません。
ただし、アンロードしたフォームを再ロードすること(表示/非表示ではなく)が
必要なアプリケーションでは、やはり Unload イベント内での
自己解放が邪魔になるケースもあります。
もちろん、そういった問題が無いのであれば、Unload イベント時に
Nothing で解放してしまっても大丈夫でしょう。
魔界の仮面弁士様
お返事が遅くなり申し訳ありません。
詳細なお答えを頂き言葉もございません。
勘違いして覚えてしまっていることもありお恥ずかしい限りです。
再度ヘルプを熟読し、理解を深めようと思います。
本当にありがとうございました。