![]() |
OnMouseMove verzögern
Hallo!
Bin mir fast sicher, dass es das schon gibt, nur kann ichs nicht finden: :wall: Mit OnMouseMove kann ich sofort reagieren, wenn die Maus über ein bestimmtes Objekt bewegt wird; ich will aber erst nach einer gewissen Verzögerung reagieren. Wie kann man das realisieren? Grüße Faux |
Re: OnMouseMove verzögern
vielleicht mit delay?
guck mal in die codelib. |
Re: OnMouseMove verzögern
Zitat:
Kannst mir da ein Beispiel nennen? Grüße Faux |
Re: OnMouseMove verzögern
oder meinst du, das der cursor mindestens X sekunden da ist und dann erst was passiert?
dann: ein timer der ausgelöst wird wenn der cursor über das ding geht. ne boolsche variable die bei mouseover true wird und und dann in der prozedur nochmal abgeprüft wird. |
Re: OnMouseMove verzögern
ich glaub er will es so wie bei einem Hint du gehst drauf und dann kommt erst in ca. einer Sekunde das Hint ;-)
|
Re: OnMouseMove verzögern
Mein Vorschlag:
Einfach eine Integer-Zählvariable nehmen (z.B. die Tag-Eigenschaft), die bei OnMouseMove hochgezählt wird. Bei einem bestimmten Wert der Zählvariable (z.B. if Tag > 50 then...) wird dann das Ereignis ausgelöst. Bei OnMouseLeave natürlich wieder auf 0 stellen! (Tag := 0; ) |
Re: OnMouseMove verzögern
Und wenn man jetzt die Maus reinfährt und die Maus dann stehenlässt? dann wars das
ich würd im OnMouseMove einen Timer starten, wenn dieser beendet ist und die Maus immernoch über dem Control, kann man den Hint anzeigen (oder was immer man machen will). EDIT: Man muss im Timer eigentlich nicht einmal was überprüfen - man kann einfach im OnMouseLeave den Timer stoppen. |
Re: OnMouseMove verzögern
Zitat:
In OnMouseEnter den Timer aktivieren und in OnMouseLeave deaktivieren :wink: //Edit: Wieso komm ich eigentlich auf die bescheuerte Idee, dass es sowas wie OnMouseEnter und OnMouseLeave gibt? Stell grad fest: Sowas gibts ja gar nich :duck: |
Re: OnMouseMove verzögern
Es gibt seht wohl ein
Zitat:
|
Re: OnMouseMove verzögern
Zitat:
|
Re: OnMouseMove verzögern
:gruebel:
Würd mich wundern, wenn das nicht im TWinControl schon drin ist... Alle Komponenten, die ich mir grad angeschaut habe (TPageControl, TPanel, TCategoryButtons) haben beide Ereignisse. |
Re: OnMouseMove verzögern
Zitat:
Delphi-Quellcode:
type
tmyPanel = class(TPanel) public procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER; procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE; end; TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} { tmyPanel } procedure tmyPanel.CMMouseEnter(var Message: TMessage); begin Form1.Caption := 'CMMouseEnter'; end; procedure tmyPanel.CMMouseLeave(var Message: TMessage); begin Form1.Caption := 'CMMouseLeave'; end; procedure TForm1.FormCreate(Sender: TObject); var mPanel: TPanel; begin mPanel := tmyPanel.Create(Self); with mPanel do begin Name := 'myPanel'; Parent := Self; Left := 10; Top := 10; Width := 185; Height := 41; Caption := 'Panel1'; TabOrder := 0; end; end; |
Re: OnMouseMove verzögern
Zitat:
Da gibts nur OnMouseMove. @sniper_w: Ja, natürlich. Diese zwei Ereignisse kann man sich leicht selber bauen, aber von Haus aus sind die wohl nur beim TLabel dabei... |
Re: OnMouseMove verzögern
Hallo!
Ja, ich will erst dann reagieren, wenn der Cursor mindestens eine bestimmte Zeit auf meinem SysTray-Icon ist (welches ich übrigens mit TJvTrayIcon realisieren (dort gibts kein OnMouseEnter/Leave)). Zitat:
Grüße Faux |
Re: OnMouseMove verzögern
das hab ich doch in meinem Edit schon geschrieben. Implementiere einfach die Messages, die sniper_w genannt hat, falls sie noch nicht in deiner wunschkomponente vorhanden sind.
Dann: - im OnMouseEnter Timer starten - im OnMouseLeave Timer beenden - im OnTimer Aktion starten (meinetwegen Hint anzeigen oder w/ever) Ohne Timer? Du brauchst irgendwas, mit dem du die Zeit misst... und eine timer-message ist da sehr bequem. |
Re: OnMouseMove verzögern
Zitat:
Zitat:
Grüße Faux |
Re: OnMouseMove verzögern
Zitat:
Was hab ich denn drüber geschrieben? Du sollst die Messages implementieren. Du weisst nicht, das bedeutet?
Delphi-Quellcode:
Sonst noch Wünsche? Soll ich dir n heisses Bad einlassen?
type
tmyPanel = class(TPanel) public FMouseLeave, FMouseEnter: TNotifyEvent; procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER; procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE; constructor Create(AOwner: TComponent); override; published property OnMouseEnter: TNotifyEvent read FMouseEnter write FMouseEnter; property OnMouseLeave: TNotifyEvent read FMouseLeave write FMouseLeaver; end; implementation {$R *.dfm} { tmyPanel } procedure tmyPanel.CMMouseEnter(var Message: TMessage); begin if Assigned(OnMouseEnter) then OnMouseEnter(self); end; procedure tmyPanel.CMMouseLeave(var Message: TMessage); begin if Assigned(OnMouseLeave) then OnMouseEnter(self); end; procedure tmyPanel.Create(AOwner: TComponent); begin inherited Create(AOwner); OnMouseEnter := nil; OnMouseLeave := nil; end; end. EDIT: Seitenhieb entfernt. |
Re: OnMouseMove verzögern
Zitat:
@Topic: Jo, sorry, da hab ich mich etwas verlesen. Joa, so werd ichs machen. Danke. :) Grüße Faux |
Re: OnMouseMove verzögern
Sorry... hab das entfernt.
|
Re: OnMouseMove verzögern
Wies scheint hab ich da was falsch gemacht. Es funktioniert nicht. :S
Delphi-Quellcode:
unit Unit2;
interface uses Messages, Classes, Controls, JvTrayIcon; type TCustomJvTrayIcon = class(TJvTrayIcon) private FMouseEnter, FMouseLeave: TNotifyEvent; procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER; procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE; public constructor Create(AOwner: TComponent); override; published property OnMouseEnter: TNotifyEvent read FMouseEnter write FMouseEnter; property OnMouseLeave: TNotifyEvent read FMouseLeave write FMouseLeave; end; implementation procedure TCustomJvTrayIcon.CMMouseEnter(var Message: TMessage); begin if Assigned(FMouseEnter) then OnMouseEnter(Self); end; procedure TCustomJvTrayIcon.CMMouseLeave(var Message: TMessage); begin if Assigned(FMouseLeave) then OnMouseLeave(Self); end; constructor TCustomJvTrayIcon.Create(AOwner: TComponent); begin inherited Create(AOwner); OnMouseEnter := nil; OnMouseLeave := nil; end; end.
Delphi-Quellcode:
Woran liegt das?!
procedure TForm1.FormCreate(Sender: TObject);
begin TrayIcon := TCustomJvTrayIcon.Create(Self); TrayIcon.Active := True; TrayIcon.OnMouseEnter := TrayIconMouseEnter; TrayIcon.OnMouseLeave := TrayIconMouseLeave; end; procedure TForm1.TrayIconMouseEnter(Sender: TObject); begin Label1.Caption := 'Entered'; end; procedure TForm1.TrayIconMouseLeave(Sender: TObject); begin Label1.Caption := 'Left'; end; Ich weiß, ich werf' euch jetzt einfach so nen Code hin, so nach dem Motto sucht den Fehler, aber ich habe leider keinen Plan wo der Fehelr liegen kann. :oops: Grüße Faux |
Re: OnMouseMove verzögern
hmm...
Ich blick da grad nicht ganz durch (durch den Jedi-Source), es könnte sein, dass beim TrayIcon diese message nie ankommt, weil das TrayIcon in den Infos, die es an Windows übergibt um das TrayIcon anzuzeigen, eine iegene Botschaftsschleife bzw. ein eigenes Fenster übergibt. Ich schaus mir nochmal an. EDIT: Watson, Sie sind ein Genie...
Delphi-Quellcode:
-> es wird ein eigenes, nichtsichtbares Fenster erzeugt, in dem die Botsschaftschleife steckt, in die WIndows die ganzen Messages schickt.
FHandle := AllocateHWndEx(WndProc);
Also, ausgerechnet hier hauts nicht hin. du müsstest die WndProc also selber verbiegen, wie man das macht, habe ich anderswo geschrieben... hier: ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:42 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz