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

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

# No.7410 のサンプル、Form3 のコードが壊れているようなので、
# 投稿内容を [修正] しておいてください。>こうさん

> Xボタンを押せないようにしてしまえばすむということになりますが、
> それでは、本解決にも、自分が理解したかになりません。

フォーム管理において重要な事は、
  各フォームが、どのタイミングで生成され、ロードされ、表示され、アンロードされるのか
を把握することにあります。

たとえば今回のように、Hideメソッド(あるいはVisibleプロパティ)によってフォームを
非表示にしたのであれば、当然、それをどこかで再表示する or アンロードする必要が
あるはずですよね。その処理はどこで行うべきか、画面仕様に準えて考えてみてください。



> また、最初に質問した件で、Form2からForm1に戻ったとき、Form1の
> Form_Loadを呼ばれないようにするには、今までことを理解すれば
> 可能でしょうか。

もちろん可能です。
そしてそのためには、各フォームがどこでロードされるべきかを考える必要があるでしょう(A)し、
また、なぜ Form1 が再ロードされてしまうのかを把握すること(B)も必要になってきます。

-----
まずは前者。
各フォームがどこでロードされるべきか(A)を考慮する、すなわち、ヘルプでいうところの
「フォームの有効期間」を考察するために、先に提示されたNo.7410のコードをみてみましょう。

<Form1>
 * Form1 は、スタートアップフォームである(?)
 * Form1 は、Form2 の Command1 によっても Show される。
 * Form1 は、Form1 自身の Command1 にて、自身をUnload(あるいは Hide)する。
<Form2>
 * Form2 は、Form1 の Command1 によって Show される。
 * Form2 は、Form1 の Command1 によって Unload される可能性がある。
 * Form2 は、Form2 自身の Command1 によって 自身を Unload する。
<Form3>
 * Form3 は、Form1 の Command1 によって Show され、Form1 の子フォームとなる。
 * Form3 は、Form3 自身の Command1 によって 自身を Unload する。


これをみると、Form3 と Form1 は親子関係にあるので、Form3 の有効期間はわかりやすいのですが、
Form1 と Form2 は、互いが互いを Show / Unload しあっていて、聊か奇妙な関係に見えます。

アプリが終了するためには、すべてのフォームがアンロードされなければならないわけですが、
現在のコードでは、Form1 と Form2 の両方がアンロードされる条件というのが存在しないからです。

実際、Form1 が Unload される際には、代わりに Form2 が 表示されてしまいますし、
> Private Sub Command1_Click()
>  (中略)
>   Form2.Show
>   Form2.Data_Delivery "1", "2", "3"
>   'Unload Me
>   Hide
> End Sub
逆に、Form2 が Unload される際には、代わりに Form1 が 表示される仕様になっています。
> Private Sub Command1_Click()
>    Form1.Show
>    Unload Me
> End Sub

これでは、いつまで経ってもアプリケーションは終了できません。
まして、Unload を Hide に変えたともなれば、それは問題を悪化させるだけであると言えます。
まずは、この曖昧な画面関係を見直すようにしてみてください。

-----
次に後者です。

問題となっている、Form1 が再ロードされてしまう原因を把握する方法(B)についてですが
これにはまず、正規のロード処理のタイミングを整理しておかなければいけません。

すなわち、それには上記の前者(A)の設計が重要になってくるという事を意味します。

そして、画面関係の設計が見直された段階で、フォームがロードされるべき部分のコードに対して、
「Load ステートメント」を明示的に呼び出すように、コードを修正してみてください。
さらにその上で、それぞれの Load イベントにブレークポイントを貼っておき、フォームが
ロードされるたびに、先述の「呼び出し履歴」機能を用いるようにします。

そうすれば、Load ステートメント以外の理由によって自動ロードされていた場合、それが
予期せぬリロード処理である、という意味になります。

もちろん、予期せぬリロードというのは、『コーディングミス』をあらわしますので、
それらのコードを見直して、その原因を取り除いてやれば、問題も解決するでしょう。


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

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

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