我有8个窗体,一个全局变量Timer TM,在8个窗体中都写了这个TM的委托方法,Program.TM.Tick += new EventHandler(TM_Tick);我希望当定时时间到时,就弹出一个提示窗口,可问题是每次定时时间一到就会弹出8个窗口~~
因为刚学C#,对于委托的概念不是很清楚,怎么解决以上这个问题,或者说,定时时间到,怎么只调用当前窗口的TM_Tick方法,其他窗口的就不要调用了?

解决方案 »

  1.   

    可以试试在打开窗体加载时
    Program.TM.Tick += new EventHandler(TM_Tick);
    应该就只有打开窗体时有了
      

  2.   

    由于timer是全局的,你在8个窗体类中都添加了委托的处理事件,那就是让这个时钟做了8次事情 。楼主的意思是不是计时器只有一个,但是到时间“只执行当前选择窗体的处理方法”?如果是这样,提供你个思路:
    在每个窗体的处理函数里加个判断:
    如果当前窗体不是活动窗体,就return这样就能保证每次到时间只有一个会执行
      

  3.   

    在你的响应方法中判断下窗体是否可见,可见再继续
    Program.TM.Tick += new EventHandler(TM_Tick); 
    TM_Tick(...){
        if(this.Visible == false){
        return... 
       }
    }
      

  4.   

    委托可以理解为函数链啊,由于Timer TM是全局变量,并且在8个窗体中都添加了代码
    Program.TM.Tick += new EventHandler(TM_Tick);那就是为一个时间注册了8次事件处理函数,到事件发生时,每个处理函数都会被处理。
    要想得到楼主想要的效果,5楼和7楼的办法是一种。
    另外如果lz的8个处理函数都一样的话,只添加一个好了,这样就只运行一个。
      

  5.   


    using System;
    using System.Collections.Generic;
    using System.Windows.Forms;namespace WindowsApplication277
    {
        static class Program
        {
            /// <summary>
            /// 应用程序的主入口点。
            /// </summary>
            [STAThread]
            static void Main()
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);            Form1 F1 = new Form1();
                F1.Text = "A";            Form2 F2 = new Form2();
                F2.Text = "B";
                F2.Show();            Timer T = new Timer();
                T.Interval = 3000;
                T.Tick += F1.Tick;
                T.Tick += F2.Tick;
                T.Enabled = true;            Application.Run(F1);  
            }        class Form1 : Form
            {
                public void Tick(object sender, EventArgs e)
                {
                    if (Form.ActiveForm ==this )
                    MessageBox .Show ("A");
                }
            }        class Form2 : Form
            {
                public void Tick(object sender, EventArgs e)
                {
                    if (Form.ActiveForm == this)
                        MessageBox.Show("B");
                }
            }
        }
    }