MouseEnter-MouseLeave-Problematik

Rund um die LCL und andere Komponenten
Antworten
u-boot
Beiträge: 308
Registriert: Do 9. Apr 2009, 10:10
OS, Lazarus, FPC: Ubuntu 9.10 (L 0.9.28 FPC 2.2.4)
CPU-Target: 32Bit
Wohnort: 785..

MouseEnter-MouseLeave-Problematik

Beitrag von u-boot »

Meine Komponente besteht aus einem Label und eine Shape

Kurz:

Code: Alles auswählen

TMyClass = class(TCustomcontrol);
  ...  
    FLabel:TLabel;
    FShape:Tshape; 
  ...
  end;
Ich möchte nun das OnMouseEnter und OnMouseLeave für TMyClass richtig implementieren.

Richtig heisst für mich: OnMouseEnter nur auslösen, wenn die Mauszeigerposition von ausserhalb der Komponente auf eine
Mauszeigerposition innerhalb der Komponente wechselt.
Da nun FLabel und FShape zur Komponente gehört soll bei einem Mauszeigerposiionswechsel zwischen diesen Unterkomponenten kein MouseEnter-Event ausgeführt werden.

Die Möglichkeit eine zusätzliche Transparente Unterkomponente über meine gesamte Komponente zu legen find ich irgendwie nicht so sehr elegant. Es könnte passieren, dass ich FLabel und FShape in anderen Dingen später noch getrennt behandeln möchte.

Noch paar Zeilen Code als Vorlage und damit klar ist was schon vorhanden ist.

Code: Alles auswählen

constructor TMyClass.Create(AOwner: TComponent);
begin
...
    FShape.OnMouseEnter:=@MouseEnterTrans;
    FLabel.OnMouseEnter:=@MouseEnterTrans;
...
end;
 
procedure TMyClass.MouseEnterTrans(Sender: TObject);
begin
  if Assigned(OnMouseEnter) then OnMouseEnter(self as TObject);
end;
 
procedure TMyClass.MouseLeaveTrans(Sender: TObject);
begin
  if Assigned(OnMouseLeave) then OnMouseLeave(self as TObject);
end;
 
procedure TMyClass.MouseEnter;
begin
 inherited MouseEnter;
end;
 
procedure TMyClass.MouseLeave;
begin
  inherited MouseLeave;
end;
 
function TMyClass.GetMouseEntered: Boolean;
begin
  Result:=FLabel.MouseEntered or FShape.MouseEntered or TControl(self).MouseEntered;
end;
Ubuntu 9.10 (L 0.9.28 FPC 2.4.x)

u-boot
Beiträge: 308
Registriert: Do 9. Apr 2009, 10:10
OS, Lazarus, FPC: Ubuntu 9.10 (L 0.9.28 FPC 2.2.4)
CPU-Target: 32Bit
Wohnort: 785..

Re: MouseEnter-MouseLeave-Problematik

Beitrag von u-boot »

ehm ist die frage nun zu schwer zu einfach oder falsch gepostet ?
Ubuntu 9.10 (L 0.9.28 FPC 2.4.x)

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: MouseEnter-MouseLeave-Problematik

Beitrag von pluto »

Ich glaube es kann sich keiner genau vor stellen, was du genau erreichen möchtest damit. Könntest du einige Beispiele liefern ?
Ich habe das jetzt so verstanden:
Du hast zwei Komponenten. Ein Label und ein Shape. In beiden Komponenten möchtest du das OnMouseEnter und OnMouseLeave Event Behandeln. Allerdings soll nur eins davon ausgelöst werden. D.H. schiebe ich die Maus zu erst ins label und danach ins Shape, soll das onMouseEnter beim Shape nicht ausgelöst werden. Fange ich beim Shape an, soll das Event onMouseEnter im Label nicht ausgelöst werden.

Ist das soweit richtig ?
MFG
Michael Springwald

Benutzeravatar
theo
Beiträge: 10904
Registriert: Mo 11. Sep 2006, 19:01

Re: MouseEnter-MouseLeave-Problematik

Beitrag von theo »

u-boot hat geschrieben:ehm ist die frage nun zu schwer zu einfach oder falsch gepostet ?
Eine Frage hat normalerweise ein Fragezeichen. Ich sehe bei deinem ersten Beitrag keins.
Vielleicht liegt's daran, dass da keiner was dazu sagt.

Ausserdem gibt es Dinge, die muss man selber lösen weil sie für andere nicht so interessant sind.

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: MouseEnter-MouseLeave-Problematik

Beitrag von pluto »

Ausserdem gibt es Dinge, die muss man selber lösen weil sie für andere nicht so interessant sind.
Oder weil sie es nicht nachvollziehen können, weil es zu wenige Informationen über das Problem gibt.
MFG
Michael Springwald

u-boot
Beiträge: 308
Registriert: Do 9. Apr 2009, 10:10
OS, Lazarus, FPC: Ubuntu 9.10 (L 0.9.28 FPC 2.2.4)
CPU-Target: 32Bit
Wohnort: 785..

Re: MouseEnter-MouseLeave-Problematik

Beitrag von u-boot »

Ok ich hab mal nen Schema dazu gemacht.

Grün gestrichelt - Fläche der Komponente TMyClass
Gelb - Fläche von FShape
Blau - Fläche von FLabel
Roter Pfeil- Weg der Maus
Orangenes X - Hier soll das TMyClass.MouseEnter aufgerufen werden.
Violettes X- Hier soll TMyClass.OnMouseLeave aufgerufen werden.
Rotes X - Hier soll kein MouseEnter-Event von TMyclass aufgerufen werden und hier soll auch nicht.

Kurz gesagt ... MouseEnter oder MouseLeave soll aufgerufen werden wenn die Maus die grün gestrichelte Linie überquert und sonst nicht.
Wie ist sowas einfach und einigermassen elegant zu programmieren ?
Dateianhänge
mouseenter.jpg
Ubuntu 9.10 (L 0.9.28 FPC 2.4.x)

gtom
Beiträge: 11
Registriert: Do 7. Jan 2010, 17:31

Re: MouseEnter-MouseLeave-Problematik

Beitrag von gtom »

Hallo,
Eine einfache Variable wie :

Move1,Move2: Boolean;

hilft hier ungemein...

Dann brauchste OnMouseMove (für alle Komponenten)

Code: Alles auswählen

Komp1.OnMousesMove:= DoMouseMove1;
Komp2.OnMouseMove:= DoMouseMove2;
 
procedure DoMouseMove1:
if not Move1then
  begin
    NeuImControl;
   Move1:= True;
 
//und für beide Komp. das OnMouseExit:
  Move1;= False;
wenn Move1 und Move2 False dann innerh. Control ansonsten von ausserhalb...
Ist es das ???

u-boot
Beiträge: 308
Registriert: Do 9. Apr 2009, 10:10
OS, Lazarus, FPC: Ubuntu 9.10 (L 0.9.28 FPC 2.2.4)
CPU-Target: 32Bit
Wohnort: 785..

Re: MouseEnter-MouseLeave-Problematik

Beitrag von u-boot »

Sry Pluto dass ich dich in der letzten Erklärung nicht erwähnt hab... und ja du hast recht.

Danke für deinen Vorschlag @gtom. ich kann mir nach dem Durchlesen allerdings nicht vorstellen, dass er funktionieren könnte.

Code: Alles auswählen

procedure DoMouseMove1:
if not Move1 then
begin
NeuImControl;
Move1:= True;
Die Procedure ist vom Prinzip her ein zweites TMyClass.Komponente1.OnMouseEnter
Das Move1 ist vom Prinzip her ein zweites TMyClass.Komponente1.MouseEntered

Code: Alles auswählen

unf für beide Komp. das OnMouseExit:
Move1;= False;
Das ist TMyClass.Komponente1.OnMouseLeave


Die Problematik an diesem inneren Übergang von Komponente1 zu Komponente2:

Ausgangszustand:
Komponente1.MouseEntered=True
Komponente2.MouseEntered=False

Beim Übergang passiert nun zuerst ein Komponente1.MouseLeave. Zustand dann:
Komponente1.MouseEntered=False
Komponente2.MouseEntered=False

Darauf folgt nun Komponente2.MouseEnter ... Der Zustand ist allerdings gleich wie wenn die Maus von aussen kommt
Ubuntu 9.10 (L 0.9.28 FPC 2.4.x)

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: MouseEnter-MouseLeave-Problematik

Beitrag von pluto »

Was genau möchtest du damit erreichen ? Vielleicht gibt es noch andere Lösungen... du musst die Komponenten Irgendwie zu Gruppen verbinden... sonst hast du ein Problem...
MFG
Michael Springwald

Antworten