Unloadについて

解決


tomo  2013-07-17 16:38:20  No: 103437  IP: 192.*.*.*

Vb6.0を使用しています。

フォームを閉じる際に
Unload Me
Set Form1 = Nothing  
としているのですが、

Unload時に動くForm_Unloadイベント内に
Set Form1 = Nohting  
記述しても正常に動作しているように思えます。
ただ、ネット上ではこのような処理は見かけません。

イベント内に記述してもTerminateイベントが動いているので
問題ないのではないかと考えているのですが
実際のところ何か不具合がないかご存知の方が居られましたら
お教えいただけますでしょうか。

宜しくお願い致します。

編集 削除
魔界の仮面弁士  2013-07-18 13:16:55  No: 103438  IP: 192.*.*.*

たとえば、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 代入は不要です。


——以上の点について、認識に相違はありますか?

編集 削除
tomo  2013-07-20 13:48:03  No: 103439  IP: 192.*.*.*

魔界の仮面弁士様
お返事ありがとうございます。

使用方法は前者の方法で、引数は省略しているので
モーダルで表示させています。

後者の方法は使用した事はありませんが
オブジェクトを変数として定義した場合は仰られたような処理で
開放していますので、相違は無いかと思います。

編集 削除
魔界の仮面弁士  2013-07-21 23:43:14  No: 103440  IP: 192.*.*.*

>> ただ、ネット上ではこのような処理は見かけません。
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 で解放してしまっても大丈夫でしょう。

編集 削除
tomo  2013-08-01 15:23:20  No: 103441  IP: 192.*.*.*

魔界の仮面弁士様
お返事が遅くなり申し訳ありません。

詳細なお答えを頂き言葉もございません。
勘違いして覚えてしまっていることもありお恥ずかしい限りです。

再度ヘルプを熟読し、理解を深めようと思います。

本当にありがとうございました。

編集 削除