Delphi. Как из события с message CM_MOUSEENTER вызывать событие с CM_MOUSEENTER? Есть 2 компонентка - DBGrid и Panel. Поверх DBGrid находиться Panel c Visible:=false; При наведении на DBGrid Panel появляется. Теперь нужно убирать её когда курсор мыши уводиться с DBGrid. Использую CM_MOUSELEAVE, получаю LParam, сравниваю с handler DBGrid и убираю панель. Но! Т.к. панель это уже другой объект, то при переходе мышки на панель она исчезает, хотя курсор мыши фактически еще находится в границах DBgrid'а. Как в CM_MOUSELEAVE исключить исчезновение панели, при переходе на неё? Думал тут же проверять CM_MOUSEENTER, но так и не понял как вызывать из события с CM_MOUSEELAVE.
Вам не нужно вызывать событие CM_MOUSEENTER из события CM_MOUSELEAVE. Вместо этого, вы можете использовать один обработчик событий для обеих ситуаций.
Вы можете использовать переменную, чтобы отслеживать, находится ли мышь над DBGrid или Panel, и в зависимости от этого показывать или скрывать Panel.
Примерно так можно это сделать:
varIsMouseOverDBGrid: Boolean;
procedure TForm1.DBGridMouseEnter(Sender: TObject);
begin
Panel.Visible := True;
IsMouseOverDBGrid := True;
end;
procedure TForm1.DBGridMouseLeave(Sender: TObject);
begin
if not PtInRect(DBGrid.BoundsRect, ScreenToClient(Mouse.CursorPos)) then
begin
Panel.Visible := False;
IsMouseOverDBGrid := False;
end;
end;
procedure TForm1.PanelMouseLeave(Sender: TObject);
begin
Panel.Visible := False;
IsMouseOverDBGrid := False;
end;
procedure TForm1.PanelMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
IsMouseOverDBGrid := False;
end;
procedure TForm1.DBGridMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
IsMouseOverDBGrid := True;
end;
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
if not (IsMouseOverDBGrid or PtInRect(Panel.BoundsRect, ScreenToClient(Mouse.CursorPos))) then
begin
Panel.Visible := False;
end;
end;
Этот код отслеживает положение мыши над DBGrid и Panel и скрывает Panel, если мышь покидает эти компоненты.