Ich gib mir mal selbst die Antwort.
TrayIcon aufs Formular. Uses LCLType, LCLIntf
Minimieren (z.B. Klick auf Button):
Code: Alles auswählen
TrayIcon1.Icon := Application.Icon;
TrayIcon1.Visible := True;
Application.ProcessMessages;
Sleep(100);
if TrayIcon1.Visible then
begin
Self.Hide;
Self.WindowState := wsMinimized;
end
else
begin
ShowMessage('Systemtray nicht verfügbar. Fenster wird nur minimiert.');
Self.WindowState := wsMinimized;
end;
Wichtig beim Minimieren!!! PopupMenü bei TrayIcon muss unbedingt angegeben werden! (aus den Standardkomponenten oder selbst bauen). Wenn das nicht da ist, dann funktioniert gar nichts.
Sicherheitshalber habe ich auch das Icon bei TrayIcon auch explizit angegeben. Laut Internet scheint das ebenfalls eine wichtige Rolle zu spielen. (Windows hat da gerne einen Platzhalter verwendet, was zum testen immer gut funktioniert hat. Aber so jetzt nicht mehr geht)
Fenster öffnen (in FormCreate):
Code: Alles auswählen
// TrayIcon konfigurieren
TrayIcon1.Icon := Application.Icon;
TrayIcon1.Hint := 'Meine Anwendung';
// PopupMenu erstellen
if not Assigned(TrayIcon1.PopUpMenu) then
TrayIcon1.PopUpMenu := TPopupMenu.Create(Self);
// Menüeinträge hinzufügen
MenuItem := TMenuItem.Create(TrayIcon1.PopUpMenu);
MenuItem.Caption := 'Fenster anzeigen';
MenuItem.OnClick := @MenuShowWindow;
TrayIcon1.PopUpMenu.Items.Add(MenuItem);
MenuItem := TMenuItem.Create(TrayIcon1.PopUpMenu);
MenuItem.Caption := '-';
TrayIcon1.PopUpMenu.Items.Add(MenuItem);
MenuItem := TMenuItem.Create(TrayIcon1.PopUpMenu);
MenuItem.Caption := 'Beenden';
MenuItem.OnClick := @MenuExit;
TrayIcon1.PopUpMenu.Items.Add(MenuItem);
//TrayIcon1.Visible := True;
Ich habe das jetzt über ein Menü gelöst. Wenn man auf das Systemicon klickt, dass ein Menü aufgeht und dann "Fenster anzeigen".
TrayIcon1Click() hat bei mir partout nicht funktioniert. Ich hatte nicht den Eindruck, dass da überhaupt irgendwas registriert wird. Dasselbe auch mit TrayIcon1DblClick().
Edit:
Und das gehört natürlich auch noch dazu:
Code: Alles auswählen
procedure TForm1.MenuShowWindow(Sender: TObject);
begin
Self.WindowState := wsNormal;
Self.Show;
Self.BringToFront;
end;
procedure TForm1.MenuExit(Sender: TObject);
begin
TrayIcon1.Visible := False;
Application.Terminate;
end;