在好多程序的主界面右下方都会显示系统时间,如直接在frmMain上加Timer控件来实现,在子界面上做某种费时的操作时,frmMain上的时间就刷新不了了,各位高手有何好方法?
我的初步设想是起个线程来显示时间,但在线程中如何控制frmMain上的Timer控件并触发其事情就搞不定了,请高手赐教!

解决方案 »

  1.   

    单独开一个Thread没必要
    直接在timer里写就可以了,简单,方便
      

  2.   

    起个线程来时时刷新,没有必要吧,老大线程是好东西,但是不要滥用呀
    这样实现吧,不过不是线程的代码哦
    StatusBar1.Panels.Items[2].Text:='日期:'+datetostr(now());
    StatusBar1.Panels.Items[2].Text:=StatusBar1.Panels.Items[2].Text+'         ';
    StatusBar1.Panels.Items[2].Text:=StatusBar1.Panels.Items[2].Text+'时间:'+timetostr(now());
      

  3.   

    在耗时的代码中加入:
    Application.ProcessMessages它可以强行使系统处理消息
      

  4.   

    我是这样做的,没出现你frmMain上的时间就刷新不了的问题!procedure TMain.Timer1Timer(Sender: TObject);
    begin
      statusbar1.Panels[1].Text := '日期' + formatdatetime('yyyy年-MM月-dd日',now);
      statusbar1.Panels[2].Text := '时间' + timetostr(now);
    end;
      

  5.   

    对,在时钟OnTimer事件里面写几句代码就可以了,不必搞那么复杂
      

  6.   

    TTimer 本身就会起一个线程
    MainFrm上用TTimer显示当前时间,不会受你子窗体上操作的影响,
    不过不清楚你具体怎么做的...ref: 
     回复人: vfork(潇湘风情) ( ) 信誉:100  2004-09-17 01:22:00  得分: 0  
     
     
       我是这样做的,没出现你frmMain上的时间就刷新不了的问题! procedure TMain.Timer1Timer(Sender: TObject);
     begin
       statusbar1.Panels[1].Text := '日期' + formatdatetime('yyyy年-MM月-dd日',now);
       statusbar1.Panels[2].Text := '时间' + timetostr(now);
     end;
      
     
      

  7.   

    同意 restboy思路有些问题,界面的反应应该放在主线程里面,真正需要长时间耗时的操作才应该放在子线程里面处理
      

  8.   

    StatusBar1.Panels.Items[2].Text:='日期:'+datetostr(now());
    StatusBar1.Panels.Items[2].Text:=StatusBar1.Panels.Items[2].Text+'         ';
    StatusBar1.Panels.Items[2].Text:=StatusBar1.Panels.Items[2].Text+'时间:'+timetostr(now());
    目前我就是这么做的,并且N年来一直是这么做的,但是子窗口做某种费时操作时主界面上的时间的确是不动了,比如子窗口正在调存储过程,该存储过程汲及几张百万记录级的表.
      

  9.   

    同意 WGYKING(修罗封闭中)(前女友要来看我) 的意见。
    主要是要想法让系统响应你的消息。
    恩,调用存储过程吗。倒是这种耗时的操作应该放到线程中去。否则不但刷新不了时间,只怕操作也不能响应吧。
      

  10.   

    试了WGYKING(修罗封闭中)(前女友要来看我)的方法,效果也不是很好
    谢谢各位,结帐!