【问题标题】:Mouse events not fired after changing the parent of a frame更改框架的父级后未触发鼠标事件
【发布时间】:2012-03-01 17:12:24
【问题描述】:

我正在将框架的父级更改为运行时以将框架从一种形式移动到另一种形式。这工作正常,但之后我的组件不再接收鼠标事件。例如,CM_MOUSEENTERCM_MOUSELEAVE 不会被触发。

Frame.Parent := SecondDisplayForm;
Frame.Align := alClient;
SecondDisplayForm.Show;

我不明白这个效果,我真的不知道要提供什么信息,所以如果你有提示,请在这里帮助我。

【问题讨论】:

  • 您的其他表单是否将 KeyPreview 设置为 true?
  • KeyPreview 不应影响鼠标事件。
  • +1 我也有同样的问题,很烦。就我而言,我在 CM_MOUSEENTER 之后和 CM_MOUSELEAVE 触发之前更改了父级。也许这也很重要..
  • @balazs:是的,这对我来说也是如此。当我更改父级时,鼠标悬停在组件上。
  • 警告:请谨慎处理父母更换!您必须考虑所有权。见:How to detach a panel and show it in a separate window?

标签: windows delphi delphi-xe


【解决方案1】:

正如 NGLN 报告的那样,它在 D7 中有效,但在 BDS2006 中它是可重现的。我发现在cm_mouseenter之后和cm_mouseleave之前更改父级很重要,否则没有问题。问题出在controls.pas 我认为,也许这是一个错误。玩了一会儿,我发现如果您在更改父级之前Perform 发送wm_mouseleave 消息,一切都很好。

在我的示例代码中,我在 onclick 事件中更改了父级。

  TFrame3 = class(TFrame)
    procedure FrameClick(Sender: TObject);
  private
    procedure CMMouseEnter( var msg: TMessage ); message CM_MOUSEENTER;
    procedure CMMouseLeave( var msg: TMessage ); message CM_MOUSELEAVE;
  public
  end;

implementation

procedure TFrame3.CMMouseEnter(var msg: TMessage);
begin
  inherited;
  Color := clRed;
end;

procedure TFrame3.CMMouseLeave(var msg: TMessage);
begin
  inherited;
  Color := clBlue;
end;

procedure TFrame3.FrameClick(Sender: TObject);
begin
if parent = Form1 then
  begin
    Perform( WM_MOUSELEAVE, 0, 0 );
    parent := Form2;
    align := alClient;
    Form1.Hide;
    Form2.Show;
  end else
  begin
    Perform( WM_MOUSELEAVE, 0, 0 );
    parent := Form1;
    align := alClient;
    Form2.Hide;
    Form1.Show;
  end;
end;

我认为问题与 Controls.pas 中的 FMouseControl 有关,但没有正确调查。

【讨论】:

  • +1 谢谢。这非常有帮助并证实了我的假设。 CM_MOUSELEAVE 消息的解决方法有点难以开始工作,因为父级是从外部更改的,而不是从内部更改的(由主窗体的 OnKeyDown 处理程序中处理的键事件触发)。
  • 您应该触发 WM_MOUSELEAVE 消息而不是 CM_MOUSELEAVE!我认为它也应该适用于您的情况,因为您可以从任何地方调用 Frame.Perform(WM_MOUSELEAVE, 0, 0 ),或者您可以覆盖框架的 setparent 并将此代码放在那里可能需要检查是否有 mouseenter .
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-23
  • 2013-12-15
  • 1970-01-01
  • 2012-11-26
  • 2016-08-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多