C# 委托+事件 温度报警/计算器

计算器

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;
        }
    }
}

温度预警模拟

C# 委托+事件 温度报警/计算器
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 第八章_温度报警
{
    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);
            }
        }
    }
}