AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Mouseover für Panel + Inhalt

Ein Thema von naridian · begonnen am 25. Jan 2008 · letzter Beitrag vom 28. Jan 2008
Antwort Antwort
naridian

Registriert seit: 12. Jan 2007
56 Beiträge
 
Delphi 2007 Professional
 
#1

Mouseover für Panel + Inhalt

  Alt 25. Jan 2008, 14:58
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
  Mit Zitat antworten Zitat
Benutzerbild von STS301
STS301

Registriert seit: 6. Nov 2007
668 Beiträge
 
Delphi 7 Personal
 
#2

Re: Mouseover für Panel + Inhalt

  Alt 25. Jan 2008, 15:21
probiere es einmal mit Koordinaten
Sebastian

ölpölp

Linux will rule the universe!!
  Mit Zitat antworten Zitat
naridian

Registriert seit: 12. Jan 2007
56 Beiträge
 
Delphi 2007 Professional
 
#3

Re: Mouseover für Panel + Inhalt

  Alt 25. Jan 2008, 19:25
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).
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#4

Re: Mouseover für Panel + Inhalt

  Alt 25. Jan 2008, 19:45
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
  Mit Zitat antworten Zitat
naridian

Registriert seit: 12. Jan 2007
56 Beiträge
 
Delphi 2007 Professional
 
#5

Re: Mouseover für Panel + Inhalt

  Alt 27. Jan 2008, 00:22
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
Angehängte Dateien
Dateityp: zip panelmouseover_363.zip (228,9 KB, 30x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von bitsetter
bitsetter

Registriert seit: 17. Jan 2007
1.169 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: Mouseover für Panel + Inhalt

  Alt 27. Jan 2008, 09:31
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 if Sender is TPanel then prüfen wer der Sender ist und den Code natürlich noch erweitern.
Gruß bitsetter
"Viele Wege führen nach Rom"
Wolfgang Mocker (geb. 1954), dt. Satiriker und Aphoristiker
  Mit Zitat antworten Zitat
Andy090778

Registriert seit: 14. Mai 2006
23 Beiträge
 
Delphi 5 Standard
 
#7

Re: Mouseover für Panel + Inhalt

  Alt 27. Jan 2008, 09:59
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
Andreas
  Mit Zitat antworten Zitat
naridian

Registriert seit: 12. Jan 2007
56 Beiträge
 
Delphi 2007 Professional
 
#8

Re: Mouseover für Panel + Inhalt

  Alt 27. Jan 2008, 13:39
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
  Mit Zitat antworten Zitat
naridian

Registriert seit: 12. Jan 2007
56 Beiträge
 
Delphi 2007 Professional
 
#9

Re: Mouseover für Panel + Inhalt

  Alt 28. Jan 2008, 20:41
Die Idee von Bitsetter funktioniert ganz gut. Leider flackert das Mouseover manchmal. Ich werde mich noch ein bisschen damit herumschlagen.

Gruß, Moritz
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:27 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