VB6.0用掲示板の過去のログ(No.2)−VBレスキュー(花ちゃん)
[記事リスト] [新規投稿] [新着記事] [ワード検索] [管理用]

投稿日: 2006/10/03(Tue) 04:17
投稿者魔界の仮面弁士
Eメール
URL
タイトルRe^3: 画面呼び出しで実行時エラー「438」が発生

現時点では、Unload や Hide ばかりに目が行っているようですが、それと同様に、
いつフォームがロードされるのか、という点も重要だったりします。

まずは先に回答した、ヘルプの『Visual Basic フォームの有効期間』をよく確認してください。

[Visual Basic ドキュメント]
└[Visual Basic の使用方法]
 └[プログラミング ガイド]
  └[Visual Basic を使ってできること]
   └[オブジェクト]
    └[独自のクラスの作成]
     └[Visual Basic フォームの有効期間]★

その中でも特に重要なのが、このトピック中にある
 「Visual Basic のフォームは、その有効期間中、通常 4 つの状態を通過します。」
と書かれている部分です。この部分を良く読んでおいてください。


> 「Hide」の使い方、使う位置は、間違ってないでしょうか。

フォームの管理という視点からいえば、何らかの間違いを含んでいそうです。

たとえば現在のコードを見る限りでは、
 1. Form1 の Command1 ボタンを押す。
  → Form2 が表示され、Form1 は非表示状態になる。
 2. その後、Form2 右上の ×ボタンを押す。
  → Form2 が閉じ、非表示の Form1 だけがメモリ上に取り残される。
 3. これにより、アプリが終了せずに残ってしまう…。
という問題を抱え込んでいます。

この問題に関して、下記を参照しておいてください。
http://www.gj.il24.net/~nakasima/vb/tech/end/index.htm


> 最小限のコードです。

この中から、Form1 の Command1_Click を例に挙げて見てみましょう。

>     Result = Form2.PANEL_INIT
>     If Result <> 0 Then
>         Unload Form2
>         Exit Sub
>     End If
>     Form2.Show

このコードは、フォームの管理という点において、若干の問題を含んでいます。

まずはここで、Form2.PANEL_INIT にアクセスしていますが、
この実行直後の時点で、Form2 のオブジェクトの状態が
 [1] 作成されているが、ロードされていない。
 [2] ロードされているが、表示されていない。
 [3] 表示されている。
 [4] メモリ上に作成されていない。(解放状態)
の 4 種いずれの状態にあるかを考えてみる事にします。


まず、呼び出し側には、Form2 に対する「Load ステートメント」は記述されていません。
ですから、初回の呼び出し直前には、おそらく [4] の解放状態だったと想定されます。

そして、この解放状態のまま PANEL_INIT メソッドにアクセスしています。
この時、ヘルプで言うところの「隠されたグローバル変数」にあたる Form2 変数を
利用してアクセスしていますので、Form2 の実体(インスタンス)の生成は、
VB6 によって自動的に行われます。
つまり、この時点で、Form2 オブジェクトは [1] の生成済み状態に遷移した事になります。

しかしこの時点では、まだ Form2 が"生成"されたというだけである点に注意してください。
(Form2 はまだロードされていないので、[2] の状態にはなっていません)


次に、呼び出された Function PANEL_INIT() の方のコードに目を向けてみます。
そこには、「Load Me」といったコードは書かれていません。
しかも、自身のコントロール等にアクセスしている事も無く、そのまま 戻り値 0 を
返して終了しているだけです。ゆえに、このメソッド中での状態変化は発生しておらず、
この PANEL_INIT 実行後も、[1] の状態を維持しているという事になります。


すなわち、Form1 側の「Result = Form2.PANEL_INIT」の実行後も、Form2 オブジェクトは
[1] の状態(生成されたが、まだロードはされていない状態)にあるという事を意味します。


……にも関わらず、呼び出し側では、その後のコードで、「Unload Form2」という処理が
加えられています。

ロードされていないフォームを Unload しようとしたからといって、エラーになるわけでは
ありませんが、このコードを見る限りでは、『Visual Basic フォームの有効期間』が
あまり意識されていないかのように思えます。となると、その他の Hide などの操作も、
フォームの状態を意識せずに記述されている可能性があるのではないでしょうか。


- 関連一覧ツリー (★ をクリックするとツリー全体を一括表示します)

- 返信フォーム (この記事に返信する場合は下記フォームから投稿して下さい)

- VBレスキュー(花ちゃん) - - Web Forum -