Re: [問題] 兩個類別間如何相互引發事件?
※ 引述《pttmimic (煩煩煩..)》之銘言:
: 推 horngsh:找本好書, 看有關Event and Delegate章節..應該會有幫助.. 08/22 18:04
: 推 dreamcryer:MSDN關於這部份的說明和範例也很足夠
謝謝各位的推文,但是我目前可以找到關於事件的部分,都是一個類別專為publiser
而另一個類別專為subscriber,這樣作起來比較沒問題,可是我二個類別都同時具有
Publisher/Subscriber的身份,並互相產生反應。
我想可能只用文字敘述可能不夠清楚,我改了一個比較簡化的程式碼,希望不要太佔版面
using System;
using System.Net;
using System.Net.Sockets;
using System.Drawing;
using System.Windows.Forms;
namespace TestProject
{
//介面類別
public class frmMain : Form
{
//定義frmStart事件
public event EventHandler onfrmStart;
private Button btnStart;
private TextBox txtDisplay;
//public frmMain()
public frmMain(SoftID IDsoft)
{
InitializeComponent();
//監聽IDsoft類別是否有在 PORT8888收到封包
IDsoft.onReceive += new ReceiveEventHandler (this.onAddNewMessage);
}
//表單元件初始化
private void InitializeComponent()
{
//使用工具產生,所以省略.......
}
private void btnStart_Click(object sender, System.EventArgs e)
{
this.btnStart.Enabled = false;
if(onfrmStart != null)
{
//丟出按下Listen button事件
onfrmStart(this,e);
}
}
//當收到IDsoft的事件時所作的處理
public void onAddNewMessage(string Message)
{
this.txtDisplay.Text += Message + "\r\n";
this.btnStart.Enabled = true;
this.Refresh();
}
}
//PORT監聽類別
public delegate void ReceiveEventHandler(string Message);
public class SoftID
{
private TcpListener x_listener;
private TcpClient x_client;
public event ReceiveEventHandler onReceive;
public SoftID(frmMain newWins)
{
//監聽frmMain是否按下"Listen button
newWins.onfrmStart += new EventHandler(this.Listen);
}
public void Listen(object sender,EventArgs e)
{
String data = "";
string txtLocalIP = Dns.GetHostByName(Dns.GetHostName()).AddressList[0].ToString();
x_listener = new TcpListener(IPAddress.Parse(txtLocalIP),8888);
try
{
x_listener.Start();
while(!x_listener.Pending())
{
x_client = x_listener.AcceptTcpClient();
//接收自客戶端的訊息
NetworkStream ns = x_client.GetStream();
Byte[] bytes = new Byte[1024];
Int32 i = ns.Read(bytes, 0, bytes.Length);
ns.Close();
x_listener.Stop();
data = System.Text.Encoding.Default.GetString(bytes, 0, i);
//丟出事件
if(onReceive != null )
{
onReceive(data);
}
}
}
catch (Exception err)
{
MessageBox.Show ("Exception:\r\n" + err.Message );
return;
}
x_listener = null;
}
}
//主類別
public class mymain
{
private static frmMain mainwin = new frmMain(IDsoft);
//private static frmMain mainwin = new frmMain();
private static SoftID IDsoft = new SoftID(mainwin);
static void Main()
{
Application.Run(mainwin);
}
}
}
我可以通過編譯,可是執行時會產生以下錯誤訊息
類型'System.NullReferenceException'的未處理例外狀況發生於TestProject
其他資訊 :並未將物件參考設為物件的執行個體
IDE並會停在frmMain 的建構式
IDsoft.onReceive += new ReceiveEventHandler(this.onAddNewMessage)
這一行
程式碼看起來很亂,不知道有沒有更好的辦法,不好意思打擾大家,感恩。
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 163.14.73.3
討論串 (同標題文章)
C_Sharp 近期熱門文章
PTT數位生活區 即時熱門文章