
VB2005でデリゲートというものを始めて使っています。
いま困っているのは、メインスレッドのテキストコントロールのTextプロパティに、別のスレッドからデータをセットする場合、デリゲートという機能を使わないといけないということで、以下のようにしています。
画面上には別スレッドで書きこみたいTextBoxコントロールが沢山あり、
個々に(1)を記述しないといけないのでしょうか?
txtTest部分の名前が違うだけですが・・・
デリゲードに関して初めて使っているのであまり理解できていませんが、数が多いと
面倒なので何か方法があるのではないか、質問しました。
詳しい方教えて下さい。
そもそも、別スレッドの書き込みでデリゲートを使う方法は駄目なのでしょうか?
'デリゲートの定義
Delegate Sub dlgWriteText(ByVal text As String)
'txtTestに書き込む ----- (1) セットするコントロール毎にこれが必要???
Private Sub DlSettxtUserName(ByVal text As String)
Me.txtTest.Text = Text
End Sub
'別スレッド部分
dim data as String = "別スレッドでデータセット"
'別スレッドで書きこむ
Me.txtTest.BeginInvoke(New dlgWriteText(AddressOf dSetTest), data)
よろしくお願いします。
No.1ベストアンサー
- 回答日時:
> セットするコントロール毎にこれが必要???
もちろんそれを回避するテクニックは色々あるのですが、最初はそこから始めてください。ここを理解しないで応用編に進むと後で絶対に泣きます。もし、今仕事で開発してて、時間がねぇ原理は要らねぇ動くモノだけよこせという事態なのであれば・・・・むしろ時間が無いなら確実に動く今の形を一生懸命実装する方が最終的に泣かなくてすむかと。
ちなみに、基本形として一般的には以下のように記述します。
Private Delegate Sub dlgWriteText(ByVal text As String)
Public Sub DlSettxtUserName(ByVal text As String)
If Me.txtTest.InvokeRequired Then ' Delete
Static Dim d As dlgWriteText = New dlgWriteText(AddressOf Me.DlSettxtUserName)
Me.txtTest.Invoke(d, text)
Return
End If
Me.txtTest.Text = text
End Sub
これで、フォームスレッドの中からでも外からでもDlSettxtUserNameを呼ぶとtxtTestに文字をセットし、かつ必要があれば勝手にInvokeしてくれます。必要かどうかの判断も.Net Frameworkが自動でやってくれるのでとっても楽チン。
応用編としては、最も安直で泥臭いモノだとdlgWriteTextにIntegerの引数を一つ増やしてそれの値によってコントロールを選択する、とかね。第二引数にテキストボックスを直接食わせても良いんですけど、まずはDelegate(というかInvoke)について後ろで動いているカラクリを理解する事です。後、BeginInvokeは非同期Invokeを行うもので、使うならきちんとEndInvokeを呼び出してあげるべきです。今回の文字列一つコピーのような場合は同期InvokeのInvokeを使うのが良いと思います。
この回答への補足
|ご忠告、ありがとうございます。
なるほど、意識して使わなくても済むように、一元化するのですね。
応用編で申し訳ないのですが、こういう事でしょうか?
noを引数の前に入れています。
Private Delegate Sub dlgWriteText(Byval no as Integer, ByVal text As String)
Public Sub DlSetText(Byval no as Integer, ByVal text As String)
Select case no
case 1: 'txtTestの場合
If Me.txtTest.InvokeRequired Then ' Delete
Static Dim d As dlgWriteText = New dlgWriteText(no, AddressOf Me.DlSettxtUserName)
Me.txtTest.Invoke(d, no, text)
Return
End If
Me.txtTest.Text = text
case 2: 'textExampleの場合
'省略
End Select
End Sub
ここで疑問が2つ出てきました。
(1)Static Dim dのところで、なぜStaticとする必要があるのか
(2)非同期Invokeはどういう時に使われるのでしょうか?サンプルもあれば助かります。
よろしくお願いいたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Excel(エクセル) マクロでテキストファイルを読み込んだ際の最終セルにデータと改行が含まれる問題の改善方法 2 2022/03/25 16:50
- C言語・C++・C# C# で、あるフォルダー内にあるすべてのテキストファイルを別のフォルダーにコピーする。 4 2022/11/21 13:23
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- Excel(エクセル) エクセルのVBAについて とあるサイトのコードを参考に、CSVの文字化けを直すVBAを作成しているの 7 2022/11/04 14:15
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Excel(エクセル) エクセルVBA、間違っているコード内容を正して頂けませんか? エクセルワークシートに納品書を作ったの 2 2023/08/02 21:13
- Visual Basic(VBA) 【前回の続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/16 16:44
- Excel(エクセル) エクセルのマクロについて教えてください。 2 2023/02/21 13:29
- Excel(エクセル) このコードに追記事項の仕方を教えて下さい。 以下のコード内容に出てくる。セルH3が空白の場合、エラー 4 2023/08/03 00:22
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
数字のみ入力可
-
NumericUpDownコントロールでの...
-
【ASP.NET】 GroupBoxコントロ...
-
ASP.NetのGridViewで任意の行ク...
-
画面遷移が不正ですと表示されます
-
C#でドラッグ&ドロップが機能し...
-
VBAで一時中断したプログラムの...
-
Accessの画面更新を一時的に停...
-
コネクション・セッション・ト...
-
getParameterで値が取得できず...
-
PageLoadの後にJavascript実行...
-
コンピュータへの接続数が最大...
-
グーグルマップの文字化けで困...
-
c# 文字列の最後から1文字削除...
-
ページングが大量発生する原因...
-
パスワードつきホームページ ト...
-
セッションIDを取得したい
-
aspxをhtmlに変換する方法について
-
Eclipseでクリーンが出来ない
-
ボタンをクリックした時に、入...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Webページ上のボタン等の位置を...
-
ASP.NetのGridViewで任意の行ク...
-
asp.netにてgridviewの列を動的...
-
SuspendLayoutが効かない?
-
MFCでグリッド
-
数字のみ入力可
-
NumericUpDownコントロールでの...
-
【ASP.NET】 GroupBoxコントロ...
-
google map の最新コントローラ
-
htmlコードをコントロール単位...
-
C#で動的に配置したコントロール
-
ACCESS2010でカレンダーのサン...
-
webcontrolグラスにdivはない?
-
.netのAjaxでドラッグアンドド...
-
ASP.NET テキストフィールドの日付
-
WEBと連動したソフト
-
ASP.NETでFLASHコンテンツを表...
-
VBAで一時中断したプログラムの...
-
コネクション・セッション・ト...
-
Accessの画面更新を一時的に停...
おすすめ情報