別フォームを呼び出した後、そのフォームが完全に消えてから処理を続行するには?

解決


たき  2002-10-05 00:13:48  No: 76185

現在あるツールを作成中なのですが、その中で、
ファイルを新しく作成する時に、いったん子フォームを出して、
ファイルを選択した後、子フォームをアンロードする前に、
グローバル変数に値を入れて、実際のファイル作成処理は親フォーム内に
戻ってきてから行い、ファイルが作成されたら、親フォームの各オブジェクト
(テキストボックスなど)のEnableをTrueにする。
という処理をしたいのですが、どうもうまくいきません。

子フォームはもちろんモーダルで開いているのですが、
いざ実行すると、子フォームが画面から消えるのが一連の処理(親フォームの中の
子フォームをモーダルでShowしている処理の下に書いてある続きも含む)が
全て終わってから画面から消え、ファイルは新しく作成されているのに、
親フォームの各オブジェクトのEnableはFalseのままで何も出来ない、
という状況になってしまっています。

F8キーを押して(押しっぱなしでもよい)1行ずつ動かすときちんと動くのに、
F5キーで一気に実行するか、EXEにして実行すると、上記のような現象が
起こります。タイミングの問題なのかとも思いますが、
自分ではもう原因がわかりません。考えられる原因だけでもいいので、
どなたかご教授願えませんでしょうか。よろしくお願いいたします。


たかみちえ  URL  2002-10-05 00:21:33  No: 76186

F8キーを押してステップ実行すると、どんなに押しっぱなしにしていても、
1ミリ秒以上の隙が生まれます。
つまり、一瞬でも隙ができていれば、大丈夫ということですよね?

  一瞬ウェイト(待ち)をおくかすれば大丈夫ですよね?
子フォームが隠れるための処理より先に、メインフォームが動作してしまうということで、
たまっていた処理をすべて解消するまで待つように、DoEventsだけでも大丈夫かも。


たき  2002-10-05 00:59:42  No: 76187

出来ました!!ありがとうございました。
子フォームを呼んでいる frmChild.Show vbModal, Me のすぐ下に
DoEventsを一行追加しただけできちんと動いてくれました。
試しにDoEventsをコメントアウトしたところ、
やはり最初の現象が起こりました。
ということは、やはり子フォームが隠れるための処理より先に
メインフォームの処理が起こってしまうことが原因で
起こってしまうエラーという解釈でいいのでしょうか。
今までも同様のやり方は行ってきてたので、大丈夫だと思っていましたが。
今回のプログラムは今まで作ってきたのとは違い、
モーダルでShowして戻ってきた後、関数から抜ける
(ユーザが操作できるようになる)までの処理が
今までとは比べ物にならないほど長く、それも一因になってるかとも思うのですが。
 一瞬ウェイトをおくというのは私も試してみたのですが、
その時はAPIのSleepを使っていたので、駄目だったんでしょうね。
Sleepだと子フォームが隠れるための処理すらもストップしてしまうのでしょうか。
APIはまだ使い慣れてないので、わからないことが多いです。


たかみちえ  URL  2002-10-05 02:02:00  No: 76188

Sleepは、使用中、そのプロセス(この場合、ソフト自身のこと)の動作をいったん停止してしまいます。
  なので、今回の場合、使えなかったんです。

  自分のソフトの実行も含め、待ちをしたいのならば、
GetTickCountで開始時のミリ秒を取得、
その数字から指定したミリ秒が立つまで、DoEventsを繰り返すというメソッドを作ってしまうといいです。

  ちなみに、Windowsはマルチタスクということになってますけど、
実際は人にはわからないほど早く、タスクを動かして回っているそうです。
  Sleep(0)をすると、実行を待っているタスクがあれば、それを実行してから処理を返します。
必要になる機会はそうないでしょうけど、覚えておいてください。


たき  2002-10-05 10:21:18  No: 76189

Sleep(0)ですか、そんなやり方もあるのですね。
今度テストプログラムを作って試してみたいと思います。
本当にどうもありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加