質問: v) Dim ac As New Action(Of String)(Sub(v) target.AppendText(v + vbCrLf)) If target.InvokeRequired Then target.Invoke(ac, New Object() {value}) Else ac(value) End If Catch ex As ObjectDisposedException Return End Try End Sub ``` ↑のメソッドを使って、サブスレッド側でフォームと書き込みたい文字を引数に渡しているのですが、テキストボックスに表示されません。(Formクラスと別スレッドを開始しているクラスは別です。これを同じクラスにすると文字の書き込みは行われます。) おそらく、渡している引数が悪いと思うのですが、いまひとつ原因がわかりません。 この質問内容だけではプログラム全体が把握できないと思うので、該当のプログラムをこちらからDLしてもらい見てもらえれば幸いです。↓ リンク内容(PASSWORD:今年の西暦4桁を数字で) プロジェクトが二つ(クライアント側とサーバー側)入っています。 スタートボタンで接続を開始してもらい、クライアント側で何か文字を送っていただければ、クライアント側には送信文字と受信文字がテキストボックスに書き込まれると思います。 質問該当箇所(例) ``` '//ログの書き込み CommonMethod.SetAppendText(ServerForm.LogTextArea, "クライアントが接続しました。") CommonMethod.SetAppendText(ServerForm.LogTextArea, "接続停止 " + ex.ToString()) 'ログへの書き込み CommonMethod.SetAppendText(ServerForm.LogTextArea, "クライアントが切断されました。") ```
回答: さっと見た感じServerListen内で使用しているServerFormが別物として新たに作成されています。 このため、ServerStart内で使用されるServerFormは表示されているもの ServerListen内で使用されるのは新たに作成された表示されていないServerFormとなっています。 別スレッドからはMy.MyProject.MyFormsを使うのではなく ``` Private MainForm As ServerForm Public Sub New(UI As ServerForm) MainForm = UI End Sub ``` と変数宣言、コンストラクタを作成し ``` CommonMethod.SetAppendText(MainForm.LogTextArea, "クライアントが接続しました。") ``` と呼べばよいかと また、今回の件とは直接関係がありませんが、TCPクラス内でフォーム側のデザインに左右されるような作りをしないほうが良いと思います。