■ 現在のこのページの役立ち度:
表示されない場合こちらのリンクからもご覧になれます。
■ このページの役立ち度を評価する:
役立ち度を評価してください。
(1(左):あまり役立たない - 5(右):大変役立った):
■ ページの共有:
[ サイト内検索 ]
カスタム検索
#18372-0フォームの作成と解放naka-kun2000-03-23(木) 09:59
     #18373-0RE#18372:フォームの作成と解放かるま2000-03-23(木) 10:49
     #18377-0RE#18372:フォームの作成と解放魔界の仮面弁士2000-03-23(木) 11:23
     #18378-0RE#18372:フォームの作成と解放VIM2000-03-23(木) 11:27
     #18383-0RE#18378:フォームの作成と解放匿名183832000-03-23(木) 12:32
#18372-0
フォームの作成と解放
フォームの作成と解放の方法について
自分なりにまとめてみました。
なにか間違っているところがあれば、指摘していただけたら幸いです。

前提条件
frmMainフォームがデザイナで作成されている

通常よくされる方法としてフォームの作成は次のように書きます。

Load frmMain

今まで、対して気にもせずこのようにフォームを作成してきましたが
良く考えるとfrmMainというオブジェクト変数は宣言されていません。
このような事ができるのは
VBが暗黙的に「Public frmMain As New frmMain」と宣言しているからだ。
「VisualBasic5.0 スーパーテクニック改定新版」という本の中で記述されていました。

しかし、他の文献・情報源でこのような記述を見た事は無いのでイマイチ確信を持てないのが
正直な気持ちです。
ですが、自分でコードを書き検証してみた範囲内では上記の本の著者と同意見です。
これについてご存知の方いらっしゃったら教えてください。

Loadステートメントについて

Loadステートメントは、ヴィジュアルな部分をメモリにロードし
Formsコレクションにフォームのインスタンスの参照ポインタを追加します。

Unloadステートメントについて

Unloadステートメントは、ヴィジュアルな部分をメモリから削除し
Formsコレクションからフォームのインスタンスの参照ポインタを削除します。

よって
Load frmMain
としてフォームを作成した場合、このフォームのインスタンスへの参照ポインタが
FormsコレクションとfrmMainオブジェクト変数に格納されるため
Unload frmMainのあとに
Set frmMain = Nothingとしなければ、フォームインスタンスを完全に解放できない。

一般的にクラスの作成方法として
Private clsMain As New class1
のようにNEW付き宣言はあまり良くないとされています。

明示的に作成を指定できる方法がベターとされています。
Private clsMain as class1
Set clsMain = New class1

フォームに関してもVBが暗黙的に宣言しているfrmMainオブジェクト変数を使うより
自分で宣言したオブジェクト変数を使用して明示的に作成を指定する方法が良いのではないでしょうか?
僕はいつも明示的に作成を指定できる方法でやっています。
みなさんはどうですか?
#18373-0
RE#18372:フォームの作成と解放
> VBが暗黙的に「Public frmMain As New frmMain」と宣言しているからだ。
> 「VisualBasic5.0 スーパーテクニック改定新版」という本の中で記述されていました。
> 
> しかし、他の文献・情報源でこのような記述を見た事は無いのでイマイチ確信を持てないのが
> 正直な気持ちです。
少なくともヘルプ(BooksOnline(VB5))には書いてあったと思いますよ。
#18377-0
RE#18372:フォームの作成と解放
> VBが暗黙的に「Public frmMain As New frmMain」と宣言しているからだ。
> 「VisualBasic5.0 スーパーテクニック改定新版」という本の中で記述されていました。
> しかし、他の文献・情報源でこのような記述を見た事は無いのでイマイチ確信を持てないのが
> 正直な気持ちです。
VB5をお使いなのでしょうか?
であれば、Books Onlineの[Form クラスのカスタマイズ]というトピックをお読み下さい。

-------引用開始--------
隠されたグローバル変数

宣言されたオブジェクト変数と同じように、Form1 をコードで
参照することができます。これは、Visual Basic では、
各フォーム クラスに対し、隠されたグローバル オブジェクト変数が
作成されるからです。Visual Basic が次の宣言を暗黙のうちに
プロジェクトに追加したと考えることができます。

Public Form1 As New Form1

スタートアップ オブジェクトとして Form1 を選択すると、または
コードで Form1.Show を入力すると、このグローバル オブジェクト変数を
参照することになります。As New と宣言されているため、あらかじめ
宣言された変数を初めてコードで使用したときに、Form1 クラスの
インスタンスが作成されます。

この宣言が隠されている理由は、フォームの Name プロパティを
変更するたびに、Visual Basic が宣言を変更するからです。
このように、隠されたグローバル変数は常にフォーム クラスと同じ名前を持ちます。

ヒント
   フォームのアンロード後、フォームが使用していたメモリと
   資源を解放するするために、フォームへのすべての参照を必ず
   Nothing に設定する必要があります。隠されたグローバル変数は、
   最もよく見落されがちなので注意してください。
-------引用終了--------


> Loadステートメントについて
> Unloadステートメントについて
これについては、[Visual Basic フォームの有効期間]をお読み下さい。
冗長的になるので、引用はしません。

> 一般的にクラスの作成方法として
> Private clsMain As New class1
> のようにNEW付き宣言はあまり良くないとされています。
この理由も、Books Onlineに(そしてMSDNライブラリにも)載っています。
プログラミング ガイドをじっくり読んでみましょう。


> 自分で宣言したオブジェクト変数を使用して明示的に作成を指定する方法が良いのではないでしょうか?
わかっている人はそれで良いですが、理解しきれていない人は、
オブジェクト変数とは別に、先の“暗黙のグローバル変数”を呼び起こしてしまい、
非表示のフォームが残り続けてしまう可能性があります。
そうすると、画面上にはフォームがないのに(DoEvents = 0)、
ロード済みのフォームがいつまでも残って、(Forms.Count <> 0)
プログラムが完全に終了しない状態になってしまう場合が…。(;_;)
# これで嵌った人を、何人も見ている…特にMDIプロジェクト初心者。(;_;)


> 僕はいつも明示的に作成を指定できる方法でやっています。
私は、単一のオブジェクトとしてしか使わないのであれば、
基本的にフォーム名をそのまま利用しています。(^^;)
明示的にNewするのは、複数のインスタンスを必要とする場合だけですね。
#18378-0
RE#18372:フォームの作成と解放
> フォームに関してもVBが暗黙的に宣言しているfrmMainオブジェクト変数を使うより
> 自分で宣言したオブジェクト変数を使用して明示的に作成を指定する方法が良いのではないでしょうか?
> 僕はいつも明示的に作成を指定できる方法でやっています。
> みなさんはどうですか?

時と場合、それと人それぞれな使い方だと思います。

たとえば、

Sub main()
    Call Initialize
    Form1.Show
End Sub

を、わざわざオブジェクト変数を使って、

Public frm1 As Form1
Sub main()
    Call Initialize
    Set frm1 = New Form1
    frm1.Show
End Sub
Sub Terminate()
    Set frm1 = Nothing
End Sub

これはさすがに面倒なのでは・・・?
# はて、Terminate処理はどこで起動させるんだ?(爆)

同じフォームを複数個使用する場合は、
オブジェクト変数を使うでしょうけど・・・。

> Set frmMain = Nothingとしなければ、フォームインスタンスを完全に解放できない。
たぶんこのあたりが引っかかってると思います。
通常のForm1.Showなんてやって、Nothingしてないのではないかという疑惑(笑)。
たぶん暗黙でVB側でNothingしてくれるという動作を信じましょう。(爆)

From1.Show
でVBが終了しても、Unloadさえしていれば
暗黙のインスタンスを解放していると思うんですけどねぇ〜(謎)。
#18383-0
RE#18378:フォームの作成と解放
> # はて、Terminate処理はどこで起動させるんだ?(爆)
# (Query)Unloadイベントかな…。

あるいは、フォームをWithEventsしたクラスを作り、
そこでUnloadイベントを拾って、Terminateさせるとか。

> たぶん暗黙でVB側でNothingしてくれるという動作を信じましょう。(爆)
自己参照などのおかしなコードを書いていない限り、
終了時には、Nothingされる *ハズ* だと思いますけどね…。

心配なら、Endすれば確実にNothingされると思います。
# でも、以降の各種イベントがまるで処理されなくなるので、私は絶対に使いませんが。(^^;)
お探しの情報は見つかりましたか?お困りの問題は解決しましたか?
サイト内検索, 似た記事検索で見つからなくてもあきらめずに掲示板で質問してみましょう。
VB初心者友の会があなたのお役に立てれば幸いです。また、本ページの投稿者の方々にこの場を借りて感謝致します。
本ページは過去ログを集めて自動構成しています。よろしければこのページに関するフィードバックをお願いします。
(※ 構成の誤り、広告等の不適切な記事、リンク切れ、読めないページの報告など)