AGB  ·  Datenschutz  ·  Impressum  







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

OnMouseEnter bzw. -Leave-Events realisieren

Ein Thema von sintronic86 · begonnen am 11. Dez 2012 · letzter Beitrag vom 13. Dez 2012
Antwort Antwort
Seite 1 von 2  1 2      
sintronic86

Registriert seit: 7. Dez 2009
Ort: Barsinghausen
90 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

OnMouseEnter bzw. -Leave-Events realisieren

  Alt 11. Dez 2012, 14:46
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.
Björn
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#2

AW: OnMouseEnter bzw. -Leave-Events realisieren

  Alt 11. Dez 2012, 15:05
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#3

AW: OnMouseEnter bzw. -Leave-Events realisieren

  Alt 11. Dez 2012, 15:16
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.
Dazu noch ne Boolean Hilfsvariable, damit man auch OnMouseEnter ignorieren kann, wenn von einem Child Control wieder zurück aufs Panel gesprungen wird.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: OnMouseEnter bzw. -Leave-Events realisieren

  Alt 11. Dez 2012, 17:13
In der VCL habe ich das mal so gelöst:

Delphi-Quellcode:
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;
Funktioniert meistens ganz gut, aber nicht 100%ig.

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?
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
sintronic86

Registriert seit: 7. Dez 2009
Ort: Barsinghausen
90 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

AW: OnMouseEnter bzw. -Leave-Events realisieren

  Alt 12. Dez 2012, 08:33
@DeddyH: Die Idee finde ich gut, aber ich bekomme die rekursive Abfrage nicht gebacken.
Björn
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#6

AW: OnMouseEnter bzw. -Leave-Events realisieren

  Alt 12. Dez 2012, 08:59
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#7

AW: OnMouseEnter bzw. -Leave-Events realisieren

  Alt 12. Dez 2012, 11:50
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;
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#8

AW: OnMouseEnter bzw. -Leave-Events realisieren

  Alt 12. Dez 2012, 12:02
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;
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
sintronic86

Registriert seit: 7. Dez 2009
Ort: Barsinghausen
90 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#9

AW: OnMouseEnter bzw. -Leave-Events realisieren

  Alt 12. Dez 2012, 16:10
@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.
Björn
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#10

AW: OnMouseEnter bzw. -Leave-Events realisieren

  Alt 12. Dez 2012, 16:13
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 08:02 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