События мыши не запускаются после смены родителя кадра - PullRequest
2 голосов
/ 09 февраля 2012

Я меняю родительский элемент фрейма во время выполнения, чтобы переместить фрейм из одной формы в другую.Это работает нормально, но после этого мои компоненты больше не получают события мыши.Например, CM_MOUSEENTER и CM_MOUSELEAVE не запускаются.

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

Я не понимаю этого эффекта, и я не знаю, какую информацию предоставить, поэтому, если у вас есть советы, пожалуйста, помогите мне здесь.

1 Ответ

2 голосов
/ 15 февраля 2012

Как сообщает 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, но он не исследован должным образом.

...