[Protra-members] Re: 不具合「ログの表示が一定量で止まってしまう」について

アーカイブの一覧に戻る

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*****>




Protra-members メーリングリストの案内
アーカイブの一覧に戻る