主窗体中有一Frame,Frame中有许多子控件,所以Frame有一个自动生成的垂向上的滚动条以显示全部的子控件,现在想实现的是鼠标移动到Frame范围内就使Frame获得焦点,以实现鼠标中键的浏览功能。
  现在出现的问题是,由于Frame中有很多子控件,要使Frame获得焦点只有给每个子控件的OnMouseMove书写代码,但是子控件的数量很多,我感觉这样的效率实在太低,并且子控件占的面积很大,OnMouseMove事件很少出现在Frame上,都是出现在其中的子控件上。所以想求教一更好的实现机制。谢谢!

解决方案 »

  1.   

    你直接用SetFocus方法不就搞定。
      

  2.   

    在Frame的OnMouseMove事件中写楼上所说的Frame1.SetFocus难道不可以吗??
      

  3.   

    子控件占的面积很大,OnMouseMove事件很少出现在Frame上,大部分都是出现在其中的子控件上。所以如果你有100个子控件,就要写100条SetFocus。我是想知道有没有更有效的解决办法?
      

  4.   

    那你可不可以这样,先取得FRAME在窗体上的相对坐标,然后利用FORM的ONMOUSEMOVE事件判断鼠标是否位于FRAME上,如果是就Frame.SetFocus。
      

  5.   

    试试如下的方法:
    先覆盖一个消息方法procedure CMMouseEnter(var Msg: Tmessage);message CM_MOUSEENTER;
    然后在消息方法里这么写:
    procedure TForm1.CMMouseEnter(var Msg: Tmessage);
    var Obj: TObject;
    begin
      Obj := TObject(Msg.LParam);
      if Assigned(Obj) and (Obj is TFrame2) then
        ShowMessage('i''m frame');   //Frame21.SetFocus;
    end;
    我试了一下可行的!
      

  6.   

    to juliens(星星球):非常感谢,经测试已经成功。不过最后是不是应该加一个inherited;要不然其他控件就得不到OnMouseEnter事件了。