在一个MIS系统中!
我想通过用户键入的回车键执行两种操作
一:如果该控件没有LOOKUP属性,则光标跳到下一个控件!
二:如果该控件(自定义控件)有LOOKUP属性,则显示LOOKUP数据列表!这个问题表面上看很简单!
但在做的过程中出现了一个非常难以跨越的问题!
要实现第一个功能,我在做法是在窗口的OnKeyPress事件中处理键值为#13时执行的操作(跳到下一个控件),并将窗体的KeyPressView属性设置为真;要实现第二个功能,我的做法是在控件内部重载KeyPress事件,然后去处理#13时执行的操作(显示LOOKUP数据列表)!但现在出现了一个问题,程序在执行过程中是先响应窗口的OnKeyPress事件,然后再响应控件的OnKeyPress事件;
如果我将窗口的KeyPressView属性设置为真,程序不会响应控件的OnKeyPress事件,因为在响应窗体的OnKeyPress事件的时候,已经将窗体的焦点移动到了一下控件,所以无法响应按回车所在控件的OnKeyPress事件
如果我将窗口的KeyPressView属性设置为假,则程序会响应控件的OnKeyPress事件(会显示LOOKUP数据列表),但在非LOOKUP控件上无法将控件移动到一下控件!现在我想综合这两个功能!应该怎么做?
最好的解决方法就是能够改变窗体与控件的OnKeyPress事件的响应顺序,即先响应控件的事件,然后才响应窗体的事情!不过我感觉这样做可能比较困难!各位大侠有没有更好的解决方案?

解决方案 »

  1.   

    解决了!
    窗口ONKEYPRESS事件代码为:
     if Key = #27 then
       Close()
     else if Key = #13 then
     Begin
      if not (ActiveControl is TDbgrid) Then
      Begin { 不是在TDbgrid控件内}
        key:=#0;
        perform(WM_NEXTDLGCTL,0,0);{移动到下一个控件}
      end else
      if (ActiveControl is TDbgrid) Then{是在 TDbgrid 控件内}
      begin
        With TDbgrid(ActiveControl) Do
        if Selectedindex<(FieldCount-1) then
        Selectedindex:=Selectedindex+1{ 移动到下一字段}
        else Selectedindex:=0;
      end;
     End;
    在这个事件中,我在将控件移动到下一控件前将KEY的值赋值为#0了
    程序在控件中就不会再响应ONKEYPRESS事件了,
    将key:=#0;去掉就行了!
    呵呵!
      

  2.   

    >>>但在非LOOKUP控件上无法将控件移动到一下控件!
    这个不一定非要在Form事件里做的,直接在控件里发个消息给其父亲就可以了:PostMessage(Parent.Handle, WM_NEXTDLGCTL, 0, 0);