http://www.sufeinet.com/plugin.php?id=keke_group

苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 13994|回复: 6

[其他] C#跨窗体访问timer控件,控制其start 和stop。

[复制链接]
发表于 2015-8-24 07:47:23 | 显示全部楼层 |阅读模式
1金钱
两个窗体,Form1,Form2.
Form1中有个时钟Timer2.


点击Form1中的按钮  Form1.Button1_Click.          则弹出Form2。

通过点击Form2中的按钮 Form2.Button1_Click 来开启Form1中的Timer2.

用委托的方式或者有更好的办法没有。如何实现呢。

就是Form2  中的按钮要控制Form1中的Timer控件。跨窗体访问对方的控件。



1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
发表于 2015-8-24 09:20:57 | 显示全部楼层
看懂我的例子,理解了思路,你的问题自然就解决了
http://www.sufeinet.com/thread-1273-1-1.html
回复

使用道具 举报

 楼主| 发表于 2015-8-24 21:04:18 | 显示全部楼层
本帖最后由 我是MT 于 2015-8-24 21:09 编辑
站长苏飞 发表于 2015-8-24 09:20
看懂我的例子,理解了思路,你的问题自然就解决了
http://www.sufeinet.com/thread-1273-1-1.html

你这个是窗体间如何传值,问题是我还有timer1控件,这个貌似不怎么好处理,如果timer的事件一直处于等待状态,没有结束,貌似会导致系统蓝屏死机。在其中的Form1窗体中,那个Form1中的Timer1负责每隔3分钟就弹出来Form2.  Form2其实是个警告信息窗体。 如果已经弹出来了这个警告窗体,那么timer1不再计数,等用户点击关闭了警告窗体,之后3分钟又会弹出来这个警告窗体。

其实就是个定时提醒工具,类似于闹钟的重复提醒。只要用户没有做任何设置,对闹钟提醒置之不理,那么每隔3分钟就会弹出警告窗体,达到反复提醒的目的。  我想到了一点,就是每次timer只循环一次就终止,再次开启的时候等用户关闭警告窗体再开启这个timer的3分钟延时。

这么一理顺,思路出来了。只需要知道如何用委托,从Form2单击button来触发timer的开启。

问题可能又来了,Form2这个警告窗体是在timer1_Tick()  {   new Form2   ...}   这个事件函数中生成的,一旦timer1结束了,那么是否警告窗体就自动被垃圾回收了。实际情况是,如果弹出来的窗体一直处理等到状态,这个timer1_Tick() 貌似永远等待,直到耗尽系统资源为止。

我测试过程中,这个环节还曾经把我电脑给搞蓝屏死机了。  所以是个比较纠结的问题啊。
回复

使用道具 举报

发表于 2015-8-25 08:20:59 | 显示全部楼层
你还是没有理解我的例子吧,我告诉你的是窗体传值的方法,和用什么控件,什么变量没有关系的。


这个一样可以通过我写的方法调用。窗体都可以传,控件当然也可以的,方法是一样的。另外,开始和结束只需要设置Enabled属性的值就行了,和事件没有半毛钱关系吧,在事件执行结束时加上Enabled=false在单击窗体确认是再设置为Enabled=true就完事了。
回复

使用道具 举报

发表于 2015-8-25 08:54:14 | 显示全部楼层
给你个小例子看看
[C#] 纯文本查看 复制代码
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
    
        private void Form1_Load(object sender, EventArgs e)
        {
            timer1.Enabled = true;
            timer1.Interval = 10 * 1000;
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            timer1.Enabled = false;
            Form2 f2 = new Form2();
            f2.timer = timer1;
            f2.ShowDialog();

            
        }
    }


[C#] 纯文本查看 复制代码
 public partial class Form2 : Form
    {

        public Form2()
        {
            InitializeComponent();
        }
        //弹出窗体的定时控件对象
        public Timer timer = null;

        //知道了按钮
        private void button1_Click(object sender, EventArgs e)
        {
            timer.Enabled = true;
            this.Close();
        }

        private void Form2_Load(object sender, EventArgs e)
        {

        }
    }

回复

使用道具 举报

 楼主| 发表于 2015-8-25 20:43:45 | 显示全部楼层
站长苏飞 发表于 2015-8-25 08:54
给你个小例子看看
[mw_shl_code=csharp,true]    public partial class Form1 : Form
    {

谢谢老大了。可能是我想得太多了。把问题给复杂化了。
回复

使用道具 举报

 楼主| 发表于 2015-8-25 21:47:02 | 显示全部楼层
本帖最后由 我是MT 于 2015-8-25 21:56 编辑
站长苏飞 发表于 2015-8-25 08:54
给你个小例子看看
[C#] 纯文本查看 复制代码
    public partial class Form1 : Form
    {
[/quote]
苏老大,看来我这个代码用不了您介绍的这种思路了,我的Form1使用了全局钩子,如果//public Form1 f1 = new Form1();   在引用Form1到f1的时候,全局钩子hook() 方法会报错,提示Can't hook more than once。因为这个alarm的需求是后面用户提出来要加进去的。所以有些蛋疼。
	[mw_shl_code=csharp,true]public void hook() {
			if (callbackDelegate != null) throw new InvalidOperationException("Can't hook more than once");
			IntPtr hInstance = LoadLibrary("User32");
			callbackDelegate = new keyboardHookProc(hookProc);
			hhook = SetWindowsHookEx(WH_KEYBOARD_LL, callbackDelegate, hInstance, 0);
			if (hhook == IntPtr.Zero) throw new Win32Exception();
		}

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2024-11-24 02:15

© 2014-2021

快速回复 返回顶部 返回列表