現在あるツールを作成中なのですが、その中で、
ファイルを新しく作成する時に、いったん子フォームを出して、
ファイルを選択した後、子フォームをアンロードする前に、
グローバル変数に値を入れて、実際のファイル作成処理は親フォーム内に
戻ってきてから行い、ファイルが作成されたら、親フォームの各オブジェクト
(テキストボックスなど)のEnableをTrueにする。
という処理をしたいのですが、どうもうまくいきません。
子フォームはもちろんモーダルで開いているのですが、
いざ実行すると、子フォームが画面から消えるのが一連の処理(親フォームの中の
子フォームをモーダルでShowしている処理の下に書いてある続きも含む)が
全て終わってから画面から消え、ファイルは新しく作成されているのに、
親フォームの各オブジェクトのEnableはFalseのままで何も出来ない、
という状況になってしまっています。
F8キーを押して(押しっぱなしでもよい)1行ずつ動かすときちんと動くのに、
F5キーで一気に実行するか、EXEにして実行すると、上記のような現象が
起こります。タイミングの問題なのかとも思いますが、
自分ではもう原因がわかりません。考えられる原因だけでもいいので、
どなたかご教授願えませんでしょうか。よろしくお願いいたします。
F8キーを押してステップ実行すると、どんなに押しっぱなしにしていても、
1ミリ秒以上の隙が生まれます。
つまり、一瞬でも隙ができていれば、大丈夫ということですよね?
一瞬ウェイト(待ち)をおくかすれば大丈夫ですよね?
子フォームが隠れるための処理より先に、メインフォームが動作してしまうということで、
たまっていた処理をすべて解消するまで待つように、DoEventsだけでも大丈夫かも。
出来ました!!ありがとうございました。
子フォームを呼んでいる frmChild.Show vbModal, Me のすぐ下に
DoEventsを一行追加しただけできちんと動いてくれました。
試しにDoEventsをコメントアウトしたところ、
やはり最初の現象が起こりました。
ということは、やはり子フォームが隠れるための処理より先に
メインフォームの処理が起こってしまうことが原因で
起こってしまうエラーという解釈でいいのでしょうか。
今までも同様のやり方は行ってきてたので、大丈夫だと思っていましたが。
今回のプログラムは今まで作ってきたのとは違い、
モーダルでShowして戻ってきた後、関数から抜ける
(ユーザが操作できるようになる)までの処理が
今までとは比べ物にならないほど長く、それも一因になってるかとも思うのですが。
一瞬ウェイトをおくというのは私も試してみたのですが、
その時はAPIのSleepを使っていたので、駄目だったんでしょうね。
Sleepだと子フォームが隠れるための処理すらもストップしてしまうのでしょうか。
APIはまだ使い慣れてないので、わからないことが多いです。
Sleepは、使用中、そのプロセス(この場合、ソフト自身のこと)の動作をいったん停止してしまいます。
なので、今回の場合、使えなかったんです。
自分のソフトの実行も含め、待ちをしたいのならば、
GetTickCountで開始時のミリ秒を取得、
その数字から指定したミリ秒が立つまで、DoEventsを繰り返すというメソッドを作ってしまうといいです。
ちなみに、Windowsはマルチタスクということになってますけど、
実際は人にはわからないほど早く、タスクを動かして回っているそうです。
Sleep(0)をすると、実行を待っているタスクがあれば、それを実行してから処理を返します。
必要になる機会はそうないでしょうけど、覚えておいてください。
Sleep(0)ですか、そんなやり方もあるのですね。
今度テストプログラムを作って試してみたいと思います。
本当にどうもありがとうございました。
ツイート | ![]() |