[リストへもどる]   [VBレスキュー(花ちゃん)]
一括表示

投稿時間:2005/03/07(Mon) 17:39
投稿者名:tanaka
Eメール:
URL :
タイトル:
プログラムが終了しない。
こんにちは。宜しくお願いします。
プログラムに以下のコードを追加して、実行したところ、unload meで終了しても、
デザイン画面において、アプリケーションが完全に終了しないで、再生されたまま
の状況になってしまいます。

Dim lngReturValue As Long
lngReturValue = SetForegroundWindow(Me.hWnd)

どのようなことが考えられるでしょうか。

投稿時間:2005/03/07(Mon) 17:59
投稿者名:じゃんぬねっと
Eメール:
URL :http://jeanne.wankuma.com/
タイトル:
Re: プログラムが終了しない。
こんにちは、じゃんぬねっと です。

> プログラムに以下のコードを追加して、実行したところ、unload meで終了しても、
> デザイン画面において、アプリケーションが完全に終了しないで、再生されたまま
> の状況になってしまいます。

例えば、Unload() ステートメントで終了した後でも、
Form およびそのメンバを参照すると、再び Load されてしまいます。
そのような点がないか、インラインでデバッグして確認してみてください。

また、それを防ぐ意味でも、フォームは自分でインスタンス化すべきだと私は考えております。
hhttp://jeanne.wankuma.com/tips/rule/02-vb6oop.html

> Dim lngReturValue As Long
> lngReturValue = SetForegroundWindow(Me.hWnd)

[↑] これは? 何か関連がありますか?

投稿時間:2005/03/07(Mon) 18:01
投稿者名:ガッ
Eメール:
URL :
タイトル:
Re: プログラムが終了しない。
> こんにちは。宜しくお願いします。
> プログラムに以下のコードを追加して、実行したところ、unload meで終了しても、
> デザイン画面において、アプリケーションが完全に終了しないで、再生されたまま
> の状況になってしまいます。
>
> Dim lngReturValue As Long
> lngReturValue = SetForegroundWindow(Me.hWnd)
>
> どのようなことが考えられるでしょうか。
いろいろ考えられる。
そりゃもー、いろいろと。
無限ループに陥っているとか、何かが生きていてFormのプロパティを時々参照していて、内部で勝手に

ードされているとか。
なので、こういうときは、ひとつテスト用にプログラムを作成して、
SetForegroundWindow()を入れたときと、入れないときを挙動をテストしてみるのが一番。
変化したのなら、SetForegroundWindow()が怪しいし、変化しないのなら他の部分が怪しい。
…ところで、SetForegroundWindow()ってWinAPI?(ぇ
宣言も何もなしにいきなり書かれてもわからn(ry

投稿時間:2005/03/07(Mon) 18:02
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re: プログラムが終了しない。
アンロード状態で、フォームのプロパティ(たとえばhWndプロパティ)に
アクセスしている部分があるのでは無いでしょうか?


> 再生されたままの状況になってしまいます。
その状態で「一時停止ボタン」を押してから、イミディエイトに下記の一行を
貼り付けて、Enterで実行してみてください。もしも 1以上の数が現れたら、
ロード中のフォームが残っている事になります。

?"表示フォーム数="DoEvents,"ロードフォーム数="Forms.Count


もし、フォームが残っているようであれば、下記の手順で調査してみてください。

まず、それぞれのフォームの「Private Sub Form_Load()」の行に
ブレークポイントを張っておきます。この状態で実行すると、フォームが
ロードされるたびに止まりますよね。

そうしたら、ブレークポイントで中断されたときに、[Ctrl]+[L] キーを
押してみて、どの処理によってフォームがロードされているのか、
呼び出し履歴で確認してみましょう。
ロードするつもりの無い部分から、ロード処理が呼ばれていたりはしませんか?


もしも、ロード処理には問題が無いようであれば、今度はアンロード
し忘れているフォームが無いかを探してみてください。たとえば、
Hideメソッド、または Visible = False にて消したままのフォームが
残っていたりはしませんか?

こちらの場合は、Initialize/Load/Unload/Terminateイベントが、
どのタイミングで発生しているかを追跡していけば、原因を
突き止められるかと思います。

投稿時間:2005/03/07(Mon) 19:36
投稿者名:だい
Eメール:dee_bassist@hotmail.com
URL :
タイトル:
Re: プログラムが終了しない。

> プログラムに以下のコードを追加して、実行したところ、unload meで終了しても、
> デザイン画面において、アプリケーションが完全に終了しないで、再生されたまま
> の状況になってしまいます。

こちらをお薦めしておきます。確認してみてください。
hhttp://www.gj.il24.net/~nakasima/vb/tech/end/index.htm

投稿時間:2005/03/07(Mon) 23:51
投稿者名:tanaka
Eメール:
URL :
タイトル:
Re^2: プログラムが終了しない。
皆様ご回答有難う御座います。
イミディエイトウィンドウで?"表示フォーム数="DoEvents,"ロードフォーム数="Forms.Count
こんな使い方があるとは知りませんでした。試したところ、表示フォーム数0ロードフォーム数1
でした。修正に入る前に再び試してみたのですが、これが毎回残ると言うわけではないみたいで、
すんなりアンロードされる事も結構ありました。コードが少し複雑で、タイマーイベントを
併用して、フォームのハンドルを扱う処理を2、3回くらい使いまわしをする処理もあります。
コードを綺麗に整理したら、正常になるなんてことも少し期待しています。皆様の助言で
今の自分ではついていけない所もあるのですが、これから内容を勉強しながら
作業に取り掛かりたいと思います。また経過をご報告させて頂きたいと思います。

投稿時間:2005/03/08(Tue) 09:27
投稿者名:tanaka
Eメール:
URL :
タイトル:
予期せぬ原因(解決)
こんにちは。結果からいうと解決いたしました。原因は予期せぬ所にありました。
確かに?"表示フォーム数="DoEvents,"ロードフォーム数="Forms.Countで確かめると
フォームが1つ残っているのですが、プログラムの開始に当たってメインのフォームを
1つだけしか起動していないので、unload meで終了させているので、残っているはずも
無く、深く考えなかったのですが、(別のフォームをロードしている覚えもも無かった
ので)所が予期せぬところで、別のフォームが勝手にロードされていたみたいです。
つまりコードの中で、別フォームのテキストボックスのプロパティーを参照していたの
ですが、formsub.text1.textと言う感じで、これで勝手にそのフォームがロードされて
いたみたいです。プロシージャの最後に、unload formsubと加えたところ解決しました。
SetForegroundWindowは関係なかったみたいです。