Lazarus / fpc: Mehrfaches OnWindowStateChange()

Gast #6407315
Hi,
ich habe ein Problem mit dem Ereignis TForm.OnWindowStateChange. Dieses 
wird bei mir mehrfach ausgelöst - der Grund erschließt sich mir auf den 
1. Blick nicht. (Bug in LCL mag ich nicht ausschließen, aber ich bin 
doch nicht der erste, der das merken müßte...)

Was ich will:
Wenn das Fenster (bei mir einziges Fenster des Programms, keine 
Children) minimiert wird, dann soll es ausgeblendet werden und ein 
TrayIcon erscheinen. Wenn ich auf das TrayIcon klicke, dann soll das 
Fenster wieder erscheinen.

Was ich tue:
1
procedure TMainform.FormWindowStateChange(Sender: TObject);
2
var ws: TWindowState;
3
begin
4
  ws:=WindowState;
5
  if ws=PrevWindowState then exit;
6

7
  WriteLn(GetTickCount64:20, ' ws: ', ws, ' prev: ', PrevWindowState);
8
  case ws of
9
    wsMinimized : OnMinimize;
10
    wsNormal,
11
    wsMaximized : ;
12
  end;
13
  PrevWindowState:=ws;
14
end;
15

16
procedure TMainform.OnMinimize;
17
var trayicon: TTrayIcon;
18
begin
19
  if Data.ProperShutdown then exit;
20
  if Data.MinimizeToTray then begin
21
    trayicon:=Data.TrayIcon;
22
    trayicon.OnClick:=@OnTrayIconClick;
23
    trayicon.Show;
24
    Application.ProcessMessages;
25
    self.Hide;
26
  end;
27
end;
28

29
procedure TMainform.OnRestore;
30
var trayicon: TTrayIcon;
31
begin
32
  if Data.ProperShutdown then exit;
33
  if Data.MinimizeToTray then begin
34
    trayicon:=Data.TrayIcon;
35
    trayicon.OnClick:=nil;
36
    trayicon.Hide;
37
    Application.Restore;
38
    self.Show;
39
    self.WindowState:=wsNormal;
40
    Application.ProcessMessages;
41
  end;
42
end;
OnRestore wird vom TrayIcon ausgelöst

Was passiert:
Selten funktioniert es. Ganz oft blitzt das Fenster kurz auf und 
verschwindet gleich wieder und das TrayIcon erscheint sofort wieder - 
als ob es nach dem Restore gleich wieder minimiert würde.

Was genau passiert:
Habe mir mal eine Debug-Ausgabe gebastelt, um das Verhalten 
nachvollziehen zu können. Der Tray-Handler wird aufgerufen, erfolgreich 
beendet. Dann kommen die WindowState-Ereignisse: auf, zu :(
Vom Timing her sieht das so aus (vorne der GetTickCount()):
  Restore enter
  Restore leave
             3478183 ws: wsNormal prev: wsMinimized
             3478184 ws: wsMinimized prev: wsNormal
             3478191 ws: wsNormal prev: wsMinimized

WTF??? Das Timing hängt ein bißchen vom Rechner ab. Auf dem alten Laptop 
sind es durchaus mal 10ms zwischen 1. und 3. Ereignis.
Habe spasseshalber eine Abfrage in OnWindowStateChange gemacht, daß er 
erst wieder 100ms nach Restore auf Minimize reagiert. Das funktioniert, 
aber schön ist anders.

Kennt jemand das Phänomen? Kann mir jemand auf die Sprünge helfen, was 
ich falsch mache? So kompliziert kann das doch nicht sein?
VG Frickler

Lazarus Version 1.6
FPC Version 3.0.0
aktuell nur auf PC mit Linux Mint, raspberry mit OSMC bzw Debian kommt 
noch

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 6 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.