我对回调有疑问。
我有两种形式(VS2010)。
当''valueIN''发生变化时,我创建了一个引发事件的类。
我在我的课程中设置了一个委托,以便任何Form在更改时都可以获得它。
问题
我创建Form2对象并将回调链接到它,以便它能够得到''valueIN''。但是如果没有实例化form2对象,则运行时会告诉我没有对象的实例化。
所以我想知道我怎么知道Form2存在于我的工作站中。
这一行:SetValueINValCallback(value_received);
应该看起来像什么(在工作室中看到Form2):if(SetValINCallbackFn.exists) SetValueINValCallback(value_received);
窗体2
namespace DelegateTest
{
using Beckhoff.App.Ads.Core;
using Beckhoff.App.Ads.Core.Plc;
using TwinCAT.Ads;
using System.IO;
public delegate void DEL_SetValIN(Single value);//test event
public partial class Form1 : Form
{
IBAAdsServer _adsServer;
WorkingStation WorkStation;
public Form1()
{
InitializeComponent();
WorkingStation WorkStation = new WorkingStation(_adsServer);
}
private void btn_Frm2Open_Click(object sender, EventArgs e)
{
Form2 Form2Test = new Form2();
WorkStation.SetValueINValCallback += new DEL_SetValIN(Form2Test.SetValINCallbackFn);
Form2Test.Show();
}
}
}
namespace DelegateTest
{
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
public void SetValINCallbackFn(Single Value_received)//refresh valueIN
{
label1.Text = Value_received.ToString("F1");
}
}
}
工作站
namespace DelegateTest
{
using System;
using System.Collections.Generic;
using System.IO;
using System.Windows.Forms;//msgbox
using Beckhoff.App.Ads.Core;
using Beckhoff.App.Ads.Core.Plc;
using TwinCAT.Ads;
public class WorkingStation
{//working station class
public DEL_SetValIN SetValueINValCallback;
private static IBAAdsCncClient _cncClient;
private static IBAAdsPlcClient _plcClient;
public static List<IBAAdsNotification> _notifications;
//no need public event System.EventHandler e_RefreshValueIN;//Input value has changed
public WorkingStation(IBAAdsServer _adsServer) //constructor
{
try
{
_cncClient = _adsServer.GetAdsClient<IBAAdsCncClient>("CNC");
_plcClient = _adsServer.GetAdsClient<IBAAdsPlcClient>("PLC");
_notifications = new List<IBAAdsNotification>();
var _refreshValueIN = new OnChangeDeviceNotification("GlobalVar.PLC.valueInput", ValINHasChanged);//event handler value
_plcClient.AddPlcDeviceNotification(_refreshValueIN);
_notifications.Add(_refreshValueIN);
}
catch (Exception Except)
{ MessageBox.Show("Error init object:" + Except.Message); }
}
~WorkingStation()//destructor
{
foreach (var notify in _notifications)
{
_plcClient.RemovePlcDeviceNotification(notify);
}
}
protected virtual void ValINHasChanged(object sender, BAAdsNotificationItem notification)//get Input value
{//event method
Single value_received = 0;
try
{
value_received = _plcClient.ReadSymbol<Single>("valueInput");
SetValueINValCallback(value_received);
//no need EventHandler E_VIChange = e_RefreshValueIN;
//no need if (E_VIChange != null)
//no need E_VIChange(this, EventArgs.Empty);
}
catch (Exception except)
{
MessageBox.Show("bad event (valueIN): " + except.Message);
}
}
}
}
或者它是否存在将事件从类传递到多个表单的另一种方式?
我需要这些值来在Form2中绘制图表作为示例。
提前感谢您的帮助!
答案 0 :(得分:0)
很抱歉,因为我没有看到我正在举办活动。 如果我已经让代表订阅了这个活动,那么我不需要举办活动,我只需要订阅。 引发错误的原因是,如果您编写如下事件:
protected virtual void ValINHasChanged(object sender, BAAdsNotificationItem notification)//get Input value
{//event method
{
EventHandler E_VIChange = e_RefreshValueIN;
if (E_VIChange != null)
E_VIChange(this, EventArgs.Empty);
}
您需要拥有像
这样的订阅者subscriber += new EventHandler... and so on
你不再需要它,因为你有代表来完成工作。所以你只需要订阅委托回调即可获得你的信息。
抱歉浪费时间。
祝你好运