Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - OnMousOver / OnMouseOut


FriFra - Sa 31.05.03 10:06
Titel: OnMousOver / OnMouseOut
Wie kann ich die Ereignisse OnMousOver / OnMouseOut implementieren?

OnMouseOver ist noch recht simpel, da es ja bereist OnMouseMove gibt, welches man auch dafür verwenden kann.
Schwierig wird es allerdings mit dem Herausfinden, ob die Maus nicht mehr über dem Element liegt... Ich habe schon versucht dafür OnMouseMove des übergeodneten Control zu nutzen, dass klaptt allerdings nicht immer. Wenn man die Maus sehr schnell aus dem Form herausführt "merkt" das übergeordnete Control manchmal nicht, dass gerade die Maus drüber geführt wurde...


GSE - Sa 31.05.03 10:12

Mit ´nem Timer!

Aber wenn ich mich recht erinnere haben manche Controls schon die Ereignisse OnMouseEnter und OnMouseExit.

mfg
GSE


FriFra - Sa 31.05.03 10:24

An einen Timer habe ich auch schon gedacht, aber wenn ich die Mausposition abfrage bekomme ich ja die Screenkoordinazten. Wie bekomme ich nun sicher heraus an welcher absoluten Position sich das entspr. Control auf dem Screen befindet?
Man könnte meinen die Position wäre Form.Left+Form.Borderwidth+MyControl.Left (linker Rand) und Form.Top+Form.Borderwidth+MyControl.Top (Oberkante), aber schon bei der Oberkante tritt das Problem auf, dass ich nicht weis wie hoch die Titlebar ist (kann je nach Theme varieren)... :roll:


CenBells - Sa 31.05.03 10:27

hallo,

du musst folgende nachrichten abfangen

Delphi-Quelltext
1:
2:
procedure CMMouseEnter(var msg: TMessage); message CM_MOUSEENTER;
procedure CMMouseLeave(var msg: TMessage); message CM_MOUSELEAVE;


Gruß
Ken


FriFra - Sa 31.05.03 10:55

Wie binde ich dieses Messagehandling so ein, dass ich z.B. herausfinde das die Maus auf Edit1 bzw. aus Edit1 bewegt wird?


CenBells - So 01.06.03 10:45

hallo,

also, ich glaube, du musst eine eigene komponente ableiten. Und dann in der neuen Edit komponente im private teil die beiden oben erwähnten prozeduren einbinden und dann kannst du dort halt den zugriff auf ein event realisieren...

zb

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
private
  FMouseEnter: TNotifyEvent;
protected
  procedure DoMouseEnter();
published
  property OnMouseEnter: TNotifyEvent read F...
...

procedure TMeinEdit.CMMouseEnter(var msg: TMessage); message CM_MOUSEENTER; 
begin
  DoMouseEnter;
end;
...
procedure TMeinEdit.DoMouseEnter();
begin
  if assigned(FMouseEnter) then
    FMouseEnter(Self);
end;