- PR -

C# 初歩的でしょうが、外スレッドからフォームの要素にアクセス

投稿者投稿内容
有末 清華
ベテラン
会議室デビュー日: 2006/10/09
投稿数: 52
お住まい・勤務地: 北海道
投稿日時: 2007-02-12 10:23
コード:
Invoke(Delegate method,params object[] args)

なのに
コード:
Invoke(Method,text)


が動かなくて発狂しました。昨日眠かったんでしょうね
引用:
this.Invoke(d, new object[] { text });

 ってヘルプのコードに書いてますね、見落としてましたorz

というか、さきほど

http://csharper.blog57.fc2.com/blog-entry-36.html

で MethodInvokerなるものと匿名メソッドを組み合わせた方法を発見。渡さなくても渡せる*^^ 匿名メソッドさま様です。

こんな感じで使ってます。

コード:
this.Invoke((MethodInvoker)delegate(){
            	this.Mode = Mode.Verify;
				this.Cursor = Cursors.Default;
				this.trainGesturesToolStripMenuItem.Enabled = true;
				
				// Complete
				this.toolStripProgressBar1.Value = 0;
				
				// Refresh surface
				points.Clear();
				DoPaint(grfx.Graphics);
				this.Refresh();
				
				// Refresh gesture list
				this.RefreshGestureList();
            });


_________________
有末 清華
crazy(){for;;{you();}} - プログラマの覚書
Kazuki
ぬし
会議室デビュー日: 2004/10/13
投稿数: 298
投稿日時: 2007-02-12 15:06
引用:

なのに
コード:
Invoke(Method,text)



が動かなくて発狂しました。昨日眠かったんでしょうね



コード:
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    // こうやって
    private delegate void SampleDelegate(string text);

    private void button1_Click(object sender, EventArgs e)
    {
        new Thread(ThreadProcess).Start();
    }

    private void ThreadProcess()
    {
        // 明示的にdelegate渡してあげないと駄目みたいですね
        button1.Invoke(new SampleDelegate(delegate(string text) 
            { 
                button1.Text = text; 
            }), 
            "Hello world"); // 引数渡せる
    }
}



どういう理屈でコンパイラが解釈してるのか知らないですが、匿名メソッドだと素直に引数渡せないみたいです。
昔ながらのやり方で、Delegateを作ってあげるとうまくいきます。
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2007-02-12 18:38
引用:

有末 清華さんの書き込み (2007-02-12 00:55) より:
どうやら新しいBackgroundWorkerとやらがC#2.0では使えるみたいですね、サンプル少ないけど(苦笑



なんてタイムリーな。
http://blogs.wankuma.com/rti/archive/2007/02/08/61582.aspx
_________________
R・田中一郎 -  R.Tanaka.Ichiro’s Blog

スキルアップ/キャリアアップ(JOB@IT)