delphi中的息机制(100分)

  • 主题发起人 主题发起人 zhiping
  • 开始时间 开始时间
Z

zhiping

Unregistered / Unconfirmed
GUEST, unregistred user!
我遍屏幕报护程序时需要侦测鼠标及键盘的动做以结束程序.<br>我定义了application.onmessage指向的过程.程序如下<br>procedure Tfmrun.FormCreate(Sender: TObject);<br><br>begin<br>&nbsp; &nbsp; .........<br>&nbsp; &nbsp;application.OnMessage:=fmrun.opratedetect;<br>&nbsp; &nbsp; ............<br>end.<br>&nbsp;procedure &nbsp;tfmrun.opratedetect (var Msg:TMsg;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;var Handled:boolean);<br>&nbsp; &nbsp; var x,y:Integer;<br><br>&nbsp; &nbsp; begin<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;case Msg.message of<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;WM_MOUSEMOVE : begin<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//以下为鼠标消息,oldpt为已保存鼠标位置<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;x := Abs(loWord(Msg.lParam)-oldpt.x);<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;y := Abs(HiWord(Msg.lParam)-oldpt.y);<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (x &gt;10) or (y &gt;10) &nbsp;then Close; &nbsp;end;<br><br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;WM_LBUTTONDOWN : Close;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;WM_MBUTTONDOWN : Close; //按下鼠标中键<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;WM_RBUTTONDOWN : Close; //按下鼠标右键<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;WM_KEYDOWN : Close; //以下为键盘消息<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;WM_KEYUP : Close;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;WM_SYSKEYDOWN &nbsp;: Close;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;WM_SYSKEYUP : Close;<br>&nbsp; &nbsp; &nbsp;end;<br><br>&nbsp; &nbsp;end;<br>但出现了一个问题就是图形在缓慢推出时(即程序在运行其他任务时)按键盘或<br>鼠标没有反应直到图片显示完之后才响应,结束程序.我查了help好象onmessage<br>只处理消息列队中的消息不能马上处理消息的响应.但由于我没有学过windows消<br>息机制及delphi中的消息实现因此不是从实质上清楚更不知道如何改进.每当遇到消息<br>的处理时总很苦恼.借此机会想让大虾们给讲一讲windows消息机制及delphi中的<br>消息实现尤其是后者的原理.想必也有许多象我一样迷茫的初学者也想知道.顺便也把<br>上面的问题给出一个答复使得程序能够马上响应操作而结束. 我仅有的分吐血奉上.
 
在处理漫长的操作之中,要用:application.processmessage<br>来让application处理消息.
 
这应该是程序功能的配合问题.<br><br>如果你的程序是单线程的, 并且计算任务繁重, 那在计算中<br>常调用 Application.Processmessage 应该可以处理你的问题.<br><br>可以把计算部分单独方到一条线程中. 然后在主线程中适当的时候<br>结束之.
 
原来是消息机制, 我倒:-)<br>cakk说的对, 你要在"图形在缓慢推出"的循环之中加上application.processmessage.<br>
 
能不能写个例子,我初学看个例子好懂
 
如:<br>&nbsp; &nbsp;for i:=0 to 1000 do begin<br>&nbsp; &nbsp; &nbsp;...;//大工作量计算或调用,使用刷新困难<br>&nbsp; &nbsp; &nbsp; Application.ProcessMessages; <br>&nbsp; &nbsp;end;<br>
 
的确,一般情况下Application.ProcessMessages的重要性并不明显,<br>但一到处理大量数据时就能够体现出它的优越性。<br>象我一个程序,当要处理&gt;5000个文件时,程序本身非常慢,而且这时为了使用户可以中止,<br>途中新开了另一个窗口,上有一停止按钮。<br>如果没有适当加上Application.ProcessMessages,根本就无法完整显示这个新窗口,<br>就算显示了用户可无按钮下停止按钮,因为这些系统实在太忙顾不上鼠标事件了。<br>相信您的问题也是差不多。推出这些图形可能让您的CPU忙得非常厉害。
 
1.作屏保用不着onmessage,您可以用formkeypress &amp; FormMouseMove 来帧查键盘和鼠标的动作<br>例子如下:<br>先建立一个无边的Form,然后在该form中画图<br><br>procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);<br>begin<br>&nbsp; screen.cursor:=crdefault;<br>&nbsp; application.terminate;<br>end;<br><br>procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,<br>&nbsp; Y: Integer);<br>begin<br>&nbsp; if (abs(X-100)&gt;5) or (abs(y-100)&gt;5) then<br>&nbsp; begin<br>&nbsp; &nbsp; screen.cursor:=crdefault;<br>&nbsp; &nbsp; application.Terminate;<br>&nbsp; end;<br>end;<br><br>2.如果计算量大的话,可以加入Application.ProcessMessages在循环中.
 
处理Application的消息采用OnMessage似乎不是上上之选。你应该替换你的<br>主Form中的DefWindowsProc较好。当然你必须在你的循环中加入<br>Application.ProcessMessages。<br><br>BTW:<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;WM_LBUTTONDOWN : Close;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;WM_MBUTTONDOWN : Close; //按下鼠标中键<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;WM_RBUTTONDOWN : Close; //按下鼠标右键<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;WM_KEYDOWN : Close; //以下为键盘消息<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;WM_KEYUP : Close;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;WM_SYSKEYDOWN &nbsp;: Close;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;WM_SYSKEYUP : Close;<br><br>为什么不写成:<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;WM_LBUTTONDOWN,<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;WM_MBUTTONDOWN, //按下鼠标中键<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;WM_RBUTTONDOWN, //按下鼠标右键<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;WM_KEYDOWN, //以下为键盘消息<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;WM_KEYUP,<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;WM_SYSKEYDOWN,<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;WM_SYSKEYUP : Close;<br><br>?
 
D5里面有一个application控件,也许用它最方便!
 
我也想学编制一个标准的屏幕报护程序,教教我啊,<br>各位高手!
 
:scy_fjqz你可以到www2.cs.uestc.edu.cn/~vigor去看一看<br>上面有屏保的资料及源程序。你会得到你想要的
 
谢谢各位相助
 
谢谢各位相助<br>&nbsp;<br>
 
kao,怎么回事? 如果接收答案就给分吧!
 
<br>cao cakk 我本来早就想结束但试了N回总结束不了<br>好象论坛有问题.既然这样我就再说几句<br>我的问题是解决了但只是知道加上那个语句但为什么这样做及该语句的<br>作用我还是不清楚但由于我没有学过windows消息机制及delphi中的消息实现因此不是从实质上清楚更不知道如何改进.每当遇到消息<br>的处理时总很苦恼.本来想借此机会想让大虾们给讲一讲windows消息机制及delphi中编程环境是如何实现的 可是没有人回答我很失望<br>&nbsp;
 
后退
顶部