Извините, если такой вопрос уже был сделан ранее, но у меня нет времени копаться в stackoverflow db ...
Итак, у меня есть этот код:
procedure TForm1.GraphPrevBtnMouseEnter(Sender: TObject);
var frm_PrevBtn : TForm;
begin
GraphPrevBtn.Width := 75;
if z = 0 then begin
frm_PrevBtn := TForm.Create(nil);
with frm_PrevBtn do begin
Name := 'frm_PrevBtn';
BorderStyle := bsNone;
Position := poDesigned;
Top := Form1.Top + GraphprevBtn.Top + (form1.Height - Form1.ClientHeight) - 3;
Left := Form1.Left + GraphprevBtn.Left + 3;
Width := GraphprevBtn.Width; Height := GraphprevBtn.Height; transparentColor := True; TransparentColorValue := clbtnFace;
Show;
end;
GraphPrevBtn.Parent := frm_PrevBtn;
if GetLastError = 0 then z := frm_prevBtn.GetHashCode;
end;
end;
procedure TForm1.GraphPrevBtnMouseLeave(Sender: TObject);
var frm_PrevBtn_H : THandle;
begin
// if form is created then- if mouse is under button then- if z = formshashcode ( form is on creatin stage )
if not (FindVCLWindow(Mouse.CursorPos) = GraphPrevBtn) and ((FindControl(FindWindow('TForm','frm_PrevBtn')) as TForm).Visible = True) and (GraphPrevBtn.Parent = FindControl(FindWindow('TForm','frm_PrevBtn')) as TForm) then begin // if mouse is not under graphprevBtn
ShowMessage(FindVCLWindow(Mouse.CursorPos).Name); //
if z = 112 // then if form is created
then begin
GraphPrevBtn.Parent := Form1;
GraphPrevBtn.bringtoFront;
GraphPrevBtn.Top := 29; GraphPrevBtn.Left := 226;
(FindControl(FindWindow('TForm','frm_PrevBtn')) as TForm).Free;
if GetLastError = 0 then z := 0;
end;
end;
end;
Итак, мое желание следующее:
Когда я вхожу в это GraphPrevBtn с помощью мыши, создается форма. Что касается создан, фокус переходит от управления к новой форме. Поскольку фокус находится на новой форме, событие OnMouseLeave происходит. Когда событие запускается, оно должно уничтожить форму, НО ТОЛЬКО ЕСЛИ пользователь ( НЕ активный контроль / фокусировка ) фактически оставляет управление мышью.
Что происходит сейчас, так это то, что либо новые формы вообще не уничтожаются или оба события идут бесконечным циклом (* frm_PrevBtn * создается и уничтожается снова и снова и снова ... ).
Какое будет лучшее решение?
Моя идея состоит в том, чтобы получить новые формы прямоугольника и проверять, когда мышь находится внутри этого прямоугольника. Если это так, выполните событие allow OnMouseLeave , в противном случае отсоедините его ... будет ли это работать?
Как много я пробовал с этими образцами:
- http://delphi.about.com/od/windowsshellapi/a/get-active-ctrl.htm
http://delphi.about.com/od/delphitips2010/qt/is-some-delphi-tcontrol-under-the-mouse.htm
- Не повезло. Где проблема ...?
Замечания: глобальный var z: byte;
P.S. Спасибо за отрицательные голоса ... отличная мотивация для использования этого сайта в будущем ...