VisualBasic初心者のための別スレッドからのテキストボックス参照方法
- VisualBasicの初心者が別スレッドからテキストボックスを参照する方法について教えてください。
- 別スレッドからスタートアップフォームのテキストボックスを参照すると、値が正しく表示されない問題が発生します。
- VisualBasic.NET 2008の環境で、別スレッドからテキストボックスの値を参照する方法をご教示願います。
- ベストアンサー
別スレッドからのフォームのテキストボックス参照(VB)
はじめまして、ひろです。 VisualBasicの初心者です。 メインスレッドから"BackgroundWorker"で、 別スレッドを作成し、別スレッドから スタートアップフォームにあるテキストボックスを参照すると、 TextBox1.text="1" (メインスレッドからの参照の場合) TextBox1.text=""(別スレッドからの参照の場合) となり、別スレッドからですと"1"が参照ができません。 "1"を参照したい場合、もしくは書き換えたい場合 どのようにすればいいか、 わかる方がいましたら、教えてください。 よろしくお願いします。 環境:VisualBasic.NET 2008
- hiro300
- お礼率100% (40/40)
- Visual Basic
- 回答数1
- ありがとう数1
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
Delegateを使ってワーカーとメインの橋渡しをしましょう フォームクラスに Delegate Sub myGetText( ByRef sb as System.Text.StringBuilder) Delegate Sub mySetText( ByVal ss as String) を定義しておきます バックグランドワーカーからTextBox1へのアクセスするために以下の2つを定義します Public Sub GetText( byRef sb as System.Text.StringBuilder) if TextBox1.InvokeRequired then ' バックグランドワーカーから呼ばれた場合 dim d as new myGetText(AddressOf GetText) invoke( d, new Object(){ sb } ) else ' メインスレッドから呼ばれた場合 sb.Append( TextBox1.Text ) end if End Sub Public sub SetText( byVal ss as string ) if TextBox1.InvokeRequired then ' バックグランドワーカーから呼ばれた場合 dim d as new mySetText(AddressOf SetText) invoke( d, new Object(){ ss } ) else ' メインスレッドから呼ばれた場合 TextBox1.Text = ss end if End If といった具合です 呼び出し側のワーカースレッドでは Dim sb as New System.Text.StringBuilder() dim n as integer = 0 while n < 1000 GetText( sb ) n = sb.ToString n += 1 SetText( n.ToString ) WEnd
関連するQ&A
- 別スレッド上の変数を参照する方法について
VB2010で、別スレッドの変数をメインフォームが閉じられた時に 表示するプログラムを書いたのですが、変数の中身が空になってしまいます。 色々試してみたのですが、うまく値を参照できません。 別スレッド上の値をどうやったら参照できるのでしょうか? 以下のような感じで記述したのですが、何か特別な書き方があるのでしょうか? わかりにくい質問ですが、ご回答おねがいします。m(_ _)m 簡単なイメージを書きました。 http://www.progoo.com/rental/img_bbs1/img_data/18133_730_30ba642aac.jpg 'メインフォーム Public Class Form1 '★変数testをpublicで宣言 Public test As String="" '★ロードしたらBackgroundWorker1を動かす Private Sub Form1_Load() Handles MyBase.Load BackgroundWorker1.RunWorkerAsync() End Sub '★BackgroundWorker1はModule1.test()を動かしてtestに"成功"の文字列を入れる Private Sub BackgroundWorker1_DoWork() Handles BackgroundWorker1.DoWork Module1.test() End Sub '★フォームを閉じた時に変数testを表示する Private Sub Form1_closing() Handles MyBase.FormClosing MsgBox(test) End Sub End Class '別モジュール Module Module1 Public Sub test() Form1.test = "成功" End Sub End Module
- ベストアンサー
- Visual Basic
- VB で、テキストボックスをコピーする方法 {至急お願いいたします}
VB で、テキストボックスをコピーする方法 {至急お願いいたします} 今、VisualBasic(以下、VB) で、ソフトを作っていますが、テキストボックスの中身をクリップボードにコピーしたいです コピーしたいのは、 textbox9です。 clip.SetDataObject(TextBox1.Text) でやってみるとエラーを起こしてしまいます・・・ どうすると、テキストボックスの中身をコピーできるでしょうか? 尚、現在、VBの2008無料版と2010の無料版でやっています メインは、2010ですので・・・
- ベストアンサー
- Visual Basic
- サブフォームにあるテキストボックスの値を参照したい
ACCESS2010です。 サブフォーム(帳票フォーム)のフッターにある、コントロールソースが =nz(sum([金額]),0) と設定してあるテキストボックスがあります。([合計金額s]) この[合計金額s]の値を、メインフォームのコントロールソースがテーブルの項目に設定されているテキストボックス([金額])で参照したいのですが、金額入力直後の値が参照できません。 現在はメインフォームに中継用のテキストボックス([金額wk])を作成し、コントロールソースを[合計金額s]に設定、acNewRecする前に[金額wk]の値を[金額]へ渡しています。 何とか直接参照する方法はありませんでしょうか。
- ベストアンサー
- その他MS Office製品
- ユーザーフォームのテキストボックスについて
ユーザーフォームのテキストボックスを使ってシートにデータを転記しています。 テキストボックスに日付を5/10のような形式で入力し、表示をH22.5.10と変換させるようにしています。 Private Sub TextBox1_AfterUpdate() x = TextBox61Text TextBox1.Text = Format(x, "ge.m.d") End Sub これを転記した時に、そのまま文字列として貼り付けられるため、シリアル値として入りません。 これをシリアル値として入れるためにはどのようにすればいいでしょうか?
- 締切済み
- オフィス系ソフト
- ユーザーフォームのテキストボックスの書式設定について
ユーザーフォームのテキストボックスの書式設定について TextBox1に金額、TextBox2に日付を入力し、Sheet1に転記するような フォームを作っています。 TextBox1には、 Private Sub TextBox1_Change() y = TextBox1.Text TextBox1.Text = Format$(CLng(y), "#,##0") End Sub としています。 TextBox2には、書式をH○○.○.○という設定にしたいのですが、 どのようにしたらよいでしょうか。
- ベストアンサー
- オフィス系ソフト
- フォーム内のテキストボックスの値を参照するには?
モジュールからフォーム上のテキストボックスに入力された値を参照する方法で質問です。 内容としては、テキストボックスに入力された日付(yyyymmdd)をファイル名にもつCSVファイルをインポートするといったものです。 フォーム名:Form1 テキストボックス名:TBox1 インポート元:C:\yyyymmdd.csv インポート先:インポートテーブル モジュール記述先:標準モジュール Function Import() On Error GoTo Import_Err Dim FilePath As String FilePath = "C:\" & Format(Form1. TBox1. Value, "yyyymmdd") & ".csv" DoCmd.TransferText acImportDelim, "インポート定義", "インポートテーブル", FilePath Import_Exit: Exit Function Import_Err: Resume Import_Exit End Function 以上の様なモジュールを組んでみましたがインポート出来ませんでした。 エラーは出ませんでしたが何も起こらないといった状態です。 モジュールの部分についてはなんとなくわかるのですが、フォーム側の設定?がよくわかりません。 あと何をどのようにすればテキストボックス内の値を参照可能になりますでしょうか? 何卒よろしくお願いいたします。
- ベストアンサー
- オフィス系ソフト
- visual basicのテキストボックスについて
ビジュアルベーシックでカレンダーを作ろうと考えてます。 日付のところをテキストボックスに数字を入れて、カレンダーに見立てようとしています。 でも、そのテキストボックスに値を代入するとき、一つ一つに textbox1.text=1 textbox2.text=2・・・・ と書いていくのはすごくメンドくさく、非効率的です。 今、自分が考えている解決方法は、javascriptにでてくるdocument.forms[0].elements[a].valueのようなテキストボックスなどの名前を指定しなくても値を代入する方法です。 でも、ビジュアルベーシックにこのような操作が可能なのかわかりません。 知っている方がいたら是非教えてください。
- 締切済み
- Visual Basic
- テキストボックスを下から上へ表示させる
こんにちは、visualbasic2005のテキストボックスのことで質問させていただきます。 ボタンを押すとテキストボックスに文字列を追加表示させたいのですが、表示の仕方でつまづいています。 普通は、 textbox1.Text += "1" textbox1.Text += "2" textbox1.Text += "3" などとすると ____________ |1 | |2 | |3 | | | | |  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ と表示されますが、 ____________ |3 | |2 | |1 | | | | |  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ このように順番が逆に、つまり新しく追加した文字列が一番上に表示されるようにしたいのです。 また、 ____________ |5 | |4 | |3 | |2 | |1 |  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ この状態で「6」を追加すると(テキストボックスの縦幅を超えると) ____________ |6 ■| |5 ■| |4 ■| |3 ■| |2 □|  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ とずれ込み、右側にスクロールバーが出るようにしたいのです。 どうかよろしくお願いします。
- ベストアンサー
- Visual Basic
- ユーザーフォーム上にある「テキストボックス」に小数が入力できない
以前にユーザーフォーム上のテキストボックスにセル値反映する方法を下記(サンプル1)のようにお教えいただいたのですが、下記のようにマクロを組むとテキストボックスに小数が入力できなくなってしまいます。 どのようにしたら、テキストボックスに小数が入力できるようになるのでしょうか? お教えください。 事例)「1.234」とテキストボックスに打ち込むと「1」 「0.856」とテキストボックスに打ち込むと「0」と なってしまいます。 (サンプル1) 'A1のデータを反映するとした場合 'OptionButton1のコード Private Sub OptionButton1_Click() TextBox1 = Sheets("Sheet1").Range("a1") End Sub 'B1に反映するとして 'OptionButton2のコード Private Sub OptionButton2_Click() TextBox1 = "" End Sub 'TextBox1のコード Private Sub TextBox1_Change() If OptionButton2 = True Then Sheets("Sheet1").Range("B1") = TextBox1.Value End If End Sub
- ベストアンサー
- オフィス系ソフト
- テキストボックスやラベルのクリア
下のように ボタンクリックして、新しくフォーム出て、テキストボックスに入ってた値がフォーム2で表示できますが。 今度はなかの値をクリアしたい場合はどうしたらいいですか。 Dim f As New Form2 f.Owner = Me f.Show() f.Label1.Text = TextBox1.Text f.TextBox1.Text = TextBox1.Text
- ベストアンサー
- Visual Basic
お礼
お礼申しあげるのを遅れて申し訳ありません。 ある事情で見れない環境になってしまっていました。 Delegateを調べてやったら、できました。 ありがとうございます。