• ベストアンサー

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% (1034/2055)
回答No.2

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

nebokken
質問者

補足

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

  • emsuja
  • ベストアンサー率50% (1034/2055)
回答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

  • visibleの機能について

    VBで「Label.visible」でFalseが非表示、Trueが表示だと思うのですが、Trueで非表示の場合があります。 プログラムではTrueにしたりFalseにしたりします。もしかしてvisibleの設定がおかしくなったのかなと思って実行中にvisibleの内容を表示してみてみましたが、Trueで非表示になる場合があります。必ず非表示になると言うわけではないので困っています。 原因がわかる方、もしかしてここでは?と言う方でも結構です。 宜しくお願い致します。

  • Delphi6 Labelの表示を切り替える

    Delphi初心者です。 ファイルをコピーする処理を作っています。 ボタンをクリックしたときファイルのコピーを開始するのすが、ファイル容量が大きいので ”コピー中”というメッセージを表示しょうと思います。 Labelにメッセージを書いて、このLabelのVisibleをFalseにし、ボタンをクリックしたときにTrueにしているのですが、うまくできません。ソースの一部は以下の通りです。 Label.Visible := True; CopyFile('C:\KBISDATA.MDB','E:\KBISDATA.MDB',False); Application.MessageBox('バックアップが完了しました。','データバックアップ処理',mb_ok); exit; この方法では、コピーが終了してからLabelのVisibleがTrueになります(ラベルが表示される)。 一体何が悪いのでしょうか? また、できればコピー中はラベルを点滅できればベストなのですが・・・。 以上、よろしくお願いします。

  • デザイン時のVisible=Falseは実行時に変更できない?

    VB2008です。 フォームデザイン時に、コントロールのVisibleをFalseに設定していると、実行時にTrueに設定してもコントロールが見えません。(実行時エラーも出ません。) 私の環境では、ほぼすべてのコントロールが同じ挙動をします。 もちろん、デザイン時にVisibleをTrueにしておいて、実行時にコードでFalseにすると見えなくなりますし、Trueを与えてやると再度見えるようになります。 これは、言語の仕様なのでしょうか。

  • labelを前面に出したい

    vb6で座標平面を作成するプログラムを作っています。lineやlabelを配列で設置しましたが、 lineが前面に出てしまい、とても見づらいものになってしまいました。labelを前面に出すにはどうしたらよいでしょうか。 (1)lineコントロールを配置し、index=0 (2)labelコントロールを配置し、index=0 (3)(1)と(2)が重なるようにします(label1(0)が前面に出ています)。 (4)以下を実行します Private Sub Form_Load() Form1.ScaleMode = 3 Label1(0).FontSize = 15 Label1(0).FontBold = True Line1(0).BorderWidth = 2 Line1(0).BorderColor = &H80000005 Load Line1(1) With Line1(1) .X1 = 100 .X2 = 100 .Y1 = 0 .Y2 = 200 .Visible = True End With Load Label1(1) With Label1(1) .Left = 98 .Top = 80 .Visible = True End With End Sub (5)label(1)が背面になります。

  • C++ Builder でVisibleとshow

    こんにちは、王次郎です。 C++ Builder でコンポーネントの表示/非表示を切り替えるときに メンバ関数の Show()/Hide() を呼ぶ方法と プロパティの Visible を True/False にする方法がありますが、 どう違うのでしょうか?どちらが良いのでしょうか? よろしくお願いします。

  • 特定のキーを入力すると、visible=falseからtrueになるよ

    特定のキーを入力すると、visible=falseからtrueになるようにコーディングしたいのですがうまくいきません。次のようにalt+F12でFrameを表示させたいのですが全く反応しません。何故でしょう。 Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) Select Case KeyCode Case vbKeyF12 If Shift = vbAltMask Then Frame2.Visible = True End If End Select End Sub アドバイス願いますm(_ _)m

  • ループの後にTrueになる不思議

    下記のコードを実行してみます。 Private Sub Command1_Click() ProgressBar1.Visible = True Label1.Visible = True ProgressBar1.Max = Val(Text1.Text) For i = 1 To Val(Text1.Text) Text1.Text = i ProgressBar1.Value = i Next i MsgBox "終了しました。" ProgressBar1.Visible = False Label1.Visible = False End Sub 「ProgressBar1」はループに入る前に「Visible = True」になります。 「Label1」はループ終了後に「Visible = True」になります。 「Text1.Text = i」はループ終了後に表示されます。 本来は、「Label1」はループに入る前に「Visible = True」にして、「Text1.Text = i」をループ中に表示させたいのですが、できません。 どこかコードが間違っているのでしょうか。

  • 単純な質問で恐縮です。

    単純な質問で恐縮です。 コマンドボタン1を押したら、ラベル1が消えて、ラベル2が表示させるようにしたいのですが動きません。 Private Sub CommandButton1_Click() Label1.Visible = False Label2.Visible = True end sub どうしてでしょうか?

  • MDIParent1に、ToolStripButton1とLabel1

    MDIParent1に、ToolStripButton1とLabel1、Label2を 配置しています。 やりたいことは  (1)ToolStripButton1をクリックしてForm1を表示させる。  (2)Label1をクリックしてForm1のTextをLabel1のTextに変更する。  (3)Label2をクリックしてForm1のTextをLabel2のTextに変更する。 最初に表示させたForm1のTextのみを変更させる。 現在下記のプログラムを実行したのですが Label1をクリックすると新たにForm1が表示されてしまいます。 (Form1のTextはLabel1のTextに変更されている) Label2をクリックすると新たにForm1が表示されてしまいます。 (Form1のTextはLabel2のTextに変更されている) クリックする毎にForm1がふえていきます。 対策方法を教えてください。 Public Class MDIParent1 Dim F1 As Form1  Private Sub ToolStripButton1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripButton1.Click Dim frm As New Form1 frm.MdiParent = Me frm.Show() End Sub   Private Sub Label1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Label1.Click F1 = New Form1 F1.Visible = True F1.Text = Label1.Text Label1.BorderStyle = BorderStyle.Fixed3D Label2.BorderStyle = BorderStyle.None End Sub   Private Sub Label2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Label2.Click F1 = New Form1 F1.Visible = True F1.Text = Label2.Text Label2.BorderStyle = BorderStyle.Fixed3D Label1.BorderStyle = BorderStyle.None End Sub End Class

  • visibleについて

    現在ステージ上に複数のMCが配置してあり、 これらのMCを_visibleを使用して非表示にしたいと考えています。 for文を使用して非表示にしたいのですがうまく動作しません。 単純な質問ですがお付き合い頂けたらと思います。 例 ステージにmc test_mc1 ~ test_mc10 を配置 //イベント発生時に非表示 test_btn.onRelease = function() { for( i = 1 ; i <= 10 ; i++) { aaa = "test_mc" + i aaa._visible = false; } } 上記のようにスクリプトを記述したのですが、非表示されません。 非表示になる方法をご教授頂けたら幸いです。 開発環境:CS3 AS2.0 よろしくお願いします。

    • ベストアンサー
    • Flash

専門家に質問してみよう