■ 現在のこのページの役立ち度:
表示されない場合こちらのリンクからもご覧になれます。
|
■ このページの役立ち度を評価する:
役立ち度を評価してください。
(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
#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
naka-kun2000-03-23(木) 09:59
フォームの作成と解放の方法について 自分なりにまとめてみました。 なにか間違っているところがあれば、指摘していただけたら幸いです。 前提条件 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オブジェクト変数を使うより 自分で宣言したオブジェクト変数を使用して明示的に作成を指定する方法が良いのではないでしょうか? 僕はいつも明示的に作成を指定できる方法でやっています。 みなさんはどうですか?
かるま2000-03-23(木) 10:49
> VBが暗黙的に「Public frmMain As New frmMain」と宣言しているからだ。 > 「VisualBasic5.0 スーパーテクニック改定新版」という本の中で記述されていました。 > > しかし、他の文献・情報源でこのような記述を見た事は無いのでイマイチ確信を持てないのが > 正直な気持ちです。 少なくともヘルプ(BooksOnline(VB5))には書いてあったと思いますよ。
魔界の仮面弁士2000-03-23(木) 11:23
> 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するのは、複数のインスタンスを必要とする場合だけですね。
VIM2000-03-23(木) 11:27
> フォームに関しても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さえしていれば 暗黙のインスタンスを解放していると思うんですけどねぇ〜(謎)。
匿名183832000-03-23(木) 12:32
> # はて、Terminate処理はどこで起動させるんだ?(爆) # (Query)Unloadイベントかな…。 あるいは、フォームをWithEventsしたクラスを作り、 そこでUnloadイベントを拾って、Terminateさせるとか。 > たぶん暗黙でVB側でNothingしてくれるという動作を信じましょう。(爆) 自己参照などのおかしなコードを書いていない限り、 終了時には、Nothingされる *ハズ* だと思いますけどね…。 心配なら、Endすれば確実にNothingされると思います。 # でも、以降の各種イベントがまるで処理されなくなるので、私は絶対に使いませんが。(^^;)
このページと関連する記事:
#2356-3別のフォームを閉じる方法2001-12-03(月) 15:33#37947-0Nothingは必要でしょうか?2001-01-30(火) 18:35
#10377-0NEW宣言したオブジェクト変数のインスタンス存在チェック1999-11-25(木) 20:29
#11269-1Set,Nothingの使い方について2000-06-02(金) 17:01
#43401-0MDIフォームと通常のフォームの関連について2001-05-25(金) 16:03
#30162-0フォームアンロードの変数の値保持について2000-09-18(月) 19:28
#482-0増やしたForm1999-07-30(金) 13:02
#73-1Addformで作成したフォームにアクセスするには?2001-05-24(木) 21:31
#44414-0インスタンスフォームのオブジェクト名について2001-06-25(月) 13:38
#20-4LoadしていないフォームをUnloadしたら・・・?1999-06-17(木) 21:26