| ■No88604 (パヨンパヨン さん) に返信 > コードを貼り付けたいのですが > 迷惑投稿者というエラーが出て投稿拒否されてしまいます。 > どこが問題なのか分かりません。
正:以下の方法/で/合/っていますか? 誤:以下の方法/出/会/っていますか?
> 以下に質問内容とコードをアップしましたので > そちらを見ていただけますでしょうか? というか、Option Strict On だとコンパイルエラーになりますよねコレ。
Integer と String の両方に対応させたいなら、 Public Overloads Sub SetText(TBox As TextBox, s As String) End Sub Public Overloads Sub SetText(TBox As TextBox, i As Integer) End Sub のようにオーバーロードすべきですし、折角用意した Delegate Sub delegate_SetText(TBox As TextBox, i As Integer) も、まったく使われていないどころか、指定するデリゲート型が Action(Of TextBox, Integer) ではなく Action(Of Control, Integer) になっているため、Control → TextBox の縮小変換が行われちゃいますし…。
そもそも、一連の質問のコードは、どういう処理を意図しているのでしょうか? 10 ミリ秒待機しながら、TextBox の値を書き換えたいのなら、
Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click For i = 1 To 10000 TextBox1.Text = Await Progress(i) Next End Sub Public Async Function Progress(i As Integer) As Task(Of String) Await Task.Delay(10) Return i.ToString() End Function
の方が良さそうな。
> frm.Invoke(Sub() SetTextBox(Me.TextBox2, sw.ElapsedMilliseconds.ToString)) また frm が再来してますね。外部の変数を使わずとも、 自フォームの Invoke か、TextBox2 の Invoke で良いような。
> Dim CL As New Class1 > BeginInvoke(New Action(Of Control, Integer)(AddressOf CL.SetText), TextBox1, s) SetText の第一引数が常に TextBox1 であるのなら、 Dim CL As New Class1(TextBox1) '固定パラメータをコンストラクタで渡す BeginInvoke(CL.DelegateInstanceOfSetText, s) 'デリゲート型のフィールドを渡す な実装にした方がすっきりしそう。
> 時間を比較してみましたが、 こちらでは検証していませんが、何故 BeginInvoke を呼んでいるのでしょうか。
IAsyncResult を処理している様子も無さそうなので、これだと、 デリゲートを受け渡す時間が測定されるのみで、 デリゲートの実行時間は測定されない気がします。 |