C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

コールバック関数からコントロールの操作


(過去ログ 7 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■7786 / inTopicNo.1)  コールバック関数からコントロールの操作
  
□投稿者/ cona 二等兵(10回)-(2006/10/26(Thu) 17:39:50)

分類:[C#] 


分類:[C#] 

いつもお世話になっています。

MSDNに以下のコールバック関数を実装するサンプルがありますが、
http://msdn2.microsoft.com/ja-jp/library/843s5s5x.aspx

using System;
using System.Runtime.InteropServices;

public delegate bool CallBack(int hwnd, int lParam);

public class EnumReportApp {

[DllImport("user32")]
public static extern int EnumWindows(CallBack x, int y);

public static void Main()
{
CallBack myCallBack = new CallBack(EnumReportApp.Report);
EnumWindows(myCallBack, 0);
}

public static bool Report(int hwnd, int lParam) {
Console.Write("Window handle is ");
Console.WriteLine(hwnd);
return true;
}
}

これをフォームアプリケション上で実行するときに、
次のことを同時に実現できなくて困っています。

・EnumWindowsは別スレッドで実行すること
・コールバック関数内から、結果を逐次フォームに表示すること

1つ目は簡単にできますが、2つ目をしようとするとコールバック関数でInvokeする
必要があり、ビルドの時点で「静的でないメソッドが。。。」とエラーになります。

何かよい知恵はないものでしょうか?
宜しくお願い致します。

環境:WindowsXP VS2005Pro


0
引用返信 編集キー/
■7787 / inTopicNo.2)  Re[1]: コールバック関数からコントロールの操作
□投稿者/ ぽぴ王子 軍曹(72回)-(2006/10/26(Thu) 17:52:28)
ぽぴ王子 さんの Web サイト

分類:[C#] 

No7786に返信(conaさんの記事)

こんにちは。

なんとなく原因の見当が付きそうな感じですが、少し情報が不足していますね。
> 必要があり、ビルドの時点で「静的でないメソッドが。。。」とエラーになります。
できればこのエラーメッセージを省略せずに全部引用してみてください。

どんなメッセージが表示されているのか知っているのはconaさんだけなので、
それを省略されてしまうと答えようがなくなってしまうのです。

0
引用返信 編集キー/
■7792 / inTopicNo.3)  Re[2]: コールバック関数からコントロールの操作
□投稿者/ cona 二等兵(11回)-(2006/10/26(Thu) 20:35:31)

分類:[C#] 

ぽぴ王子さん、ありがとうございます。

実際のコードが以下で、

namespace CallbackTest
{
public partial class Form1 : Form
{
[DllImport("user32")]
private static extern int EnumWindows(CallBack x, int y);

private delegate bool CallBack(int hwnd, int lParam);
private delegate void WriteLineDelegate(string str);

public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
backgroundWorker1.RunWorkerAsync();
}

private static bool Report(int hwnd, int lParam)
{
// ビルドエラー
WriteLineDelegate dlg = new WriteLineDelegate(WriteLine);
Invoke(dlg, new object[] { "test" });
return true;
}

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
// これは成功する
WriteLineDelegate dlg = new WriteLineDelegate(WriteLine);
Invoke(dlg, new object[] { "test" });

CallBack myCallBack = new CallBack(Report);
EnumWindows(myCallBack, 0);
}

// ラベルに文字列を表示する
private void WriteLine(string str)
{
label1.Text = str;
}
}
}

ビルドエラーが以下です。
静的でないフィールド、メソッド、またはプロパティ'CallbackTest.Form1.WriteLine(string)' で、オブジェクト参照が必要です。
静的でないフィールド、メソッド、またはプロパティ 'System.Windows.Forms.Control.Invoke(System.Delegate, params object[])' で、オブジェクト参照が必要です。

オブジェクト参照というのが調べたのですが、いまいち理解できませんでした。。。


0
引用返信 編集キー/
■7793 / inTopicNo.4)  Re[3]: コールバック関数からコントロールの操作
□投稿者/ Hongliang 准尉(100回)-(2006/10/26(Thu) 21:03:48)
Hongliang さんの Web サイト

分類:[C#] 

コールバックに使うメソッドを非静的(非 static)にすれば良いだけでは?

0
引用返信 編集キー/
■7794 / inTopicNo.5)  Re[4]: コールバック関数からコントロールの操作
□投稿者/ cona 二等兵(13回)-(2006/10/26(Thu) 21:11:24)

分類:[C#] 

Hongliangさん、ありがとうございました。

見事動作しました。。。
MSDNのコピペだったんで、そのようにしなければならないと思い、
深く考えていませんでした。
失礼しました。


0
引用返信 編集キー/
■7795 / inTopicNo.6)  Re[5]: コールバック関数からコントロールの操作
□投稿者/ cona 二等兵(14回)-(2006/10/26(Thu) 21:12:39)

分類:[C#] 

解決チェックし忘れました。。すいません。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -