Как сообщает NGLN, он работает в D7, но в BDS2006 он воспроизводим.Я обнаружил, что важно поменять родителя после cm_mouseenter
, а до cm_mouseleave
, в остальном проблем нет.Проблема в control.pas Я думаю, может быть, это ошибка.Немного поигравшись, я обнаружил, что если вы Perform
a 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;
Я думаю, что проблема связана с FMouseControl в Controls.pas, но он не исследован должным образом.