![]() |
kein OnMouseEnter/-Leave wärend VCL-Ereignisprozedur läuft
Tachchen ^^
So, wärend meine ButtonClickProzedur arbeitet und obwohl mehrmals die Sekunde Application.ProcessMessages aufgerufen wird, werden dennoch keine OnMouseEnter-/OnMouseLeave-Ereignisprozeduren ausgeführt. Alles Andere, wie z.B. OnMouseMove funktioniert aber. Is jetzt zwar nichts Weltbewegendes, da ich dort nichts wirklich wichtiges drin mache, aber dennoch störts mich halt etwas. Falls da wer 'ne nicht all zu aufwändige Lösung kennt ... wäre echt nett. In SearchSameFiles werden die Links unter [?] > Contact ja unterstrichen, wärend die Maus drüber ist. Tja, aber halt nicht, wärend z.B. grad die Dateisuche läuft. > ![]() In der Titelleiste des Programms tauchen beim Aufrufen der Ereignisprozeduren Buchstaben auf: L = OnMouseLeave wurde aufgerufen E = OnMouseEnter wurde aufgerufen Was bei mir halt nicht passiert, wärend die Suche läuft. |
Re: kein OnMouseEnter/-Leave wärend VCL-Ereignisprozedur läu
Dumme Frage zwar aber naja, ist das ein Label oder was ?
|
Re: kein OnMouseEnter/-Leave wärend VCL-Ereignisprozedur läu
Jupp, ein ganz normales TLabel aus Delphis VCL.
Delphi-Quellcode:
Und wärend ich im Grunde ja nur soeine Schleife laufen hab, werden die beiden Ereignisse nicht mehr ausgeführt.
Type TForm1 = Class(TForm)
Label12: TLabel; Procedure Label12MouseEnter(Sender: TObject); Procedure Label12MouseLeave(Sender: TObject); End; Implementation Procedure TForm1.Label12MouseEnter(Sender: TObject); Begin TLabel(Sender).Font.Style := TLabel(Sender).Font.Style + [fsUnderline]; Caption := 'E' + Caption; End; Procedure TForm1.Label12MouseLeave(Sender: TObject); Begin TLabel(Sender).Font.Style := TLabel(Sender).Font.Style - [fsUnderline]; Caption := 'L' + Caption; End;
Delphi-Quellcode:
[edit]
Procedure TForm1.Button1Click(Sender: TObject);
Begin ... Repeat ... Application.ProcessMessages; Until ...; ... End; dieses Caption := '*' + Caption; is nur drin, damit ich leicht erkenne, ob die Ereignisprozeduren aufgerufen wurden. (hätt ja sein können, dat nur der StyleChange ignoriert wird) |
Re: kein OnMouseEnter/-Leave wärend VCL-Ereignisprozedur läu
Liste der Anhänge anzeigen (Anzahl: 2)
So, hier mal in 'nem einzelnem Programm.
@turboPASCAL: du wirst sehn, mit der Zeit hat es nichts zu tun. Wärend eine der beiden OnClick(Button)-Prozeduren läuft, wird da nichts mehr unterstrichen. Beim Timer geht es jedoch, auch wenn dort das OnMouseMove etwas langsamer reagiert (dort kommt immer nur die letzte Nachricht an). |
Re: kein OnMouseEnter/-Leave wärend VCL-Ereignisprozedur läu
Also, Windows-Messages (WM_MOUSEMOVE) werden verarbeitet, CM_MOUSEENTER ist keine Windows-Message
sondern ein Delphieigenes Ding. Müsste man mal in die Controls.pas gucken. |
Re: kein OnMouseEnter/-Leave wärend VCL-Ereignisprozedur läu
CM_MOUSEENTER wird doch aber auch als Message an das Label geschickt.
OK, kann ja mal versuchen rauszufinden wo dieses verschickt wird ... vielleich läuft der Teil einfach nur nicht, wärend eine Ereignisprozedur der VCL ausgeführt wird :shock: |
Re: kein OnMouseEnter/-Leave wärend VCL-Ereignisprozedur läu
Tja, die Unit Controls und die entstrechenden Units als Source hab ich leider nicht,
kann also nicht reinschauen. Aus den Kopf weis ich nur das zB. CM_MOUSEENTER irgendwas mit CM_BASE + 19 ( :gruebel: ) ist. Warum machst du denn das Suchen nicht in einen Thread, Repeat-Until würde ich eh nicht für so "lange" Suchfunktionen nutztn.... |
Re: kein OnMouseEnter/-Leave wärend VCL-Ereignisprozedur läu
Liste der Anhänge anzeigen (Anzahl: 2)
Das Suchen läuft ja in 'nem Thread ab ... in der Schleife wird ja "nur" auf das Ende des Suchthreads gewartet.
So, hab nun mal tief gesucht und so... *schweißabwisch* CM_MOUSEENTER (CM_BASE + 19) und CM_MOUSELEAVE (CM_BASE + 20) wird in TApplication.DoMouseIdle ausgelöst, welches über TApplication.Idle aufgerufen wird. TApplication.Idle wird aber leider nur in TApplication.HandleMessage aufgerufen, wenn sonst keine Messages vorhanden waren. Da ich nur Application.ProcessMessages regelmäßig aufrufe und wärend die Buttonprozedur abgearbeitet wird von der VCL kein TApplication.HandleMessage ausgeführt wird, kann es leider nicht funktionieren. :cry:
Delphi-Quellcode:
TApplication.HandleMessage kann ich nicht selber aufrufen, da sonst der Hauptthread Aufgrund mangelnder Messages einfrieren kann.
procedure TApplication.ProcessMessages;
var Msg: TMsg; begin while ProcessMessage(Msg) do {loop}; end; procedure TApplication.HandleMessage; var Msg: TMsg; begin if not ProcessMessage(Msg) then Idle(Msg); end; Im Anhang mal eine Datei mit Application.ProcessMessages und Application.HandleMessage in der Schleife ... leider bleibt da Anzeige stehen, wenn keine Messages (z.B. durch das Bewegen der Maus über die Form) mehr empfangen werden. > der Zähler unterm Stopp-Button steht, wenn z.B. keine Maus über der Form bewegt wird. Da Idle den Haupthtread schlafen legt, ich DoMouseIdle nicht direkt aufrufen kann und es unschön wäre, wenn ich z.B. vom Thread aus ständig den Hauptthread mit (Blind)Nachrichten bombadiere, nur damit der nicht einschlaft, werd' ich wohl damit Leben müssen. (z.B. auf 'nen Timer umzustellen wollt' ich halt nich) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:21 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 by Thomas Breitkreuz