• ベストアンサー

Label2.visible=false

任意の関数式を入れるとグラフを描くプログラムを作りました。表示するのに時間がかかる(といっても1秒程度ですが)ので「計算中!」と赤で表示させ、グラフが描き終わると消したいと思い、グラフ開始時にLabel2.Visible=True、終了時にLabel2.Visible=Falseを付けましたが、思惑通りには行きません。何故でしょう。おわかりになる方、教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

.NET以降,DoEvents (System.Windows.Forms.Application.DoEventsメソッド) の使用は推奨されません。 DoEventsはVB6までやVBAのような,マルチスレッドが扱えない言語における代替策でしかなく, 長時間かかる処理 (だいたい50ms:WinRT APIにおける非同期処理の目安) を超えるようであれば,その処理はバックグラウンドスレッドで処理すべきです。 VB 2005以降であれば,BackgroundWorkerコンポーネントをFormに配置し, ・Label2.Visible = False後,配置したBackgroundWorkerのRunWorkerAsyncメソッドを呼び出す ・グラフの点の計算をBackgroundWorkerのDoWorkイベントに記述する。 ※このイベントの中で,Formのコントロールやコンポーネントに触ることができないので注意して下さい。 ・BackgroundWorkerのRunWorkerCompletedイベントで,グラフの描画やLabel2.Visible = Trueを行う。 という方法で処理を行います。 # VB 2012以降で.NET 4.5以降をターゲットとする場合では,Async/Awaitを使う方法が推奨されます。 ref) MSDN: 方法 : バックグラウンドで操作を実行する http://msdn.microsoft.com/ja-jp/library/hybbz6ke.aspx

nebokken
質問者

お礼

補足後に考えることあって、お礼という形で書いています。本当に労をおかけしますが、また回答ください。 プログラムの概要は Label2.Visible=True '「計算中!」と赤で表示、Button1で実行 読み取った関数の下処理 For variableX=xMin to xMax step 1/100 ........xの値とyの値を求め、点をbitmapに表示する。 Next Label2.Visible=False '「計算中!」を非表示 「計算中!」と赤で表示されますが、処理終了後非表示にできないのです。 また、For…のすぐ前にLabel2.Visible=Trueを置くと、表示すらしてくれません。 それで、ご回答では「読み取った関数の下処理」から「Label2.Visible=False '「計算中!」を非表示」までをバックグラウンドで処理をすると良いということになりますか? お手数をおかけしますが宜しくお願いいたします。

nebokken
質問者

補足

ざっとお返事とMSDNを読みました。私は昔のBASIC、N88BASIC、FBASICあがりの超初心者なので、読んでも太刀打ちできそうにないなと思います。でも、もう少し時間をかけて挑戦していきたいと思います。

その他の回答 (3)

  • todo36
  • ベストアンサー率58% (728/1234)
回答No.4

1秒程度であれば、BackgroundWorkerを使う必要はない Label2.Visible=True Label2.Refresh() 'Label2を描画 '1秒かかる処理 Label2.Visible=False

nebokken
質問者

お礼

だめでした。でも、ご回答いただき感謝申し上げます。また、何か気づかれたらお願いします。

  • emsuja
  • ベストアンサー率50% (1065/2116)
回答No.2

#1 です 専門は VB6 と VBA で Net はほとんどやっていないので・・・ VB6 なら 前処理 Label2.Visible = True Doevents 重い処理 Label2.Visible = False Doevents 後処理 と書くんですが・・・

nebokken
質問者

補足

骨折ってすいません 「'doevents' は宣言されていません」とでます。 確かに、自分で言うのも変ですが、重い処理です。 耐えられなくなってしまったか。 メインのプログラムにその症状が出なくて良かったと思っているくらいです。

  • emsuja
  • ベストアンサー率50% (1065/2116)
回答No.1

アプリケーションから Windows に制御を渡していないので Form が再描画されていないのが原因です VB のバージョンが判らないので・・・ VB6 とか VBA ならば Doevents VB.NET ならば My.Application.DoEvents でいいのかな? Label2.Visible = ・・・ のアトに一号挿入して下さい

nebokken
質問者

お礼

これはemsujaさんへの「お礼欄」ですが、回答3件目の回答者Yune-Kichiさんに「補足」を書きましたが送信した後、もう少し付け足ししたくて、「お礼欄」をも使ってしまいました。その後悪戦苦闘の末、その方の回答のように実践してみた結果、うまくいきました。それで大変失礼かとは思いましたが、このお礼欄を使わしていただきます。ご了承ください。  解決といいましても、バックグラウンドでの処理はうまくいっているようでしたが、bitmapに点をプロットするところでエラーが出ました。「GetHdcメソッドの後にグラフィックスオブジェクトを使用する場合ReleaseHdcメソッドを呼び出してください」ということでした。若干調べましたが手に負える代物では無いと思い、点の座標を配列にため、後で表示するという方法にしました。Label2.Visible=Falseは正常に働いてくれました。 emsujaさん、Yune-Kichiさん、todo36さん、本当にありがとうございました。 ただ、Yune-Kichiさん、読んでいただけると良いのですが。

nebokken
質問者

補足

「Label2.Visible = ・・・ のアトに一行挿入して下さい」は3つ考えられますが、3つともだめでした。 .NET2005です。宜しくお願いします。よかったら、ソースも送りたいです。

関連するQ&A