我正在运行时更改框架的父级,以将框架从一种形式移动到另一种形式。这工作正常,但之后我的组件不再接收鼠标事件。例如,CM_MOUSEENTER
和 CM_MOUSELEAVE
不会被触发。
Frame.Parent := SecondDisplayForm;
Frame.Align := alClient;
SecondDisplayForm.Show;
我不明白这种效果,也不知道要提供什么信息,所以如果您有提示,请在这里帮助我。
最佳答案
正如 NGLN 报道的那样,它在 D7 中工作,但在 BDS2006 中它是可重现的。我发现在 cm_mouseenter
之后和 cm_mouseleave
之前更改父级很重要,否则没有问题。我认为问题出在controls.pas中,也许这是一个错误。稍微玩了一下,我发现如果您在更改父项之前执行
一条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有关,但尚未正确调查。
关于windows - 更改框架的父级后未触发鼠标事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9207360/