更改帧的父级后未触发鼠标事件

时间:2012-02-09 08:12:47

标签: windows delphi delphi-xe

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

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

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

1 个答案:

答案 0 :(得分:2)

NGLN报道它在D7中起作用,但在BDS2006中它是可重复的。我发现在cm_mouseenter之后和cm_mouseleave之前更改父级非常重要,其他方面也没有问题。问题出在controls.pas我想,也许这是一个bug。玩了一下我发现如果你在改变父母之前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有关,但没有正确调查。