Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi kein OnMouseEnter/-Leave wärend VCL-Ereignisprozedur läuft (https://www.delphipraxis.net/89333-kein-onmouseenter-leave-waerend-vcl-ereignisprozedur-laeuft.html)

himitsu 29. Mär 2007 16:54


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.


> http://www.delphipraxis.net/internal...=701631#701631

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.

turboPASCAL 29. Mär 2007 19:21

Re: kein OnMouseEnter/-Leave wärend VCL-Ereignisprozedur läu
 
Dumme Frage zwar aber naja, ist das ein Label oder was ?

himitsu 30. Mär 2007 11:36

Re: kein OnMouseEnter/-Leave wärend VCL-Ereignisprozedur läu
 
Jupp, ein ganz normales TLabel aus Delphis VCL.

Delphi-Quellcode:
  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;
Und wärend ich im Grunde ja nur soeine Schleife laufen hab, werden die beiden Ereignisse nicht mehr ausgeführt.
Delphi-Quellcode:
Procedure TForm1.Button1Click(Sender: TObject);
  Begin
    ...
    Repeat
      ...  
      Application.ProcessMessages;
    Until ...;
    ...
  End;
[edit]
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)

himitsu 31. Mär 2007 15:14

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).

turboPASCAL 31. Mär 2007 17:48

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.

himitsu 2. Apr 2007 11:19

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:

turboPASCAL 2. Apr 2007 19:27

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....

himitsu 3. Apr 2007 01:04

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:
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;
TApplication.HandleMessage kann ich nicht selber aufrufen, da sonst der Hauptthread Aufgrund mangelnder Messages einfrieren kann.

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 21: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