我正在将帧的父级更改为运行时,以将帧从一种形式移动到另一种形式。这工作正常,但之后我的组件不再接收鼠标事件。例如,CM_MOUSEENTER
和CM_MOUSELEAVE
未被触发。
Frame.Parent := SecondDisplayForm;
Frame.Align := alClient;
SecondDisplayForm.Show;
我不明白这种效果,我真的不知道要提供什么信息,所以如果你有提示,请帮帮我。
答案 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有关,但没有正确调查。