darai
darai****@users*****
2005年 3月 12日 (土) 09:49:53 JST
daraiです。 > 「コントロールのメソッド」というのは、 > ログを1行づつ出力している > this.AppendText(msg); > の事ですよね。この処理AppendTextが処理している間は他の処理をしないように > すればいいんですよね? そうです。 > 手順: > 1:SimulationTextBox.csのBuy関数のすぐ上に定義 > public delegate void MyDelegate( string msg ); > > 2:buy()関数の中に定義 > System.Windows.Forms.Control control; > MyDelegate myDelegate = new MyDelegate(TextBoxBase.AppendText(msg) ); ★ > object [] argss = { msg }; > // デリゲートを BeginInvoke で起動する。 > IAsyncResult ar = control.BeginInvoke( myDelegate, argss ); > // シグナルを待つ。 > ar.AsyncWaitHandle.WaitOne(); > if (ar.IsCompleted) > { > Console.WriteLine("Completed"); > // EndInvoke で結果を得る。 > object obj = control.EndInvoke(ar); > } > > 上記のコードを追加しましたが、エラーが出てしまいます。 > ★マークの行で > 「メソッド名が必要です」と、 > 「静的でないフィールド、メソッド、またはプロパティ 'System.Windows.Forms.TextBoxBase.AppendText(string)' で、オブジェクト参 > 照が必要です。」 > と出ます。 > AppendTextってメソッド名ですよね? メソッド名はAppendTextまでです。 (msg)は余計です。 TextBoxBaseとは何でしょうか。 この部分はオブジェクト参照でなければなりませんよ。 control.BeginInvokeのcontrolとは何でしょうか。 Formのオブジェクト参照を指定する場合が多いのですが、 thisで大丈夫だと思います(未確認)。 また、BeginInvokeではなく、Invokeを使ってください。 デリゲートをInvokeに渡すだけなので簡単です。 MyDelegate myDelegate = new MyDelegate(this.AppendText); object [] argss = { msg }; this.Invoke(myDelegate, argss); > 構文について教えていただきたいのですが、 > 「public delegate void MyDelegate( string myInt );」 > ↑これによって、string形の引数を一つ持つ関数用のデリゲート型を定義したというこ > とでしょうか? そうです。 > 「MyDelegate myDelegate = new MyDelegate(TextBoxBase.AppendText(msg) );」 > ↑これによってmyDelegateという、無印C言語でいうところの「関数へのポインタ変数を > 定義した」という事でしょうか? > そしてmyDelegateの中には、TextBoxBase.AppendTextのアドレスが格納されている? 使い方は関数ポインタのようなものですね。 内部的な仕組みについては詳しく知りません。 -- darai <darai****@users*****>