delphi2007 教程

delphi2007 教程

首页 新随笔 联系 聚合 管理
  1013 Posts :: 0 Stories :: 28 Comments :: 0 Trackbacks
没有窗体怎么使用定时器呢? Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiAPI/html/delphi_20061112185601249.html
做那中简单的程序的时候(不是控制台程序),想要使用API函数SetTimer来设置定时器,请问应该怎么写代码呢,关键是那个HWND应该是什么呢,我没有窗体怎么设置

简单的方法,就是用一个隐藏的窗体,好像没有窗体是不能成为一个程序的,除非你做的是服务程序,你如果做过c写windows程序就会对这一点有比较深的认识了。

毕竟时钟也是一个事件,必须用消息队列,有消息队列,一般就必须制定什么窗体接受这个消息队列。  
  看了你的要求,我想很多人碰到过你的想法,包括本人,但是你有这种想法,如果不是服务程序,只能说明你的程序体系没有构思好,构思好了,就不会有你这种想法,或者说很容易找到解决方法。

到MSDN看SetTimer的帮助

晕,   楼上的等于没说嘛  
  怎么可能没窗体呢?这是   delphi,至少也要个主窗体才能运行的.  
   
  不过可以考虑自写一线程作   timer   的嘛,   简单得很  
   
  procedure   xxx.Execute;  
  begin  
      while   not   Terminated   do  
      begin  
          if   FTimerEvent   :=   TEVent.WaitFor(FInterval)   =   wrTimeout   then  
                Synchronize(DoTimer);   你爱挂哪挂哪  
      end;  
  end;

Delphi才不是必须要窗体呢,从Project菜单中选择Remove   From   Project   就可以删掉自动生成的窗体,代码可以在工程文件的benin     end.之间添加,这样的话就没有窗体了,明明用不到前台界面的话,再添加一个隐藏的窗体进去,总是感觉有点多余  
   
  我要研究下楼上的代码先

也可以使用多媒体定时器:  
   
  timeSetEvent

program   Project1;  
   
  uses  
      Windows,Dialogs;  
   
  procedure   TimerProc(hWindow:HWND;   uMsg:UINT;   idEvent:UINT;   dwTime:DWORD);stdcall;  
  begin  
      Showmessage('a');  
  end;  
   
  var   Msg:   TMsg;  
   
  begin  
      SetTimer(HWND(nil),1,3000,@TimerProc);  
      while   GetMessage(Msg,   0,   0,   0)   do   TranslateMessage(Msg);  
      KillTimer(HWND(nil),1);  
  end.  
   
   
  我是这样写的  
  可是为什么没有显示对话框?

这样哈,   这样倒是没想过,   不过也行,   Application.Handle   是任务栏上的那个   hwnd   不知道能不能用作   timer   用

窗口句柄是一定要的,   timer   要求进入消息队列

楼上说的好,“消息队列”,就是这个,没有窗口,谁检索这个呢?

仔细看看我1、2   楼的分析,不要想当然

楼主要求   BT   哈,   Application.Handle   试过不行的话就可以考虑用线程了吧,   要不然的确是作不了

问题终于解决了,楼上不对,由于没有使用Forms单元,何来Application?  
  我认为,窗口句柄不见得那么必需,我解决的时候是在大循环中加入DispatchMessage函数,这样才能将WM_TIMER消息送到预先定义的回掉函数?虽然仍有不解,但是代码工作的很好,CPU使用率也没有什么异常

分数什么的怎么处理?不知道啊

//   DELPHI写程序可以没有窗体.  
  //   新建一个Application,然后关闭   Unit1,不要保存。再ALT   +   P,   V,修改为以下代码  
   
  program   Project1;  
   
  uses  
  //     Forms;  
      Windows;  
   
  {$R   *.RES}  
   
  var  
      i:   integer;  
  begin  
      for   i   :=   0   to   100   do  
      begin  
          Sleep(1000);  
      end;  
  //     Application.Initialize;  
  //     Application.Run;  
  end.  
 

//测试通过  
   
  program   Project1;  
   
  uses  
      Windows,Dialogs;  
   
  procedure   TimerProc(hWindow:HWND;   uMsg:UINT;   idEvent:UINT;   dwTime:DWORD);stdcall;  
  begin  
      Showmessage('a');  
  end;  
   
  var   Msg:   TMsg;  
   
  begin  
      SetTimer(HWND(nil),1,3000,@TimerProc);  
      while   GetMessage(Msg,   0,   0,   0)   do  
      begin  
          TranslateMessage(Msg);  
          DispatchMessage(Msg);   //〈〈〈add  
      end;  
      KillTimer(HWND(nil),1);  
  end.

我的这个行吗?  
   
  procdure   Tmythread.execute;  
  var  
    t1,t2:Dword;  
  begin  
    t1:=gettickcount;  
    t2:=gettickcount;  
    while   ((t2-t1)<10000)   do  
    begin  
      ...  
      t2:=gettickcount;  
      sleep(500);  
    end;  
  end;

HandleAllcoate

AllocateHWnd   用这个

posted on 2009-02-03 09:49 delphi2007 阅读(313) 评论(0)  编辑 收藏 引用
只有注册用户登录后才能发表评论。