![]() |
Mouseover für Panel + Inhalt
Hallo!
Ich möchte dass ein Panel, immer wenn die Maus darüber ist, seine Hintergrundfarbe ändert. Mit den Ereignissten MouseEnter und MouseLeave klappt das gut solange das Panel leer ist. Bei mir befinden sich jedoch jede Menge Komponenten darauf und immer wenn die Maus über eine von denen fährt bekomme ich natürlich ein MouseLeave des Panels. Natürlich könnte ich jetzt bei jedem Element auf dem Panel wieder mit den Enter und Leave Ereignissen arbeiten aber das wäre jedem Menge Code. Wie kann man das geschickter machen? Gruß, Moritz |
Re: Mouseover für Panel + Inhalt
probiere es einmal mit Koordinaten
|
Re: Mouseover für Panel + Inhalt
Wie genau meinst du das? Soll ich das mousemove Ereignis des Formulars benutzen? Ich habe es mit mousemove des Frames in dem sich das panel befindet versucht, das hat nicht geklappt (es kam kein Ereignis wenn die Maus auf dem Panel war).
|
Re: Mouseover für Panel + Inhalt
Hallo Moritz,
du könntest im MouseLeave-Handler prüfen, ob sich der Mauszeiger noch im Bereich des Panels befindet:
Delphi-Quellcode:
Gruß Hawkeye
procedure Form1.Panel1MouseLeave(Sender: TObject);
var Panel : TPanel; P : TPoint; begin Panel := Sender as TPanel; P := Panel.ScreenToClient(Mouse.CursorPos); if (not PtInRect(Panel.ClientRect, P)) then Panel.Color := clBtnFace; end; |
Re: Mouseover für Panel + Inhalt
Liste der Anhänge anzeigen (Anzahl: 1)
Danke! So richtig gut funktioniert es aber leider noch nicht. Wenn man die Maus schnell über die Panels bewegt merkt er manchmal nicht wenn das Panel verlassen wird. Woran kann das liegen? Ich habe mein kleines Testprogramm angehängt. Ich glaube die Buttons auf den Panels machen die Probleme.
Gruß, Moritz |
Re: Mouseover für Panel + Inhalt
Hi,
deine Buttons hast du ja total an den Rand des Panels gesetzt, dann funktioniert es natürlich nicht. Wenn du dann vom Button auf das Formular kommst, wird kein onMouseLeave mehr ausgelöst. Dann musst du wohl auch bei jedem Button wieder onMouseLeave abfragen oder du machst ein onMouseEnter im Formular und prüfst dort, ob ein Panel noch rot ist und setzt es dann zurück. Am einfachsten wär es natürlich wenn du einen gewissen Abstand zum Rand des Panels ein hältst. Warum machst du überhaupt für jedes Panel ein eigenes onMouseLeave und onMouseEnter damit blähst du deinen Code doch nur unnötig auf? Es reicht doch, wenn du im OT jeden die gleiche Prozedur zuweist. Wenn du den Code abkürzen möchtest kannst du auch allen Controls auf den Panels das gleiche Ereignis zuweisen:
Delphi-Quellcode:
Dann musst du noch mit
type
TMyControl= class(Controls.TControl); procedure TForm1.FormShow(Sender: TObject); var i: integer; begin for i:= 0 to Panel1.ControlCount- 1 do TMyControl(Panel1.Controls[i]).OnMouseLeave:= Panel1.OnMouseLeave; end;
Delphi-Quellcode:
prüfen wer der Sender ist und den Code natürlich noch erweitern.
if Sender is TPanel then
|
Re: Mouseover für Panel + Inhalt
Das Problem ist, wenn Du die Maus außerhalb Deines Programms bewegst.
Bei schnellen Bewegungen führt Windows kein Mouse Ereignis auf der Delphi-Form aus und stellt nur fest, dass nun ein anderes Programm oder der Desktop die Maus "benutzt". Ich hab nur D5, da gibts das Ereignis nicht. Dachte eigentlich, dass sowas bei einem Leave-Event abgefangen wird. Von dem her finde ich das Event unbrauchbar. Der vorherige Vorschlag die Panels woanders hinzusetzen ist genauso unbrauchbar. Probiers mal mit folgendem Code in einem Timer, den Du alle 100ms aufrufst:
Delphi-Quellcode:
oder guck obs ein Form-MouseLeave gibt, mit dem es funktioniert.
var
tp: TPoint; begin GetCursorPos(tp); tp := ScreenToClient(tp); if (not PtInRect(Panel.ClientRect, P)) then begin // reset all colors end; end; Grüße Andreas |
Re: Mouseover für Panel + Inhalt
Die Buttons habe ich so nah an den Rand gesetzt um den Effekt zu verdeutlichen. Das Problem tritt aber auch dann noch auf wenn alle Elemente 20px vom Rand entfernt liegen, nur seltener. Leider ist es auch nicht so dass man das Programm verlassen muss um das Mouseleave nicht zu erhalten. Es genügt die Maus schnell im Programm zu bewegen.
Den Tip allen Controls die selbe Prozedur zuzuweisen teste ich noch. Ich hatte das allerdings schon mal versucht. Es hat zwar funktioniert, aber es gab aber ein Flackern. Gruß, Moritz |
Re: Mouseover für Panel + Inhalt
Die Idee von Bitsetter funktioniert ganz gut. Leider flackert das Mouseover manchmal. Ich werde mich noch ein bisschen damit herumschlagen.
Gruß, Moritz |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:24 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