C# 委托+事件 温度报警/计算器
计算器
代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace 第8章_事件
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public Calculate handler; //实例化 委托只能是public
MyMath math = new MyMath(); //为了能够使用其中的函数 new的作用是:申请对象所需要的存储器 math相当于一个指针 如果不new,相当于这个对象是一个空指针
int op1; //第一操作数
int op2; //第二操作数
bool isContinue = true; //是否连续输入
//运算符按钮的操作
private void buttonCalc_Click(object sender, EventArgs e)
{
isContinue = false; //点击运算符后,下一个数字不是连续输入,所以让isContinue = false
if (handler == null) //如果没有函数被委托
{
op1 = int.Parse(textBox1.Text); //把文字框中的数字 设置为第一操作数
}
else //如果有函数被委托 将该运算符之前的委托运算先计算出来
{
op2 = int.Parse(textBox1.Text); //把新输入的数字 设置为第二个操作数
op1 = handler(op1, op2); //运算结果 作为下一次运算的第一操作数
textBox1.Text = op1.ToString(); //把上一次的运算结果输出到文字框中
}
if (sender is Button) //运算过程
{
Button btn = (Button)sender; //把该运算符对应的运算添加到委托中
switch (btn.Text)
{
case "+":
handler += new Calculate(math.Add); break;
case "-":
handler += new Calculate(math.Sub); break;
case "*":
handler += new Calculate(math.Mul); break;
case "/":
handler += new Calculate(math.Div); break;
case "=":
handler = null; break;
}
}
}
//数字按钮的操作
private void buttonNum_Click(object sender, EventArgs e)
{
if (sender is Button)//sender是对象名 判断左边这个对象是不是右边这个类型的 如果是 则转换
{
Button btn = (Button)sender;
if (isContinue)
{
textBox1.Text += btn.Text;
}
else
{
isContinue = true; //输入一个数字后,下一个数字为连续输入
textBox1.Text = btn.Text;
}
}
}
//数字类按钮
private void button2_Click(object sender, EventArgs e)
{
buttonNum_Click(sender, e);
}
private void button3_Click(object sender, EventArgs e)
{
buttonNum_Click(sender, e);
}
private void button4_Click(object sender, EventArgs e)
{
buttonNum_Click(sender, e);
}
private void button7_Click(object sender, EventArgs e)
{
buttonNum_Click(sender, e);
}
private void button6_Click(object sender, EventArgs e)
{
buttonNum_Click(sender, e);
}
private void button5_Click(object sender, EventArgs e)
{
buttonNum_Click(sender, e);
}
private void button10_Click(object sender, EventArgs e)
{
buttonNum_Click(sender, e);
}
private void button9_Click(object sender, EventArgs e)
{
buttonNum_Click(sender, e);
}
private void button8_Click(object sender, EventArgs e)
{
buttonNum_Click(sender, e);
}
//计算类按钮
// +
private void button15_Click(object sender, EventArgs e)
{
buttonCalc_Click(sender, e);
}
// -
private void button14_Click(object sender, EventArgs e)
{
buttonCalc_Click(sender, e);
}
// *
private void button13_Click(object sender, EventArgs e)
{
buttonCalc_Click(sender, e);
}
// /
private void button12_Click(object sender, EventArgs e)
{
buttonCalc_Click(sender, e);
}
// =
private void button1_Click(object sender, EventArgs e)
{
buttonCalc_Click(sender, e);
}
}
public delegate int Calculate(int x, int y); //声明委托 委托是一个类型安全的函数指针
class MyMath
{
public int Add(int x, int y)
{
return x + y;
}
public int Mul(int x, int y)
{
return x * y;
}
public int Sub(int x, int y)
{
return x - y;
}
public int Div(int x, int y)
{
return x / y;
}
}
}
温度预警模拟
代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace 第八章_温度报警
{
public partial class Form1 : Form
{
Random r = new Random();//随机数生成器
TemperatureWarning tw = new TemperatureWarning();//创建温度警报器对象
public Form1()
{
InitializeComponent();
//订阅事件
tw.OnWarning += new TemperatureWarning.TemperatureHandler(tw_OnWarning);
}
private void tw_OnWarning(object sender, TemperatureEventArgs e)
{
if (e.Temperature < 35)
{
label2.Text = "正常";
textBox2.BackColor = Color.Blue;
}
else if (e.Temperature < 37)
{
label2.Text = "高温黄色预警";
textBox2.BackColor = Color.Yellow;
}
else if (e.Temperature < 37)
{
label2.Text = "高温橙色预警";
textBox2.BackColor = Color.Orange;
}
else
{
label2.Text = "高温红色预警";
textBox2.BackColor = Color.Red;
}
}
private void button1_Click(object sender, EventArgs e)
{
timer1.Enabled = true; //启动计时器,开始每1秒改变一次温度
}
private void timer1_Tick(object sender, EventArgs e)
{
int nowTemp;//现在的温度
if (textBox1.Text == "") nowTemp = 35;
else
{
nowTemp = int.Parse(textBox1.Text);
}
int change = r.Next(-2, 3);
textBox1.Text = (change + nowTemp).ToString();//新的温度
tw.Monitor(change + nowTemp);
}
}
//定义事件相关信息类
class TemperatureEventArgs : EventArgs
{
private int temperature;
public TemperatureEventArgs(int temperature)//构造函数
{
this.temperature = temperature;
}
public int Temperature //定义只读属性
{
get { return temperature; }
}
}
//定义事件警报器
class TemperatureWarning
{
//声明温度预警的委托类型
public delegate void TemperatureHandler(object sender, TemperatureEventArgs e);
//声明温度预警事件
public event TemperatureHandler OnWarning;
//开始监控气温,同时发布事件
public void Monitor(int tp)
{
TemperatureEventArgs e = new TemperatureEventArgs(tp);
if (OnWarning != null)
{
OnWarning(this, e);
}
}
}
}