Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Mouseover für Panel + Inhalt (https://www.delphipraxis.net/107301-mouseover-fuer-panel-inhalt.html)

naridian 25. Jan 2008 13:58


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

STS301 25. Jan 2008 14:21

Re: Mouseover für Panel + Inhalt
 
probiere es einmal mit Koordinaten

naridian 25. Jan 2008 18:25

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).

Hawkeye219 25. Jan 2008 18:45

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:
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;
Gruß Hawkeye

naridian 26. Jan 2008 23:22

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

bitsetter 27. Jan 2008 08:31

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:
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;
Dann musst du noch mit
Delphi-Quellcode:
if Sender is TPanel then
prüfen wer der Sender ist und den Code natürlich noch erweitern.

Andy090778 27. Jan 2008 08:59

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:
var
 tp: TPoint;
begin
  GetCursorPos(tp);
  tp := ScreenToClient(tp);
  if (not PtInRect(Panel.ClientRect, P)) then
  begin
    // reset all colors
  end;
end;
oder guck obs ein Form-MouseLeave gibt, mit dem es funktioniert.

Grüße
Andreas

naridian 27. Jan 2008 12:39

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

naridian 28. Jan 2008 19:41

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 09:08 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz