(VB6,WINXP)
ふと思ったのですが
「Unload」ステートメントは、なぜメソッドとして実装されていないのでしょうか?
フォームをアンロードさせるとき、「Unload Form1」と書きますが、なぜ、「Form1.Unload」となるように作られていないのでしょうか?
こっちの方がわかりやすいと思うのですが。
どうかよろしくお願いいたします。
Load, Unload ステートメントは対になっていますが、Formに限らず、コントロールにも使えるものです。
メソッドとして利用するには、そのオブジェクトがメモリ上に展開されている必要がありますが、その展開すなわちオブジェクトをロードするための命令がLoad ステートメントですから、メソッドとして作る、というのはおかしい話です。
Load object
に対し
Unload object
があり、
Object.Open
に対し
Object.Close
がある、という風に考えていいかと思います。
ありがとうございます。
> メソッドとして利用するには、そのオブジェクトがメモリ上に展開されている必要があります
なるほど、考えてみるとそうですね。
まだ存在していないオブジェクトに対してメソッドも何も無いですね。
とてもよく理解できました。
どうもありがとうございました。
>「Unload」ステートメントは、なぜメソッドとして実装されていないのか?
>
真相はMSの開発者じゃないと分からない。
展開=オブジェクトのロードとなっているがそれは違うと思う。
実際にNewすればメソッドも呼べるようになる。
メソッド内でコントロールにアクセスするようなことを行えばその時点で勝
手にロードされてしまう。
'Form1側
Option Explicit
Private Sub Command1_Click()
Dim x As Form2
Set x = New Form2
x.Test
Set x = Nothing
End Sub
'---------------------------------------------------------
'Form2側
Option Explicit
Private Sub Form_Load()
Debug.Print "Form2_Load"
End Sub
Public Sub Test()
Dim frm As Form
For Each frm In Forms
Debug.Print frm.Name
Next
End Sub
> 展開=オブジェクトのロード
>
「オブジェクトのロード」に関しては意味が広くなりすぎるが適当に脳内
変換して読んでください。
一つ補足しておくと「メソッド内でコントロールにアクセスするようなこ
とを行えばその時点で勝手にロードされてしまう。」と書いたがこれはフォ
ームにも適用されている。
Form1 内で「Debug.Print Form2.Top」みたいにされた場合、勝手にロード
される。(MS側で用意されているプロパティ、メソッドは全てロード対象に
なるみたい。)
上記のことを踏まえて仮にForm.Loadみたいな書き方をされた場合、Load内
に何も実装しないでも勝手にロードされてしまうから敢えてそのようなメソ
ッドは用意されていないんじゃないかというのが推論。
Unload 側については「自分で自分を消すというのができないのか」、「そも
そも発想がおかしいので実装していないのか」はわかりません。
なるほど、そういう考え方もあるのですね。
いろいろと勉強になりました。
どうもありがとうございました。
ツイート | ![]() |