![]() |
OnMouseEnter bzw. -Leave-Events realisieren
Hallo Community,
ich bins mal wieder. Derzeit programmiere ich für mich privat ein kleines Tool. Ich habe mir in einer Extra-Unit eine eigene Klasse von TToolBar abgeleitet und darauf liegen diverse andere Objekte wie TLabel, TPanel usw. Jetzt habe ich ein kleines Problem. Unter anderem Liegt auf dieser Komponente ein Panel, welches bei OnMouseEnter größer und bei OnMouseLeave kleiner werden soll. Soweit ist es klar und funktioniert auch einwandfrei, vorallem durch die Funktion AnimationFloat() sieht es super aus. Allerdings funktioniert das natürlich nicht mehr, wenn auf eben diesem Panel beispielsweise ein TEdit liegt. Denn wenn ich mit der Maus darüber fahre, tritt ja das OnMouseLeave-Event in Kraft, da die Maus sich nun über dem Edit befindet. Genau das soll aber nicht passieren. Ich hoffe ihr versteht was ich meine und könnt mir einen kleinen Tipp geben. P.S.: Mein erster Gedanke war, den auf dem Panel liegenden Objecten einfach dieselben Events zuzuweisen, aber dann treten die Events zu oft in Kraft. |
AW: OnMouseEnter bzw. -Leave-Events realisieren
Nur so ein Gedanke: im OnMouseLeave das Control unter dem Mauszeiger ermitteln und (ggf. rekursiv) dessen Parent untersuchen. Ist das irgendwann das Panel selbst, dann ignorieren.
|
AW: OnMouseEnter bzw. -Leave-Events realisieren
Zitat:
|
AW: OnMouseEnter bzw. -Leave-Events realisieren
In der VCL habe ich das mal so gelöst:
Delphi-Quellcode:
Funktioniert meistens ganz gut, aber nicht 100%ig.
procedure TodPanelCourt.CMMouseEnter(var Message: TMessage);
begin inherited; if not odExist(odCourt) then Exit; if not odPanelGame.Visible then Exit; BitBtnCancel.Visible := True; BitBtnCancel.Left := Width - BitBtnCancel.Width; BitBtnCancel.Top := 0; end; procedure TodPanelCourt.CMMouseLeave(var Message: TMessage); var pt: TPoint; H: hwnd; begin inherited; if not odExist(odCourt) then Exit; GetCursorPos(pt); H := WindowFromPoint(pt); if (H = Handle) or (H = BitBtnCancel.Handle) then Exit; BitBtnCancel.Visible := False; end; Ansonsten könnte man sich mit einem Timer behelfen, der nach einer Verzögerung prüft, ob die Aktion noch relevant ist. Die mögliche Startverzögerung der Animation wird da sicher nicht helfen, die die vermutlich nicht mehr abzubrechen ist - oder? |
AW: OnMouseEnter bzw. -Leave-Events realisieren
@DeddyH: Die Idee finde ich gut, aber ich bekomme die rekursive Abfrage nicht gebacken. :(
|
AW: OnMouseEnter bzw. -Leave-Events realisieren
Du ermittelst den Parent des Controls. Ist das Dein Panel oder ein Formular, weißt Du ja schon Bescheid, ansonsten ermittelst Du den Parent des Parents und vergleichst wieder, und zwar solange, bis er nil, ein Formular oder eben Dein Panel ist.
|
AW: OnMouseEnter bzw. -Leave-Events realisieren
Ganz anderer Ansatz:
Delphi-Quellcode:
var
IsInside: Boolean; procedure TForm2.Panel1MouseEnter(Sender: TObject); begin if not IsInside then begin IsInside := true; // TODO: end; end; procedure TForm2.Panel1MouseLeave(Sender: TObject); var P: TPoint; begin GetCursorPos(P); Panel1.ScreenToClient(P); if not PtInRect(Panel1.ClientRect, P) then begin IsInside := false; // TODO: end; end; |
AW: OnMouseEnter bzw. -Leave-Events realisieren
Oder etwas kürzer (ungetestet):
Delphi-Quellcode:
var
IsInside: Boolean; procedure TForm2.Panel1MouseEnter(Sender: TObject); begin IsInside := true; end; procedure TForm2.Panel1MouseLeave(Sender: TObject); begin IsInside := PtInRect(TPanel(Sender).ClientRect, TPanel(Sender).ScreenToClient(Mouse.CursorPos)); end; |
AW: OnMouseEnter bzw. -Leave-Events realisieren
@Zacherl & @DeddyH: Die Idee finde ich gut! Leider finde ich das ClientRect nicht wirklich. Jedenfalls wenn ich über "Refactur" -> "Unit suchen" gehe, zeigt er mir zwar eine Unit an, und implementiert diese auch, aber das TPanel (bzw. in meinem Fall die TToolBar) hat derartiges nicht. :(
Lediglich ClipRect gibt es, aber das enthält merkwürdige Werte: Left & Top = 0... Was doch ja nicht Sinn der Sache ist. |
AW: OnMouseEnter bzw. -Leave-Events realisieren
ClientRect gibt es ab TControl. Oder ist das am Ende eine Firemonkey-Anwendung? Da könnte es natürlich sein, dass es eine solche Property nicht gibt, das kann ich aber mangels Firemonkey nicht sagen.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:21 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz