.NET Compact 委托与事件问题求助

陌上_桑 2019-05-30 03:53:48
当前项目的布局大概这样:

namespace Neo.ApplicationFramework.Generated
{
using System.Windows.Forms;
using System;
using System.Drawing;
using Neo.ApplicationFramework.Tools;
using Neo.ApplicationFramework.Common.Graphics.Logic;
using Neo.ApplicationFramework.Controls;
using Neo.ApplicationFramework.Interfaces;
using Neo.ApplicationFramework.Controls.Script;

public class DeviceInfo
{
public float[] wrSV_float = new float[3];
public int[] wrSV_int = new int[4];
public string[] wrPW = new string[3];
public bool[] wBTN = new bool[3];

public float[] rCV_float = new float[5];
public int[] rCV_int = new int[4];
public bool[] rLP = new bool[3];
public bool[] rSIG = new bool[2];

public int exe()
{
int exeStp = 0;
int[] bool2int = {0,0};
bool[] sig = this.rSIG;
bool2int[0] = Convert.ToInt16(sig[0]);
bool2int[1] = Convert.ToInt16(sig[1]);
exeStp |= bool2int[0];
exeStp |= (bool2int[1]<<1);
return exeStp;
}
public string[] TextDisplay ()
{
string[] rslt = {"",""};
int exe = this.exe();
switch(exe)
{
case 0:
rslt[0] = "设备当前处于空闲状态。";
rslt[1] = "Idle";
break;
case 1:
rslt[0] = "设备当前正在进行刷炉后排空气操作。";
rslt[1] = "Post-purge";
break;
case 2:
rslt[0] = "设备当前正在进行第"+this.rCV_int[0]+"次刷炉……";
rslt[1] = "Brushing";
break;
case 3:
rslt[0] = "设备当前正在进行刷炉前排空气操作。";
rslt[1] = "Pre-purge";
break;
default:
rslt[0] = "设备当前处于空闲状态。\n当前正处于离线模拟状态。";
rslt[1] = "Idle";
break;
}
return rslt;
}

public string[] storeinfo()
{
string[] info = new string[8];
int cur_Node = Globals.Tags.addr_node.Value;
info[0] = "# 8" + cur_Node.ToString("D2");
info[1] = DateTime.Now.ToString("yy.MM.dd@HH:mm:ss.ff");
info[2] = this.TextDisplay()[1];
info[3] = this.rCV_float[0].ToString("F3") + " psi";
info[4] = this.rCV_float[1].ToString("F3") + " psi";
info[5] = this.rCV_float[2] + " l/min";
info[6] = this.rCV_float[3] + " l/min";
info[7] = this.rCV_float[4].ToString("F3") + " dB";
return info;
}
}

public partial class UserModule
{
//用户自定义脚本区
public DeviceInfo DvInfo = new DeviceInfo();
public void DataSave()
{
}

}

//界面1
public partial class bgScr
{
//界面bgScr代码区
void bgScr_Opened(System.Object sender, System.EventArgs e)
{
//界面打开时执行代码
}

void btn_DeviceStatus_Click(System.Object sender, System.EventArgs e)
{
//其中一个按钮的Click事件代码
}
}
//界面2
public partial class tempdsScr
{
//界面tempdsScr代码

private Timer t;
int rt1 = 176, rt2 = 31;
bool CycFlag = false;
int CycCnt = 0;
public void StartTimer()
{
t = new Timer();
t.Enabled = true;
t.Interval = Globals.Tags.refreshCT.Value;
t.Tick += myTick;
}
public void myTick(object obj,EventArgs ea)
{

if(!Globals.Tags.flag_LoginOpen.Value)
{

Globals.UserModule.DataRead(rt1,rt2);
disp_Pressure.Value = Globals.UserModule.DvInfo.rCV_float[1];
disp_Flow1.Value = Globals.UserModule.DvInfo.rCV_float[2];
disp_Flow2.Value = Globals.UserModule.DvInfo.rCV_float[3];
disp_Sound.Value = Globals.UserModule.DvInfo.rCV_float[4];

ExeInd.Text = Globals.UserModule.DvInfo.TextDisplay()[0];
ColorChange(ExeInd.Text);
}
}

void tempdsScr_Opened(System.Object sender, System.EventArgs e)
{
//界面temdsScr打开时执行代码
disp_Pressure.Prefix = "当前气压:";//disp_前缀表示界面上的AnalogNumeric控件,这里只是修改了名称
disp_Pressure.Suffix = " psi";
disp_Flow1.Prefix = "主管道流量:";
disp_Flow1.Suffix = " l/min";
disp_Flow2.Prefix = "支管道流量:";
disp_Flow2.Suffix = " l/min";
disp_Sound.Prefix = "汽笛声强:";
disp_Sound.Suffix = " dB";

StartTimer();
}
}
}


这是大概的程序框架
现在想在公共部分或者在bgScr的代码区引用tempdsScr里的控件,想用委托跟事件实现,该怎么处理?

比方说,我想把定时扫描放到bgsScr,然后执行数值更新模块:

Globals.UserModule.DataRead(rt1,rt2);
disp_Pressure.Value = Globals.UserModule.DvInfo.rCV_float[1];
disp_Flow1.Value = Globals.UserModule.DvInfo.rCV_float[2];
disp_Flow2.Value = Globals.UserModule.DvInfo.rCV_float[3];
disp_Sound.Value = Globals.UserModule.DvInfo.rCV_float[4];

ExeInd.Text = Globals.UserModule.DvInfo.TextDisplay()[0];
ColorChange(ExeInd.Text);


这里要注意的是但凡是界面,系统提醒的是"public static IScreenAdapterx"下的,但凡是控件,比方说AnalogNumeric,系统提示的是"protected Neo.ApplicationFramework.Controls.Script.AnalogNumericCEAdapter"。

请问有大神知道如何操作吗?
急等。望大神们踊跃参加讨论。
...全文
579 22 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
陌上_桑 2019-06-04
  • 打赏
  • 举报
回复
引用 21 楼 jx315425246 的回复:
[quote=引用 20 楼 陌上_桑 的回复:] [quote=引用 18 楼 jx315425246 的回复:] 只要调用一次就可以,在你每次tempdsScr控件数据更新时执行 //取值并产生委托事件 MyAge myage=new myage(); myage.PressureValue = Globals.UserModule.DvInfo.rCV_float[1]; myage.Flow1Value = Globals.UserModule.DvInfo.rCV_float[2]; myage.Flow2Value = Globals.UserModule.DvInfo.rCV_float[3]; myage.SoundValue = Globals.UserModule.DvInfo.rCV_float[4]; myage.ExeIndText = Globals.UserModule.DvInfo.rCV_float[4]; SendData.SetValue(myage); //实时传送数据 数据实时传送到 private void 函数名(MyAge e) { //e是传送过来的值 //处理取回的值 本界上的控件.Text=e.PressureValue; }
我做了个简单的测试,但是测试不通过:

namespace Neo.ApplicationFramework.Generated
{
    using System.Windows.Forms;
    using System;
    using System.Drawing;
    using Neo.ApplicationFramework.Tools;
    using Neo.ApplicationFramework.Common.Graphics.Logic;
    using Neo.ApplicationFramework.Controls;
    using Neo.ApplicationFramework.Interfaces;
    
	public class Demo
	{
		public float pressure,flow1,flow2,sound;
		public string ind_exe;
	}	
	
	public static class SendData
	{
		public delegate void SendValueHandle(Demo e);
		public static event SendValueHandle SndV;
		
		public static void SetV(Demo e)
		{
			SndV(e);
		}
	}	
    
    public partial class UserScript
    {
		
    }
public partial class bgScr
    { 
		
		
		private Timer bgrfsTmr;
		Demo bgds = new Demo();
		public void bgs()
		{
			bgrfsTmr = new Timer();
			bgrfsTmr.Enabled = true;
			bgrfsTmr.Interval = 50;
			bgrfsTmr.Tick += bgRfs;
		}
		
		public void bgRfs(object obj,EventArgs e)
		{
			bgds.pressure = 1.0f;
			bgds.flow1 = 2.0f;
			bgds.flow2 = 3.0f;
			bgds.sound = 4.0f;
			bgds.ind_exe = "这是一个测试";
			
		}
		
		void bgScr_Opened(System.Object sender, System.EventArgs e)
		{
			bgs();
		}
		
		
    }
public partial class DvStsScr
    {
		
		void DvStsScr_Opened(System.Object sender, System.EventArgs e)
		{
			SendData.SndV += new SendData.SendValueHandle(dsCtrl);
		}
		
		private void dsCtrl(Demo e)
		{
			AN_dp1.Value = e.pressure;
			AN_dp2.Value = e.flow1;
			AN_dp3.Value = e.flow2;
			AN_dp4.Value = e.sound;
			T_dp1.Text = e.ind_exe;
		}
    }
}
编译时通过的,但不知为何界面显示不成功,字符串无显示,数值都显示时0[/quote] 你的委托引用在哪里? 你的事件在哪里? 我的QQ:315425246,有半个小时的时间[/quote] 知道问题出那儿了,多谢!
jx315425246 2019-06-03
  • 打赏
  • 举报
回复
只要调用一次就可以,在你每次tempdsScr控件数据更新时执行

//取值并产生委托事件
MyAge myage=new myage();
myage.PressureValue = Globals.UserModule.DvInfo.rCV_float[1];
myage.Flow1Value = Globals.UserModule.DvInfo.rCV_float[2];
myage.Flow2Value = Globals.UserModule.DvInfo.rCV_float[3];
myage.SoundValue = Globals.UserModule.DvInfo.rCV_float[4];
myage.ExeIndText = Globals.UserModule.DvInfo.rCV_float[4];
SendData.SetValue(myage); //实时传送数据
数据实时传送到
private void 函数名(MyAge e)
{
//e是传送过来的值
//处理取回的值
本界上的控件.Text=e.PressureValue;
}
陌上_桑 2019-06-03
  • 打赏
  • 举报
回复
引用 3 楼 jx315425246 的回复:
把 public static class SendData { public delegate void SendValueHandle(MyAge e); public static event SendValueHandle SendValue; public static void SetValue(MyAge e) { SendValue(e); } } 别外写一个类,不要写在 那你在 bgScr的读数据中加入 //取值并产生委托事件 MyAge myage=new myage(); myage.PressureValue = Globals.UserModule.DvInfo.rCV_float[1]; myage.Flow1Value = Globals.UserModule.DvInfo.rCV_float[2]; myage.Flow2Value = Globals.UserModule.DvInfo.rCV_float[3]; myage.SoundValue = Globals.UserModule.DvInfo.rCV_float[4]; myage.ExeIndText = Globals.UserModule.DvInfo.rCV_float[4]; SendData.SetValue(myage); 在你需要数据的类中,初始化时 加 SendData.SendValue+=new SendData.SendValueHandle(函数名); 相当于只要有参数社取出,就发生“函数名”这个事件 private void 函数名(MyAge e) { //e是传送过来的值 //处理取回的值 本界上的控件.Text=e.PressureValue; } 要是再不理解,重头看C#委托
问题是,我需要数据一直更新,初始化时添加事件,是不是只能在初始化时调用一次?后台bgScr更新数据时,tempdsScr的控件数据没法实时更新? 确实不是很理解,委托、事件、Invoke、Lambda都不是很理解
jx315425246 2019-06-03
  • 打赏
  • 举报
回复
引用 20 楼 陌上_桑 的回复:
[quote=引用 18 楼 jx315425246 的回复:]
只要调用一次就可以,在你每次tempdsScr控件数据更新时执行

//取值并产生委托事件
MyAge myage=new myage();
myage.PressureValue = Globals.UserModule.DvInfo.rCV_float[1];
myage.Flow1Value = Globals.UserModule.DvInfo.rCV_float[2];
myage.Flow2Value = Globals.UserModule.DvInfo.rCV_float[3];
myage.SoundValue = Globals.UserModule.DvInfo.rCV_float[4];
myage.ExeIndText = Globals.UserModule.DvInfo.rCV_float[4];
SendData.SetValue(myage); //实时传送数据
数据实时传送到
private void 函数名(MyAge e)
{
//e是传送过来的值
//处理取回的值
本界上的控件.Text=e.PressureValue;
}

我做了个简单的测试,但是测试不通过:

namespace Neo.ApplicationFramework.Generated
{
using System.Windows.Forms;
using System;
using System.Drawing;
using Neo.ApplicationFramework.Tools;
using Neo.ApplicationFramework.Common.Graphics.Logic;
using Neo.ApplicationFramework.Controls;
using Neo.ApplicationFramework.Interfaces;

public class Demo
{
public float pressure,flow1,flow2,sound;
public string ind_exe;
}

public static class SendData
{
public delegate void SendValueHandle(Demo e);
public static event SendValueHandle SndV;

public static void SetV(Demo e)
{
SndV(e);
}
}

public partial class UserScript
{

}
public partial class bgScr
{


private Timer bgrfsTmr;
Demo bgds = new Demo();
public void bgs()
{
bgrfsTmr = new Timer();
bgrfsTmr.Enabled = true;
bgrfsTmr.Interval = 50;
bgrfsTmr.Tick += bgRfs;
}

public void bgRfs(object obj,EventArgs e)
{
bgds.pressure = 1.0f;
bgds.flow1 = 2.0f;
bgds.flow2 = 3.0f;
bgds.sound = 4.0f;
bgds.ind_exe = "这是一个测试";

}

void bgScr_Opened(System.Object sender, System.EventArgs e)
{
bgs();
}


}
public partial class DvStsScr
{

void DvStsScr_Opened(System.Object sender, System.EventArgs e)
{
SendData.SndV += new SendData.SendValueHandle(dsCtrl);
}

private void dsCtrl(Demo e)
{
AN_dp1.Value = e.pressure;
AN_dp2.Value = e.flow1;
AN_dp3.Value = e.flow2;
AN_dp4.Value = e.sound;
T_dp1.Text = e.ind_exe;
}
}
}

编译时通过的,但不知为何界面显示不成功,字符串无显示,数值都显示时0[/quote]

你的委托引用在哪里?
你的事件在哪里?

我的QQ:315425246,有半个小时的时间
陌上_桑 2019-06-03
  • 打赏
  • 举报
回复
引用 18 楼 jx315425246 的回复:
只要调用一次就可以,在你每次tempdsScr控件数据更新时执行 //取值并产生委托事件 MyAge myage=new myage(); myage.PressureValue = Globals.UserModule.DvInfo.rCV_float[1]; myage.Flow1Value = Globals.UserModule.DvInfo.rCV_float[2]; myage.Flow2Value = Globals.UserModule.DvInfo.rCV_float[3]; myage.SoundValue = Globals.UserModule.DvInfo.rCV_float[4]; myage.ExeIndText = Globals.UserModule.DvInfo.rCV_float[4]; SendData.SetValue(myage); //实时传送数据 数据实时传送到 private void 函数名(MyAge e) { //e是传送过来的值 //处理取回的值 本界上的控件.Text=e.PressureValue; }
我做了个简单的测试,但是测试不通过:

namespace Neo.ApplicationFramework.Generated
{
    using System.Windows.Forms;
    using System;
    using System.Drawing;
    using Neo.ApplicationFramework.Tools;
    using Neo.ApplicationFramework.Common.Graphics.Logic;
    using Neo.ApplicationFramework.Controls;
    using Neo.ApplicationFramework.Interfaces;
    
	public class Demo
	{
		public float pressure,flow1,flow2,sound;
		public string ind_exe;
	}	
	
	public static class SendData
	{
		public delegate void SendValueHandle(Demo e);
		public static event SendValueHandle SndV;
		
		public static void SetV(Demo e)
		{
			SndV(e);
		}
	}	
    
    public partial class UserScript
    {
		
    }
public partial class bgScr
    { 
		
		
		private Timer bgrfsTmr;
		Demo bgds = new Demo();
		public void bgs()
		{
			bgrfsTmr = new Timer();
			bgrfsTmr.Enabled = true;
			bgrfsTmr.Interval = 50;
			bgrfsTmr.Tick += bgRfs;
		}
		
		public void bgRfs(object obj,EventArgs e)
		{
			bgds.pressure = 1.0f;
			bgds.flow1 = 2.0f;
			bgds.flow2 = 3.0f;
			bgds.sound = 4.0f;
			bgds.ind_exe = "这是一个测试";
			
		}
		
		void bgScr_Opened(System.Object sender, System.EventArgs e)
		{
			bgs();
		}
		
		
    }
public partial class DvStsScr
    {
		
		void DvStsScr_Opened(System.Object sender, System.EventArgs e)
		{
			SendData.SndV += new SendData.SendValueHandle(dsCtrl);
		}
		
		private void dsCtrl(Demo e)
		{
			AN_dp1.Value = e.pressure;
			AN_dp2.Value = e.flow1;
			AN_dp3.Value = e.flow2;
			AN_dp4.Value = e.sound;
			T_dp1.Text = e.ind_exe;
		}
    }
}
编译时通过的,但不知为何界面显示不成功,字符串无显示,数值都显示时0
陌上_桑 2019-06-03
  • 打赏
  • 举报
回复
引用 14 楼 jx315425246 的回复:
把 public static class SendData { public delegate void SendValueHandle(MyAge e); public static event SendValueHandle SendValue; public static void SetValue(MyAge e) { SendValue(e); } } 别外写一个类,不要写在 那你在 bgScr的读数据中加入 //取值并产生委托事件 MyAge myage=new myage(); myage.PressureValue = Globals.UserModule.DvInfo.rCV_float[1]; myage.Flow1Value = Globals.UserModule.DvInfo.rCV_float[2]; myage.Flow2Value = Globals.UserModule.DvInfo.rCV_float[3]; myage.SoundValue = Globals.UserModule.DvInfo.rCV_float[4]; myage.ExeIndText = Globals.UserModule.DvInfo.rCV_float[4]; SendData.SetValue(myage); 在你需要数据的类中,初始化时 加 SendData.SendValue+=new SendData.SendValueHandle(函数名); 相当于只要有参数社取出,就发生“函数名”这个事件 private void 函数名(MyAge e) { //e是传送过来的值 //处理取回的值 本界上的控件.Text=e.PressureValue; } 要是再不理解,重头看C#委托
引用 18 楼 jx315425246 的回复:
只要调用一次就可以,在你每次tempdsScr控件数据更新时执行 //取值并产生委托事件 MyAge myage=new myage(); myage.PressureValue = Globals.UserModule.DvInfo.rCV_float[1]; myage.Flow1Value = Globals.UserModule.DvInfo.rCV_float[2]; myage.Flow2Value = Globals.UserModule.DvInfo.rCV_float[3]; myage.SoundValue = Globals.UserModule.DvInfo.rCV_float[4]; myage.ExeIndText = Globals.UserModule.DvInfo.rCV_float[4]; SendData.SetValue(myage); //实时传送数据 数据实时传送到 private void 函数名(MyAge e) { //e是传送过来的值 //处理取回的值 本界上的控件.Text=e.PressureValue; }
照你这样定义了,在需要更新数据的地方选择 e, 但可操作的只有Equals、GetHashCode、GetTye、ToString选项,然后引用e.PressureValue编译提示不可访问,因为它受到保护级别限制。
陌上_桑 2019-06-01
  • 打赏
  • 举报
回复
引用 13 楼 OrdinaryCoder 的回复:
public static DataUpdateMonitor Monitor { get; }这是一个属性 可以理解为DataUpdateMonitor 的静态对象 你程序报错我猜你用的应该是VS2017以前的版本 我记得C#7.0才加入给属性赋初始值 Monitor { get; } = new DataUpdateMonitor();这块我图方便直接复制的 实际就是new出一个DataUpdateMonitor这个类的静态单例 可以改成

private static DataUpdateMonitor intance;
private static object obj =new object();
private DataUpdateMonitor()
{

}
public DataUpdateMonitor GetIntance()
{
if(intance == null)
{
lock(obj)
{
if(intance == null)
{
intance =new DataUpdateMonitor();
}
}
}
return intance;
}
使用DataUpdateMonitor这个类对象的时候 DataUpdateMonitor.GetIntance();这样就可以
是WinCE上的.NET Compact,具体版本不知道怎么查
陌上_桑 2019-06-01
  • 打赏
  • 举报
回复
我的大概意思是这个,大神们看看,能否达到此要求?如何做?
jx315425246 2019-05-31
  • 打赏
  • 举报
回复
引用 4 楼 陌上_桑 的回复:
[quote=引用 3 楼 jx315425246 的回复:]
注意静态类: SendData,与参数类:MyAge


public class DeviceInfo
{
public float[] wrSV_float = new float[3];
public int[] wrSV_int = new int[4];
public string[] wrPW = new string[3];
public bool[] wBTN = new bool[3];

public float[] rCV_float = new float[5];
public int[] rCV_int = new int[4];
public bool[] rLP = new bool[3];
public bool[] rSIG = new bool[2];

public int exe()
{
int exeStp = 0;
int[] bool2int = { 0, 0 };
bool[] sig = this.rSIG;
bool2int[0] = Convert.ToInt16(sig[0]);
bool2int[1] = Convert.ToInt16(sig[1]);
exeStp |= bool2int[0];
exeStp |= (bool2int[1] << 1);
return exeStp;
}
public string[] TextDisplay()
{
string[] rslt = { "", "" };
int exe = this.exe();
switch (exe)
{
case 0:
rslt[0] = "设备当前处于空闲状态。";
rslt[1] = "Idle";
break;
case 1:
rslt[0] = "设备当前正在进行刷炉后排空气操作。";
rslt[1] = "Post-purge";
break;
case 2:
rslt[0] = "设备当前正在进行第" + this.rCV_int[0] + "次刷炉……";
rslt[1] = "Brushing";
break;
case 3:
rslt[0] = "设备当前正在进行刷炉前排空气操作。";
rslt[1] = "Pre-purge";
break;
default:
rslt[0] = "设备当前处于空闲状态。\n当前正处于离线模拟状态。";
rslt[1] = "Idle";
break;
}
return rslt;
}

public string[] storeinfo()
{
string[] info = new string[8];
int cur_Node = Globals.Tags.addr_node.Value;
info[0] = "# 8" + cur_Node.ToString("D2");
info[1] = DateTime.Now.ToString("yy.MM.dd@HH:mm:ss.ff");
info[2] = this.TextDisplay()[1];
info[3] = this.rCV_float[0].ToString("F3") + " psi";
info[4] = this.rCV_float[1].ToString("F3") + " psi";
info[5] = this.rCV_float[2] + " l/min";
info[6] = this.rCV_float[3] + " l/min";
info[7] = this.rCV_float[4].ToString("F3") + " dB";
return info;
}
}

public partial class UserModule
{
//用户自定义脚本区
public DeviceInfo DvInfo = new DeviceInfo();
public void DataSave()
{
}

}

//参数传递类,根据实际情况写
public class MyAge
{
public string PressureValue;
public string Flow1Value;
public string Flow2Value;
public string SoundValue;
public string ExeIndText;
}

//取数据静态类
public static class SendData
{

public delegate void SendValueHandle(MyAge e);
public static event SendValueHandle SendValue;

public static void SetValue(MyAge e)
{
SendValue(e);
}
}

//界面1
public partial class bgScr
{
//界面bgScr代码区
void bgScr_Opened(System.Object sender, System.EventArgs e)
{
//界面打开时执行代码

SendData.SendValue+=new SendData.SendValueHandle(SendData_SendValue);
}

void btn_DeviceStatus_Click(System.Object sender, System.EventArgs e)
{
//其中一个按钮的Click事件代码
}

private void SendData_SendValue(MyAge e)
{
//处理取回的值
}
}
//界面2
public partial class tempdsScr
{
//界面tempdsScr代码

private Timer t;
int rt1 = 176, rt2 = 31;
bool CycFlag = false;
int CycCnt = 0;
public void StartTimer()
{
t = new Timer();
t.Enabled = true;
t.Interval = Globals.Tags.refreshCT.Value;
t.Tick += myTick;
}
public void myTick(object obj, EventArgs ea)
{
MyAge myage = new MyAge();

if (!Globals.Tags.flag_LoginOpen.Value)
{

Globals.UserModule.DataRead(rt1, rt2);
disp_Pressure.Value = Globals.UserModule.DvInfo.rCV_float[1];
disp_Flow1.Value = Globals.UserModule.DvInfo.rCV_float[2];
disp_Flow2.Value = Globals.UserModule.DvInfo.rCV_float[3];
disp_Sound.Value = Globals.UserModule.DvInfo.rCV_float[4];

ExeInd.Text = Globals.UserModule.DvInfo.TextDisplay()[0];

//取值并产生委托事件
myage.PressureValue = Globals.UserModule.DvInfo.rCV_float[1];
myage.Flow1Value = Globals.UserModule.DvInfo.rCV_float[2];
myage.Flow2Value = Globals.UserModule.DvInfo.rCV_float[3];
myage.SoundValue = Globals.UserModule.DvInfo.rCV_float[4];
myage.ExeIndText = Globals.UserModule.DvInfo.rCV_float[4];
SendData.SetValue(myage);

ColorChange(ExeInd.Text);


}
}

void tempdsScr_Opened(System.Object sender, System.EventArgs e)
{
//界面temdsScr打开时执行代码
disp_Pressure.Prefix = "当前气压:";//disp_前缀表示界面上的AnalogNumeric控件,这里只是修改了名称
disp_Pressure.Suffix = " psi";
disp_Flow1.Prefix = "主管道流量:";
disp_Flow1.Suffix = " l/min";
disp_Flow2.Prefix = "支管道流量:";
disp_Flow2.Suffix = " l/min";
disp_Sound.Prefix = "汽笛声强:";
disp_Sound.Suffix = " dB";

StartTimer();
}
}


多谢大师帮忙。
我的意思是:

Globals.UserModule.DataRead(rt1, rt2);

这个代码会在bgScr(background Screen)里面以bgScr内StartTime()的方式周期执行,bgScr的StartTime()除了执行DataRead,同样会在区分当前界面的前提下,选择激活不同事件。比方说这里的:

disp_Pressure.Value = Globals.UserModule.DvInfo.rCV_float[1];
disp_Flow1.Value = Globals.UserModule.DvInfo.rCV_float[2];
disp_Flow2.Value = Globals.UserModule.DvInfo.rCV_float[3];
disp_Sound.Value = Globals.UserModule.DvInfo.rCV_float[4];

ExeInd.Text = Globals.UserModule.DvInfo.TextDisplay()[0];
ColorChange(ExeInd.Text);

如果是其他的界面会有其他的控件数值更新需要激活。
我没有看懂你这事件与委托的目的,但应该没达到我的要求。不过我技术不是很好,不知道理解的对不对。
是把DataRead后的值,传递给public static界面的protected控件。不知道这样表达会不会好的?[/quote]

tempdsScr 的public void myTick(object obj, EventArgs ea) 读取值后,在bgScr的 private void SendData_SendValue(MyAge e)输出值,bgScr里不用加StartTime()的方式周期执行,你试一下,已满足你的要求
陌上_桑 2019-05-31
  • 打赏
  • 举报
回复
引用 2 楼 bloodish 的回复:
随手写的,自己理解吧

public class DataUpdateEventArgs:EventArgs
    {
        public object Source { get; set; }
        public object Data { get; set; }
    }

    public sealed class DataUpdateMonitor
    {
        private DataUpdateMonitor() { }

        public event EventHandler<DataUpdateEventArgs> DataUpdated;

        public void UpdateData(object src, object data)
        {
            DataUpdated?.Invoke(this, new DataUpdateEventArgs() { Source = src, Data = data });
        }

        public static DataUpdateMonitor Monitor { get; } = new DataUpdateMonitor();
        
    }
    

    public class dgSrc
    {
        public dgSrc()
        {
            DataUpdateMonitor.Monitor.DataUpdated += OnDgSrcDataUpdated;
        }

        private void OnDgSrcDataUpdated(object sender, DataUpdateEventArgs e)
        {
            //tod
        }

        public void UpdateData(object data) => DataUpdateMonitor.Monitor.UpdateData(this, data);
    }

    public class tempdsScr
    {
        public tempdsScr()
        {
            DataUpdateMonitor.Monitor.DataUpdated += Monitor_DataUpdated;

        }

        private void Monitor_DataUpdated(object sender, DataUpdateEventArgs e)
        {
            //todo
        }

        public void UpdateData(object data) => DataUpdateMonitor.Monitor.UpdateData(this, data);
    }
public dgSrc()
报错方法必须具有返回类型
public void UpdateData(object data) => DataUpdateMonitor.Monitor.UpdateData(this,data);
报错应输入;??? 类、结构或接口成员申明中的标记")"无效 类、结构或接口成员申明中的标记"="无效
陌上_桑 2019-05-31
  • 打赏
  • 举报
回复
引用 7 楼 OrdinaryCoder 的回复:
public static DataUpdateMonitor Monitor { get; }这是个属性 本质上是个方法 好像C#7.0支持属性初始化 但是这么用好像还是有点问题吧 所以把 Monitor { get; } = new DataUpdateMonitor();放到构造里去初始化 或者用这个属性对应的字段
啥意思?没懂,放哪个构造里?
OrdinaryCoder 2019-05-31
  • 打赏
  • 举报
回复
public static DataUpdateMonitor Monitor { get; }这是个属性 本质上是个方法 好像C#7.0支持属性初始化 但是这么用好像还是有点问题吧 所以把
Monitor { get; } = new DataUpdateMonitor();放到构造里去初始化 或者用这个属性对应的字段
陌上_桑 2019-05-31
  • 打赏
  • 举报
回复
引用 2 楼 bloodish 的回复:
随手写的,自己理解吧

public class DataUpdateEventArgs:EventArgs
    {
        public object Source { get; set; }
        public object Data { get; set; }
    }

    public sealed class DataUpdateMonitor
    {
        private DataUpdateMonitor() { }

        public event EventHandler<DataUpdateEventArgs> DataUpdated;

        public void UpdateData(object src, object data)
        {
            DataUpdated?.Invoke(this, new DataUpdateEventArgs() { Source = src, Data = data });
        }

        public static DataUpdateMonitor Monitor { get; } = new DataUpdateMonitor();
        
    }
    

    public class dgSrc
    {
        public dgSrc()
        {
            DataUpdateMonitor.Monitor.DataUpdated += OnDgSrcDataUpdated;
        }

        private void OnDgSrcDataUpdated(object sender, DataUpdateEventArgs e)
        {
            //tod
        }

        public void UpdateData(object data) => DataUpdateMonitor.Monitor.UpdateData(this, data);
    }

    public class tempdsScr
    {
        public tempdsScr()
        {
            DataUpdateMonitor.Monitor.DataUpdated += Monitor_DataUpdated;

        }

        private void Monitor_DataUpdated(object sender, DataUpdateEventArgs e)
        {
            //todo
        }

        public void UpdateData(object data) => DataUpdateMonitor.Monitor.UpdateData(this, data);
    }

public static DataUpdateMonitor Monitor { get; } = new DataUpdateMonitor();
提示“类、结构或接口成员声明中的标记"="无效”
陌上_桑 2019-05-31
  • 打赏
  • 举报
回复
引用 2 楼 bloodish 的回复:
随手写的,自己理解吧

public class DataUpdateEventArgs:EventArgs
    {
        public object Source { get; set; }
        public object Data { get; set; }
    }

    public sealed class DataUpdateMonitor
    {
        private DataUpdateMonitor() { }

        public event EventHandler<DataUpdateEventArgs> DataUpdated;

        public void UpdateData(object src, object data)
        {
            DataUpdated?.Invoke(this, new DataUpdateEventArgs() { Source = src, Data = data });
        }

        public static DataUpdateMonitor Monitor { get; } = new DataUpdateMonitor();
        
    }
    

    public class dgSrc
    {
        public dgSrc()
        {
            DataUpdateMonitor.Monitor.DataUpdated += OnDgSrcDataUpdated;
        }

        private void OnDgSrcDataUpdated(object sender, DataUpdateEventArgs e)
        {
            //tod
        }

        public void UpdateData(object data) => DataUpdateMonitor.Monitor.UpdateData(this, data);
    }

    public class tempdsScr
    {
        public tempdsScr()
        {
            DataUpdateMonitor.Monitor.DataUpdated += Monitor_DataUpdated;

        }

        private void Monitor_DataUpdated(object sender, DataUpdateEventArgs e)
        {
            //todo
        }

        public void UpdateData(object data) => DataUpdateMonitor.Monitor.UpdateData(this, data);
    }
还在消化, 说实话,很吃力,没看懂还。
陌上_桑 2019-05-31
  • 打赏
  • 举报
回复
引用 3 楼 jx315425246 的回复:
注意静态类: SendData,与参数类:MyAge

public class DeviceInfo
        {
            public float[] wrSV_float = new float[3];
            public int[] wrSV_int = new int[4];
            public string[] wrPW = new string[3];
            public bool[] wBTN = new bool[3];

            public float[] rCV_float = new float[5];
            public int[] rCV_int = new int[4];
            public bool[] rLP = new bool[3];
            public bool[] rSIG = new bool[2];

            public int exe()
            {
                int exeStp = 0;
                int[] bool2int = { 0, 0 };
                bool[] sig = this.rSIG;
                bool2int[0] = Convert.ToInt16(sig[0]);
                bool2int[1] = Convert.ToInt16(sig[1]);
                exeStp |= bool2int[0];
                exeStp |= (bool2int[1] << 1);
                return exeStp;
            }
            public string[] TextDisplay()
            {
                string[] rslt = { "", "" };
                int exe = this.exe();
                switch (exe)
                {
                    case 0:
                        rslt[0] = "设备当前处于空闲状态。";
                        rslt[1] = "Idle";
                        break;
                    case 1:
                        rslt[0] = "设备当前正在进行刷炉后排空气操作。";
                        rslt[1] = "Post-purge";
                        break;
                    case 2:
                        rslt[0] = "设备当前正在进行第" + this.rCV_int[0] + "次刷炉……";
                        rslt[1] = "Brushing";
                        break;
                    case 3:
                        rslt[0] = "设备当前正在进行刷炉前排空气操作。";
                        rslt[1] = "Pre-purge";
                        break;
                    default:
                        rslt[0] = "设备当前处于空闲状态。\n当前正处于离线模拟状态。";
                        rslt[1] = "Idle";
                        break;
                }
                return rslt;
            }

            public string[] storeinfo()
            {
                string[] info = new string[8];
                int cur_Node = Globals.Tags.addr_node.Value;
                info[0] = "# 8" + cur_Node.ToString("D2");
                info[1] = DateTime.Now.ToString("yy.MM.dd@HH:mm:ss.ff");
                info[2] = this.TextDisplay()[1];
                info[3] = this.rCV_float[0].ToString("F3") + " psi";
                info[4] = this.rCV_float[1].ToString("F3") + " psi";
                info[5] = this.rCV_float[2] + " l/min";
                info[6] = this.rCV_float[3] + " l/min";
                info[7] = this.rCV_float[4].ToString("F3") + " dB";
                return info;
            }
        }

        public partial class UserModule
        {
            //用户自定义脚本区
            public DeviceInfo DvInfo = new DeviceInfo();
            public void DataSave()
            {
            }

        }

        //参数传递类,根据实际情况写
        public class MyAge
        {
            public string PressureValue;
            public string Flow1Value;
            public string Flow2Value;
            public string SoundValue;
            public string ExeIndText;
        }

        //取数据静态类
        public static class SendData
        {
            
            public delegate void SendValueHandle(MyAge e);
            public static event SendValueHandle SendValue;

            public static void SetValue(MyAge e)
            {
                SendValue(e);
            }
        }

        //界面1
        public partial class bgScr
        {
            //界面bgScr代码区
            void bgScr_Opened(System.Object sender, System.EventArgs e)
            {
                //界面打开时执行代码
                
                SendData.SendValue+=new SendData.SendValueHandle(SendData_SendValue);
            }

            void btn_DeviceStatus_Click(System.Object sender, System.EventArgs e)
            {
                //其中一个按钮的Click事件代码
            }

            private void SendData_SendValue(MyAge e)
            {
                //处理取回的值
            }
        }
        //界面2
        public partial class tempdsScr
        {
            //界面tempdsScr代码

            private Timer t;
            int rt1 = 176, rt2 = 31;
            bool CycFlag = false;
            int CycCnt = 0;
            public void StartTimer()
            {
                t = new Timer();
                t.Enabled = true;
                t.Interval = Globals.Tags.refreshCT.Value;
                t.Tick += myTick;
            }
            public void myTick(object obj, EventArgs ea)
            {
                MyAge myage = new MyAge();
                
                if (!Globals.Tags.flag_LoginOpen.Value)
                {

                    Globals.UserModule.DataRead(rt1, rt2);
                    disp_Pressure.Value = Globals.UserModule.DvInfo.rCV_float[1];
                    disp_Flow1.Value = Globals.UserModule.DvInfo.rCV_float[2];
                    disp_Flow2.Value = Globals.UserModule.DvInfo.rCV_float[3];
                    disp_Sound.Value = Globals.UserModule.DvInfo.rCV_float[4];

                    ExeInd.Text = Globals.UserModule.DvInfo.TextDisplay()[0];

                    //取值并产生委托事件
                    myage.PressureValue = Globals.UserModule.DvInfo.rCV_float[1];
                    myage.Flow1Value = Globals.UserModule.DvInfo.rCV_float[2];
                    myage.Flow2Value = Globals.UserModule.DvInfo.rCV_float[3];
                    myage.SoundValue = Globals.UserModule.DvInfo.rCV_float[4];
                    myage.ExeIndText = Globals.UserModule.DvInfo.rCV_float[4];
                    SendData.SetValue(myage);

                    ColorChange(ExeInd.Text);

                    
                }
            }

            void tempdsScr_Opened(System.Object sender, System.EventArgs e)
            {
                //界面temdsScr打开时执行代码
                disp_Pressure.Prefix = "当前气压:";//disp_前缀表示界面上的AnalogNumeric控件,这里只是修改了名称
                disp_Pressure.Suffix = " psi";
                disp_Flow1.Prefix = "主管道流量:";
                disp_Flow1.Suffix = " l/min";
                disp_Flow2.Prefix = "支管道流量:";
                disp_Flow2.Suffix = " l/min";
                disp_Sound.Prefix = "汽笛声强:";
                disp_Sound.Suffix = " dB";

                StartTimer();
            }
        }
多谢大师帮忙。 我的意思是:

Globals.UserModule.DataRead(rt1, rt2);
这个代码会在bgScr(background Screen)里面以bgScr内StartTime()的方式周期执行,bgScr的StartTime()除了执行DataRead,同样会在区分当前界面的前提下,选择激活不同事件。比方说这里的:

disp_Pressure.Value = Globals.UserModule.DvInfo.rCV_float[1];
disp_Flow1.Value = Globals.UserModule.DvInfo.rCV_float[2];
disp_Flow2.Value = Globals.UserModule.DvInfo.rCV_float[3];
disp_Sound.Value = Globals.UserModule.DvInfo.rCV_float[4];
                 
ExeInd.Text = Globals.UserModule.DvInfo.TextDisplay()[0];
ColorChange(ExeInd.Text);
如果是其他的界面会有其他的控件数值更新需要激活。 我没有看懂你这事件与委托的目的,但应该没达到我的要求。不过我技术不是很好,不知道理解的对不对。 是把DataRead后的值,传递给public static界面的protected控件。不知道这样表达会不会好的?
jx315425246 2019-05-31
  • 打赏
  • 举报
回复
注意静态类: SendData,与参数类:MyAge


public class DeviceInfo
{
public float[] wrSV_float = new float[3];
public int[] wrSV_int = new int[4];
public string[] wrPW = new string[3];
public bool[] wBTN = new bool[3];

public float[] rCV_float = new float[5];
public int[] rCV_int = new int[4];
public bool[] rLP = new bool[3];
public bool[] rSIG = new bool[2];

public int exe()
{
int exeStp = 0;
int[] bool2int = { 0, 0 };
bool[] sig = this.rSIG;
bool2int[0] = Convert.ToInt16(sig[0]);
bool2int[1] = Convert.ToInt16(sig[1]);
exeStp |= bool2int[0];
exeStp |= (bool2int[1] << 1);
return exeStp;
}
public string[] TextDisplay()
{
string[] rslt = { "", "" };
int exe = this.exe();
switch (exe)
{
case 0:
rslt[0] = "设备当前处于空闲状态。";
rslt[1] = "Idle";
break;
case 1:
rslt[0] = "设备当前正在进行刷炉后排空气操作。";
rslt[1] = "Post-purge";
break;
case 2:
rslt[0] = "设备当前正在进行第" + this.rCV_int[0] + "次刷炉……";
rslt[1] = "Brushing";
break;
case 3:
rslt[0] = "设备当前正在进行刷炉前排空气操作。";
rslt[1] = "Pre-purge";
break;
default:
rslt[0] = "设备当前处于空闲状态。\n当前正处于离线模拟状态。";
rslt[1] = "Idle";
break;
}
return rslt;
}

public string[] storeinfo()
{
string[] info = new string[8];
int cur_Node = Globals.Tags.addr_node.Value;
info[0] = "# 8" + cur_Node.ToString("D2");
info[1] = DateTime.Now.ToString("yy.MM.dd@HH:mm:ss.ff");
info[2] = this.TextDisplay()[1];
info[3] = this.rCV_float[0].ToString("F3") + " psi";
info[4] = this.rCV_float[1].ToString("F3") + " psi";
info[5] = this.rCV_float[2] + " l/min";
info[6] = this.rCV_float[3] + " l/min";
info[7] = this.rCV_float[4].ToString("F3") + " dB";
return info;
}
}

public partial class UserModule
{
//用户自定义脚本区
public DeviceInfo DvInfo = new DeviceInfo();
public void DataSave()
{
}

}

//参数传递类,根据实际情况写
public class MyAge
{
public string PressureValue;
public string Flow1Value;
public string Flow2Value;
public string SoundValue;
public string ExeIndText;
}

//取数据静态类
public static class SendData
{

public delegate void SendValueHandle(MyAge e);
public static event SendValueHandle SendValue;

public static void SetValue(MyAge e)
{
SendValue(e);
}
}

//界面1
public partial class bgScr
{
//界面bgScr代码区
void bgScr_Opened(System.Object sender, System.EventArgs e)
{
//界面打开时执行代码

SendData.SendValue+=new SendData.SendValueHandle(SendData_SendValue);
}

void btn_DeviceStatus_Click(System.Object sender, System.EventArgs e)
{
//其中一个按钮的Click事件代码
}

private void SendData_SendValue(MyAge e)
{
//处理取回的值
}
}
//界面2
public partial class tempdsScr
{
//界面tempdsScr代码

private Timer t;
int rt1 = 176, rt2 = 31;
bool CycFlag = false;
int CycCnt = 0;
public void StartTimer()
{
t = new Timer();
t.Enabled = true;
t.Interval = Globals.Tags.refreshCT.Value;
t.Tick += myTick;
}
public void myTick(object obj, EventArgs ea)
{
MyAge myage = new MyAge();

if (!Globals.Tags.flag_LoginOpen.Value)
{

Globals.UserModule.DataRead(rt1, rt2);
disp_Pressure.Value = Globals.UserModule.DvInfo.rCV_float[1];
disp_Flow1.Value = Globals.UserModule.DvInfo.rCV_float[2];
disp_Flow2.Value = Globals.UserModule.DvInfo.rCV_float[3];
disp_Sound.Value = Globals.UserModule.DvInfo.rCV_float[4];

ExeInd.Text = Globals.UserModule.DvInfo.TextDisplay()[0];

//取值并产生委托事件
myage.PressureValue = Globals.UserModule.DvInfo.rCV_float[1];
myage.Flow1Value = Globals.UserModule.DvInfo.rCV_float[2];
myage.Flow2Value = Globals.UserModule.DvInfo.rCV_float[3];
myage.SoundValue = Globals.UserModule.DvInfo.rCV_float[4];
myage.ExeIndText = Globals.UserModule.DvInfo.rCV_float[4];
SendData.SetValue(myage);

ColorChange(ExeInd.Text);


}
}

void tempdsScr_Opened(System.Object sender, System.EventArgs e)
{
//界面temdsScr打开时执行代码
disp_Pressure.Prefix = "当前气压:";//disp_前缀表示界面上的AnalogNumeric控件,这里只是修改了名称
disp_Pressure.Suffix = " psi";
disp_Flow1.Prefix = "主管道流量:";
disp_Flow1.Suffix = " l/min";
disp_Flow2.Prefix = "支管道流量:";
disp_Flow2.Suffix = " l/min";
disp_Sound.Prefix = "汽笛声强:";
disp_Sound.Suffix = " dB";

StartTimer();
}
}
jx315425246 2019-05-31
  • 打赏
  • 举报
回复
把 public static class SendData
{

public delegate void SendValueHandle(MyAge e);
public static event SendValueHandle SendValue;

public static void SetValue(MyAge e)
{
SendValue(e);
}
}
别外写一个类,不要写在

那你在 bgScr的读数据中加入
//取值并产生委托事件
MyAge myage=new myage();
myage.PressureValue = Globals.UserModule.DvInfo.rCV_float[1];
myage.Flow1Value = Globals.UserModule.DvInfo.rCV_float[2];
myage.Flow2Value = Globals.UserModule.DvInfo.rCV_float[3];
myage.SoundValue = Globals.UserModule.DvInfo.rCV_float[4];
myage.ExeIndText = Globals.UserModule.DvInfo.rCV_float[4];
SendData.SetValue(myage);

在你需要数据的类中,初始化时 加
SendData.SendValue+=new SendData.SendValueHandle(函数名); 相当于只要有参数社取出,就发生“函数名”这个事件

private void 函数名(MyAge e)
{
//e是传送过来的值
//处理取回的值
本界上的控件.Text=e.PressureValue;
}

要是再不理解,重头看C#委托
OrdinaryCoder 2019-05-31
  • 打赏
  • 举报
回复
public static DataUpdateMonitor Monitor { get; }这是一个属性 可以理解为DataUpdateMonitor 的静态对象 你程序报错我猜你用的应该是VS2017以前的版本 我记得C#7.0才加入给属性赋初始值

Monitor { get; } = new DataUpdateMonitor();这块我图方便直接复制的 实际就是new出一个DataUpdateMonitor这个类的静态单例

可以改成

private static DataUpdateMonitor intance;
private static object obj =new object();
private DataUpdateMonitor()
{

}
public DataUpdateMonitor GetIntance()
{
if(intance == null)
{
lock(obj)
{
if(intance == null)
{
intance =new DataUpdateMonitor();
}
}
}
return intance;
}

使用DataUpdateMonitor这个类对象的时候 DataUpdateMonitor.GetIntance();这样就可以
陌上_桑 2019-05-31
  • 打赏
  • 举报
回复
引用 7 楼 OrdinaryCoder 的回复:
public static DataUpdateMonitor Monitor { get; }这是个属性 本质上是个方法 好像C#7.0支持属性初始化 但是这么用好像还是有点问题吧 所以把 Monitor { get; } = new DataUpdateMonitor();放到构造里去初始化 或者用这个属性对应的字段
大神能否解释一下代码的意义?
陌上_桑 2019-05-31
  • 打赏
  • 举报
回复
引用 10 楼 jx315425246 的回复:
[quote=引用 4 楼 陌上_桑 的回复:] [quote=引用 3 楼 jx315425246 的回复:] 注意静态类: SendData,与参数类:MyAge

public class DeviceInfo
        {
            public float[] wrSV_float = new float[3];
            public int[] wrSV_int = new int[4];
            public string[] wrPW = new string[3];
            public bool[] wBTN = new bool[3];

            public float[] rCV_float = new float[5];
            public int[] rCV_int = new int[4];
            public bool[] rLP = new bool[3];
            public bool[] rSIG = new bool[2];

            public int exe()
            {
                int exeStp = 0;
                int[] bool2int = { 0, 0 };
                bool[] sig = this.rSIG;
                bool2int[0] = Convert.ToInt16(sig[0]);
                bool2int[1] = Convert.ToInt16(sig[1]);
                exeStp |= bool2int[0];
                exeStp |= (bool2int[1] << 1);
                return exeStp;
            }
            public string[] TextDisplay()
            {
                string[] rslt = { "", "" };
                int exe = this.exe();
                switch (exe)
                {
                    case 0:
                        rslt[0] = "设备当前处于空闲状态。";
                        rslt[1] = "Idle";
                        break;
                    case 1:
                        rslt[0] = "设备当前正在进行刷炉后排空气操作。";
                        rslt[1] = "Post-purge";
                        break;
                    case 2:
                        rslt[0] = "设备当前正在进行第" + this.rCV_int[0] + "次刷炉……";
                        rslt[1] = "Brushing";
                        break;
                    case 3:
                        rslt[0] = "设备当前正在进行刷炉前排空气操作。";
                        rslt[1] = "Pre-purge";
                        break;
                    default:
                        rslt[0] = "设备当前处于空闲状态。\n当前正处于离线模拟状态。";
                        rslt[1] = "Idle";
                        break;
                }
                return rslt;
            }

            public string[] storeinfo()
            {
                string[] info = new string[8];
                int cur_Node = Globals.Tags.addr_node.Value;
                info[0] = "# 8" + cur_Node.ToString("D2");
                info[1] = DateTime.Now.ToString("yy.MM.dd@HH:mm:ss.ff");
                info[2] = this.TextDisplay()[1];
                info[3] = this.rCV_float[0].ToString("F3") + " psi";
                info[4] = this.rCV_float[1].ToString("F3") + " psi";
                info[5] = this.rCV_float[2] + " l/min";
                info[6] = this.rCV_float[3] + " l/min";
                info[7] = this.rCV_float[4].ToString("F3") + " dB";
                return info;
            }
        }

        public partial class UserModule
        {
            //用户自定义脚本区
            public DeviceInfo DvInfo = new DeviceInfo();
            public void DataSave()
            {
            }

        }

        //参数传递类,根据实际情况写
        public class MyAge
        {
            public string PressureValue;
            public string Flow1Value;
            public string Flow2Value;
            public string SoundValue;
            public string ExeIndText;
        }

        //取数据静态类
        public static class SendData
        {
            
            public delegate void SendValueHandle(MyAge e);
            public static event SendValueHandle SendValue;

            public static void SetValue(MyAge e)
            {
                SendValue(e);
            }
        }

        //界面1
        public partial class bgScr
        {
            //界面bgScr代码区
            void bgScr_Opened(System.Object sender, System.EventArgs e)
            {
                //界面打开时执行代码
                
                SendData.SendValue+=new SendData.SendValueHandle(SendData_SendValue);
            }

            void btn_DeviceStatus_Click(System.Object sender, System.EventArgs e)
            {
                //其中一个按钮的Click事件代码
            }

            private void SendData_SendValue(MyAge e)
            {
                //处理取回的值
            }
        }
        //界面2
        public partial class tempdsScr
        {
            //界面tempdsScr代码

            private Timer t;
            int rt1 = 176, rt2 = 31;
            bool CycFlag = false;
            int CycCnt = 0;
            public void StartTimer()
            {
                t = new Timer();
                t.Enabled = true;
                t.Interval = Globals.Tags.refreshCT.Value;
                t.Tick += myTick;
            }
            public void myTick(object obj, EventArgs ea)
            {
                MyAge myage = new MyAge();
                
                if (!Globals.Tags.flag_LoginOpen.Value)
                {

                    Globals.UserModule.DataRead(rt1, rt2);
                    disp_Pressure.Value = Globals.UserModule.DvInfo.rCV_float[1];
                    disp_Flow1.Value = Globals.UserModule.DvInfo.rCV_float[2];
                    disp_Flow2.Value = Globals.UserModule.DvInfo.rCV_float[3];
                    disp_Sound.Value = Globals.UserModule.DvInfo.rCV_float[4];

                    ExeInd.Text = Globals.UserModule.DvInfo.TextDisplay()[0];

                    //取值并产生委托事件
                    myage.PressureValue = Globals.UserModule.DvInfo.rCV_float[1];
                    myage.Flow1Value = Globals.UserModule.DvInfo.rCV_float[2];
                    myage.Flow2Value = Globals.UserModule.DvInfo.rCV_float[3];
                    myage.SoundValue = Globals.UserModule.DvInfo.rCV_float[4];
                    myage.ExeIndText = Globals.UserModule.DvInfo.rCV_float[4];
                    SendData.SetValue(myage);

                    ColorChange(ExeInd.Text);

                    
                }
            }

            void tempdsScr_Opened(System.Object sender, System.EventArgs e)
            {
                //界面temdsScr打开时执行代码
                disp_Pressure.Prefix = "当前气压:";//disp_前缀表示界面上的AnalogNumeric控件,这里只是修改了名称
                disp_Pressure.Suffix = " psi";
                disp_Flow1.Prefix = "主管道流量:";
                disp_Flow1.Suffix = " l/min";
                disp_Flow2.Prefix = "支管道流量:";
                disp_Flow2.Suffix = " l/min";
                disp_Sound.Prefix = "汽笛声强:";
                disp_Sound.Suffix = " dB";

                StartTimer();
            }
        }
多谢大师帮忙。 我的意思是:

Globals.UserModule.DataRead(rt1, rt2);
这个代码会在bgScr(background Screen)里面以bgScr内StartTime()的方式周期执行,bgScr的StartTime()除了执行DataRead,同样会在区分当前界面的前提下,选择激活不同事件。比方说这里的:

disp_Pressure.Value = Globals.UserModule.DvInfo.rCV_float[1];
disp_Flow1.Value = Globals.UserModule.DvInfo.rCV_float[2];
disp_Flow2.Value = Globals.UserModule.DvInfo.rCV_float[3];
disp_Sound.Value = Globals.UserModule.DvInfo.rCV_float[4];
                 
ExeInd.Text = Globals.UserModule.DvInfo.TextDisplay()[0];
ColorChange(ExeInd.Text);
如果是其他的界面会有其他的控件数值更新需要激活。 我没有看懂你这事件与委托的目的,但应该没达到我的要求。不过我技术不是很好,不知道理解的对不对。 是把DataRead后的值,传递给public static界面的protected控件。不知道这样表达会不会好的?[/quote] tempdsScr 的public void myTick(object obj, EventArgs ea) 读取值后,在bgScr的 private void SendData_SendValue(MyAge e)输出值,bgScr里不用加StartTime()的方式周期执行,你试一下,已满足你的要求[/quote] 我的意思是,bgScr是一个公共界面,会一直是打开的,而除了tempdsScr之外,还有其他的一些tempdmScr、tempamScr、tempssScr、tempmtnsScr等等一些列界面,而这些界面上的控件各不相同,但都以bgScr为背景,这是为什么我需要把myTick放在bgScr的原因,这样其他界面就不用有myTick了
加载更多回复(2)

111,097

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧