• ベストアンサー

『動作中』の表記

VB2010にてシステム構築しています。 あるボタンでさせる作業が結構長く『動作中』がみんなにわかるように 処理ボタンを押したらそのボタンのTextを赤字で『動作中』としたいのですがどうしたらいいですか? 普通にButton.ClickのSUB内にコードを書いても動かないので別のものを使用しないといけないんですかね? よろしくお願いします

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

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

長時間処理がかかる場合は,イベントハンドラ内で全部を処理してはいけません。 長時間の処理は,スレッドを作って別スレッドで処理させます。 簡単な方法としては,BackgroundWorkerを使う方法があります。 FormにBackgroundWorkerを貼り付けておいて, ・ボタンのクリックイベントでは,UIの事前処理(ボタンのEnabledをFalseにしたり,Textを変更したりするような処理)を行い,BackgroundWorkerのRunAsyncメソッドを呼び出す。 ・BackgroundWorkerのDoWorkイベントに,処理の本体を書く。UIスレッドではないため,UI要素へのアクセスは厳禁 ・BackgroundWorkerのProgressChangedイベントには,ReportProgressメソッドを(DoWorkイベントハンドラ内から)呼ばれた時に処理したいことを書く。このイベントはUIスレッドで動くため,UI要素へのアクセスが可能。WorkerReportsProgressプロパティをTrueにする必要あり ・BackgroundWorkerのRunWorkerCompletedイベントには,DoWorkイベントの処理が終了した時に行いたい処理を書く。このイベントはUIスレッドで動くため,UI要素へのアクセスが可能なので,UIへの事後処理が可能(ボタンのEnabledをTrueにするなど)。 という風にします。 MSDN: BackgroundWorker クラス http://msdn.microsoft.com/ja-jp/library/4852et58.aspx 他にもスレッドを使う方法は色々ありますが,UIへの変更処理の都合を考えると,BackgroundWorkerが使いやすいです。

Alshark
質問者

お礼

とても解り易く解説していただき、ありがとうございます。 大変勉強になりました。 今まですべての処理を一つのコントロールで行っていたので 処理にだいぶ時間がかかっていました。 おかげさまで、動作が他者にわかりやすくなりました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • VB2010で動作しない

    vb2010でWindowsアプリを作っている初心者です。 ある文字列を与えたテキストファイルを生成しようと思い、以下のコードを書きました。 VB2010の環境で実行すると、テキストファイルはできないし、何も動作しません。 同様のことを別のPCのVB2005(VS2005)で実行するときちんとファイルが生成しました。 VB2010ではエラーは出ないのですが、動作しません。 何かの参照が悪いのでしょうか。 「sw」のところにカーソルを当てると貼付の画像の内容でした。 「書き込み専用プロパティはサポートされていません。」 と表示されていますが、これと関係あるのでしょうか。 この言葉の意味がよくわかりません。 よろしくご指導下さい。 以下コード ↓ Imports System Imports System.IO Public Class formExportData 'プリント ボタン クリック Private Sub btnExport_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnExport.Click Dim sw As StreamWriter sw = New IO.StreamWriter("C:\Users\Taro\Desktop¥Hoge.txt", False, System.Text.Encoding.Default) sw.WriteLine("テストしています。") sw.WriteLine("この文字がプリントされる。") sw.Close() End Sub

  • コマンドボタンを押すと・・・

    vbの超初心者なのですが、フォームにコマンドボタンを何度か設置したら Private Sub Button1_Click(sender As System.Object,・・・ というのと Private Sub Button1_Click_1(sender As System.Object,・・・ というのが出来上がっていて、コマンドボタンをクリックすると Private Sub Button1_Click_1 のほうのコードが実行されるのですが、 Private Sub Button1_ClickとPrivate Sub Button1_Click_1 の違いはなんでしょうか? Private Sub Button1_Clickは、どのコマンドボタンを押せば実行されるのでしょうか?

  • vb.netで、ステートメントの終わりを指定してくださいとエラーが出ま

    vb.netで、ステートメントの終わりを指定してくださいとエラーが出ます。 出る部分は、以下のコードです Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click If TextBox1.Visible = True Then Me.TextBox9.AppendText("第1小計") + (textbox1.text) + ("円") こんな感じです。 したいことは、ボタン1をクリック時にテキストボックス1が、表示されていたら、テキストボックスに、第1小計とテキストボックス9の中身と円を入力するというかんじです。 ステートメントの終わりを指定してくださいというエラーが出て困っています。 どうすればいいでしょうか? あと、今、書いたコードと似ている動作ができたら何でもOKです。 VBは、バージョンが、2010です vb.net時代ですのデ・・・ よろしくおねがいします

  • 特定のフォームだけ別フォームからの参照がされません

    VB 2005,Framework2.0を使用しています。 現在、サブフォームからダイアログフォームを表示し、ダイアログフォーム内の入力値等をサブフォームに渡す処理を行っています。 サブフォームは複数作成しており、特定のサブフォームだけダイアログフォームの入力値がサブフォームに渡されず原因が分からなくて困っています。 コードは以下のような形で書いています。 'サブフォーム Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim f As New Dialog1 f.StartPosition = FormStartPosition.CenterParent f.ShowDialog() End Sub End Class 'ダイアログフォーム Public Class Dialog1 Private Sub OK_Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OK_Button.Click Form1.Label1.Text = Textbox1.text Me.Close() End Sub End Class 2005では、別フォームからの参照はVB6と同じようにインスタンスを作成しなくても参照できる様になったと聞いていますので、上記のコードでも参照方法として問題はないと思うのですが、うまく動作しない原因が分かる方が居られましたら宜しくお願いします。

  • 複数のボタンを、プロパティを引数に、ひとつのイベントに飛ばしたい

    VB2005 Expressを使っています。 デザインでButton1、Button2、 Button25までコピーペーストで 配置し、名称はそのままButton1からButton25とします。 TextもそのままButton1からButton25とします。 テキストボックスをひとつだけ作り名称は、TextBox1で TextBox1のテキストは、空白とします。 各ボタンを押したら、そのボタンの名称、 または そのボタンのTextでも構いません Tagでもいいです。 (例="Button5")を、 TextBox1に表示するプログラムを作る場合 Button1をクリックした時のPrivateSub(みたいなやつ)   TextBox1.Text="Button1"  End Sub を25回、書けばコードが長く なってしまいますが、 できれば   For a=1 to 25 When Click Button(a) Then (みたいな感じ) TextBox1.Text="Button"& a Next こういう、[!感じ] でコードを短くしたいのですが、 よい方法があれば教えてください。

  • Form1.vbをイベントなしで動作させるには?

    VB2005初心者で困っています。 Menu.vbとForm1.vb, Form2vb, Form3.vb・・・を作り、Menu.vbのButton1_ClickでForm1.Show()としてForm1.vbに移行し、次にForm1のButton1_clickイベントでExcelからDataを読み込んでGraphを書かせています。(この時は問題なく動作しています) これを、Form1に移行したらすぐにGraphを表示しようとして、Form1.vbの Public Class Form1 Private Sub Button_Clic(Byval sender As System・・・・・)Handles Button1.click   Dim g As Graphics   ・・・・ を変更して、  Private Sub Form1_Load(Byval sender As System・・・・)Handles MyBase.load Me.Show() Dim g As Graphics   ・・・・ と、しましたが、一瞬Graphは表示しますが、すぐに消えます。 また、罫線はまったく表示しません。 Button_ClickイベントなしでForm1を動かすにはどうすればよいのでしょうか?

  • C#での書き方

    vb.netでは別のイベントを呼び出すとき下記のような書き方ができたのですが、C#ではどう書くんでしょうか? (ボタン2を押したらボタン1の処理が走る) Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click MessageBox.Show("AAA") End Sub Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click Button1_Click(sender, e) End Sub

  • VB2010の、Formを開く動作に関する質問です

    VB2010のFormについてお聞きしたいことがあります。 例えばForm1とForm2の2つがあるとして、 ・Form1上のボタンをクリック後Form2が表示される ・Form2を表示後Form1は自動で閉じられる。 この様な事をするにはどの様に行えばよろしいでしょうか? 試しに、 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click   Form2.Show()   Me.Close() End Sub と、してみたのですが Form2が表示された直後に1と2両方消えてしまいました。 改善方法を教えていただけると嬉しいです。 よろしくお願いいたします。

  • VB2010 クリック数カウント

    アンケート結果の集計のために、コマンドボタンをクリックするたび、ラベルのところにクリック数が表示されるプログラムを作ろうと思ってます VB2010ですが、下記のコードでは、クリックしたら「1」とだけしか表示されませんでした どうすれば、クリックの度、数が増えるのでしょうか? Private Sub Button1_Click() Handles Button1.Click Dim a As integer a = a + 1 Label1.Text = a End Sub

  • TextBoxでEnterキーを押すと、にあるButtonを押したのと同じ効果を出す方法

    VB初心者です。 まだ、はじめたばかりなので、上手く質問を説明できませんが、よろしくお願いします。 環境はVisualBasic .net 2003です。 フォームにテキストボックス(TextBox)とボタン(Button)があります。 テキストボックス内でEnterキーを押すと、ボタン(Button)を押したのと同様の効果をだしたいのですが。 VC++6.0だと、SendMessage(WM_COMMAND , ..... のようなやり方でできたはずですが・・・ --------------------------- テキストボックスのコード Private Sub txtTest_KeyDown(ByVal sender As Object, _ ByVal e As System.Windows.Forms.KeyEventArgs) Handles txtTest.KeyDown If (e.KeyCode = Keys.Enter) Then '★★★ここでどういうコードを書いてよいかわかりません。 End If End Sub ---------------------------- ボタンを押したときのイベントハンドラ Private Sub btnTest_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnTest.Click     ボタンを押したら、このイベントハンドラを呼び出したい。     もしくは、間接的に呼び出したい。 ------- どなたか、やり方をご存知の方がいらっしゃいましたら、よろしくお願いします。