Anwendung in Systemtray bringen unter Debian KDE Wayland

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Epcop
Beiträge: 161
Registriert: Di 29. Mai 2012, 09:36

Anwendung in Systemtray bringen unter Debian KDE Wayland

Beitrag von Epcop »

Hallo,

ich möchte meine Anwendung in das Systemtray bringen. Aber stattdessen verschwindet die Anwendung immer. Ich habe jetzt einiges ausprobiert, aber ich komme zu keiner Lösung. Deshalb die frage, ob das überhaupt grundsätzlich möglich ist mit aktuellen Debian, KDE, Wayland? Ich habe Lazarus v4.0RC1.

Mein letzter Code sieht so aus (einer von vielen):

Code: Alles auswählen

procedure TForm1.Button6Click(Sender: TObject);
begin
  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;
end;  
Ich hatte das alles viel einfacher in Erinnerung.

Gruß,
Epcop

Epcop
Beiträge: 161
Registriert: Di 29. Mai 2012, 09:36

Re: Anwendung in Systemtray bringen unter Debian KDE Wayland

Beitrag von Epcop »

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;     

Antworten