フォームを切り替えるには

解決


エスペランサ  2004-11-10 23:12:53  No: 117483

Form1 の表示を消して Form2 を表示したく
  Form1.Visible=False
  Form2.Visible=True
としたのですが Form2 の表示の仕方がきれいてありません。
Form1の表示の残像が残ってしばらくしてForm2の文字が現れてくるとか
Form2の文字が何もない状態で開いてしばらくして文字が表示されてくるとかに
なります。どの設定でForm1とForm2をぱっと切り替えることができますか。


raki  URL  2004-11-10 23:39:38  No: 117484

Form1.Visible=False
DoEvents             ' ← 追加
Form2.Visible=True

で一応Form1が完全に消えてからForm2が表示されるようにはなると思いますが、
Form2の表示がおかしいのはForm2の内部処理に問題があると思います。
Form2のPaintイベントなどで初期化処理を行っていませんか?


エスペランサ  2004-11-11 02:03:39  No: 117485

ありがとうござます。
Form1 の残像は消えました。でもやはり表示の仕方はおかしいです。
Form2 はフォームに1つラベルが貼り付けてあるだけで初期化処理は
ありません。処理が終わるまで「お待ちください」のメッセージ表示です。
何年もみっともない表示で過ごしてきました。なんとかならないもんかと
お聞きしたしだいです。


raki  URL  2004-11-11 02:41:51  No: 117486

Form1.Visible=False ' ←親フォームを非表示
Form2.Visible=True  ' ←『お待ちください』の表示
  処理〜
Form2.Visible=False ' ←『お待ちください』の非表示(消去)
Form1.Visible=True  ' ←親フォームを表示

ということをさせたいのでしょうか?
それでしたら、
それぞれのフォームの Visible を True, False と切り替えている
直後に、先のレスと同じように DoEvents を入れて下さい。

Form1.Visible=False ' ←親フォームを非表示
DoEvents
Form2.Visible=True  ' ←『お待ちください』の表示
DoEvents
  処理〜
Form2.Visible=False ' ←『お待ちください』の非表示(消去)
DoEvents
Form1.Visible=True  ' ←親フォームを表示
DoEvents

といった感じで。
但し、DoEventsを入れるということは、
ユーザが操作を行うとその時点で割り込んでイベントが発生します。
このため、Form2は×ボタン等を効かなくするか、
フォームの形を変えるなりContorolBoxプロパティをFalseにするなりして、
ユーザにフォームを消されないようにして下さい。


raki  URL  2004-11-11 02:49:58  No: 117487

追記:
先のレスにも書きましたが、
DoEvents を入れると、その時点でキューに溜まっていた
メッセージが全て処理されます。
(このため、描画(WM_PAINTメッセージ)も処理される、というわけです)

が、逆に言えば、フォームのクローズ(×ボタン押下など)の
メッセージも処理されてしまう為、問題が発生する場合もあります。
このため、先のレスのような回避策を申し上げたのですが、
場合によってはフォームの Refresh メソッドを実行するだけで
回避できるかもしれません。
DoEvents を Form1.Refresh, Form2.Refresh に変更してみてください。
こちらの方法できれいに描画されるのであれば、
このほうが安全です。

但し、場合によってはうまく描画されない場合もありますので、
この場合は
Form1.Refresh
DoEvents
というように併せて使うなり、Refresh を DoEvents に置き換えるなり
して下さい。

#見当違いの発言でしたらお詫びします。


ミッション  2004-11-11 03:32:45  No: 117488

Load Form2
Form1.Visible = False
Form2.Visible = True

これでいけないですかね?


ねろ  2004-11-11 16:44:14  No: 117489

>Form2 はフォームに1つラベルが貼り付けてあるだけで初期化処理はありません。
そんなフォームが立ち上がるのが時間がかかるなんて、たとえ正常に表示されたとしても
何かおかしくなっているのでは。
私だったら、クリーンインストールしてみるかな。


エスペランサ  2004-11-12 02:15:47  No: 117490

raki様、 Refresh のみで利きました。
ミッション様の Load Form2 も利きました。
ぱっと切り替わって感激です。

Load というものがあるのは知っていましたがこの役割がよくわからず使った
ことはありません。
help 読みました。 Unload を見るとメモリーから削除されるとあります。
Form1 を消すのに Unload Form1 とやったら処理は中断してしまうということですね。Load と Unload 間で完結するように使うということですね。

Refresh の方は表示だけに働くという風に考えたらいいのですね。

ねろ様のご意見を読んではっとしたんですが画面切り替えは他でもやってますが
表示が変だというのは1件だけです。
Form2は何か他と違う部分があるのかな。 

皆様ありがとうございました。


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

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






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