Difference between revisions of "TrayIcon/de"

From Free Pascal wiki
Jump to navigationJump to search
m (OSX -> macOS/named OS; fixed syntax highlighting)
 
(8 intermediate revisions by 5 users not shown)
Line 3: Line 3:
 
=== Über ===
 
=== Über ===
  
'''TrayIcon''' ist eine crossplattformtaugliche Systemtray-Komponente, welche momentan unter folgenden Widgetsets funktioniert: win32, Gtk1, Gnome, Gtk2.
+
'''TrayIcon''' ist eine crossplattformtaugliche Systemtray-Komponente, die momentan unter folgenden Widgetsets funktioniert: win32, Gtk1, Gnome, Gtk2.
 
Für die Zukunft ist außerdem Carbon ( Mac OS X ) und Qt 4 vorgesehen.
 
Für die Zukunft ist außerdem Carbon ( Mac OS X ) und Qt 4 vorgesehen.
  
Zwei Schnittstellen werden momentan angeboten: eine visuelle Komponente und ein non-visuelles Objekt. Zweiteres heißt SystrayIcon und ist delphikompatibel. Die visuelle Komponente ist das TTrayIcon, welches nur mit Lazarus funktioniert.
+
Zwei Schnittstellen werden momentan angeboten: eine visuelle Komponente und ein non-visuelles Objekt. Zweiteres heißt SystrayIcon und ist delphikompatibel. Die visuelle Komponente ist das TTrayIcon, das nur mit Lazarus funktioniert.
  
 
Als Schnelleinstieg siehe: [[TrayIcon/de#Demonstrationsprogramm|das Demonstrationsprogramm]].
 
Als Schnelleinstieg siehe: [[TrayIcon/de#Demonstrationsprogramm|das Demonstrationsprogramm]].
Line 12: Line 12:
 
=== Dokumentation ===
 
=== Dokumentation ===
  
Nachfolgend eine Liste mit allen Methoden, Eigenschaften und Ereignissen, welche die Komponente zur Verfügung stellt. Namen und Funktion sind für die visuelle und die nicht-visuelle Version identisch. Außerdem arbeiten die Funktionen, außer wenn anders angegeben unter allen Plattformen.
+
Nachfolgend eine Liste mit allen Methoden, Eigenschaften und Ereignissen, die die Komponente zur Verfügung stellt. Namen und Funktion sind für die visuelle und die nicht-visuelle Version identisch. Außerdem arbeiten die Funktionen, außer wenn anders angegeben unter allen Plattformen.
  
 
==== Methoden ====
 
==== Methoden ====
Line 53: Line 53:
 
'''property''' PopUpMenu: TPopUpMenu;
 
'''property''' PopUpMenu: TPopUpMenu;
  
Gibt ein Popupmenu an, welches bei Rechtsklick auf das Icon erscheint.
+
Gibt ein Popupmenu an, das beim Rechtsklick auf das Icon erscheint.
  
 
==== Ereignisse ====
 
==== Ereignisse ====
Line 109: Line 109:
  
 
'''GTK2 WORKAROUND'''
 
'''GTK2 WORKAROUND'''
Es gibt ein Problem mit Trayicon unter Linux mit GTK2 und FPC 2.1.x oder neuer. Das Problem ist, daß TrayIcon die Unit gdk2x.pp enthält (actually the unit is located inside the opengl component but TrayIcon compiles it into itself). This unit has been added to FPC as of version 2.1.x but it still in the lazarus sources as well, because it doesn't exist on the latest stable FPC (2.0.4). This means that when you install TrayIcon Lazarus will refuse to build the GTK2 LCL complaining that it cannot find unit GTKint. If you look at the messages however you will see the true error: the checksum for gdk2x has changed (this is the result of the duplication).
+
Es gibt ein Problem mit Trayicon unter Linux mit GTK2 und FPC 2.1.x oder neuer. Das Problem ist, dass TrayIcon die Unit gdk2x.pp enthält (actually the unit is located inside the opengl component but TrayIcon compiles it into itself). This unit has been added to FPC as of version 2.1.x but it still in the lazarus sources as well, because it doesn't exist on the latest stable FPC (2.0.4). This means that when you install TrayIcon Lazarus will refuse to build the GTK2 LCL complaining that it cannot find unit GTKint. If you look at the messages however you will see the true error: the checksum for gdk2x has changed (this is the result of the duplication).
 
To overcome this, you need to remove either the gdk2x.pp file from the lazarus tree, or the gdk2x.o and gdk2x.ppu file from your FPC units directory. This will be fixed once fpc 2.2.0 is released, at which time gdk2x.pp will be removed from lazarus, so consider this a temporary work-around.
 
To overcome this, you need to remove either the gdk2x.pp file from the lazarus tree, or the gdk2x.o and gdk2x.ppu file from your FPC units directory. This will be fixed once fpc 2.2.0 is released, at which time gdk2x.pp will be removed from lazarus, so consider this a temporary work-around.
  
Line 123: Line 123:
 
Seit Lazarus 0.9.26 wurde TIcon vollständig implementiert, und es ist nicht länger notwendig das Bild aus einer Ressource zu laden. Das icon kann in der IDE geladen werden, oder auch mit "usual code".
 
Seit Lazarus 0.9.26 wurde TIcon vollständig implementiert, und es ist nicht länger notwendig das Bild aus einer Ressource zu laden. Das icon kann in der IDE geladen werden, oder auch mit "usual code".
  
Go to the Additional tab of components, and add a TTrayIcon to your form. Then change it's Name property to SystrayIcon
+
Fügen sie ein TTrayIcon aus Additional in ihrer Form ein.
  
 
Füge ein TButton zu deiner Form. Und gebe in sein OnClickEvent folgendes ein.
 
Füge ein TButton zu deiner Form. Und gebe in sein OnClickEvent folgendes ein.
  
 +
<pre>
 
procedure MyForm.Button1Click(Sender: TObject);
 
procedure MyForm.Button1Click(Sender: TObject);
 
begin
 
begin
   SystrayIcon.Icon.LoadFromFile('/pfad_zum_icon/icon.ico');
+
   TrayIcon1.Icon.LoadFromFile('/phad_zum_icon/icon.ico');
   SystrayIcon.ShowHint := True;
+
   TrayIcon1.ShowHint := True;
   SystrayIcon.Hint := 'Mein tool tip';
+
   TrayIcon1.Hint := 'Mein tooltip';
  
   SystrayIcon.PopUpMenu := MyPopUpMenu;
+
   TrayIcon1.PopUpMenu := MyPopUpMenu;
  
   SystrayIcon.Show;
+
   TrayIcon1.Show;
 
end;
 
end;
 +
</pre>
  
== Die Alte Variante: ==
+
==== Die Alte Variante: ====
  
  
Line 165: Line 167:
 
Als nächstes benötigen sie noch einen Button. Schreiben sie folgendes in das OnClick-Ereignis des Buttons:
 
Als nächstes benötigen sie noch einen Button. Schreiben sie folgendes in das OnClick-Ereignis des Buttons:
  
<delphi>
+
<syntaxhighlight lang="pascal">
 
procedure MyForm.Button1Click(Sender: TObject);
 
procedure MyForm.Button1Click(Sender: TObject);
 
const
 
const
Line 186: Line 188:
 
   SystrayIcon.Show;
 
   SystrayIcon.Show;
 
end;
 
end;
</delphi>
+
</syntaxhighlight>
  
 
=== Subversion ===
 
=== Subversion ===
Line 206: Line 208:
 
=== Technische Details ===
 
=== Technische Details ===
  
Eine Schwierigkeit in der Entwicklung waren die vielen Unterschiede in der Umsetzung der Implementierungen für den Systemtray unter den unterschiedlichen betriebssystemen und Windowmanagern unter Linux. Um dies zu lösen, implementiert die Komponente den Satz an minimalen Funktionen, welcher unter allen Plattformen vorhanden ist.
+
Eine Schwierigkeit in der Entwicklung waren die vielen Unterschiede in der Umsetzung der Implementierungen für den Systemtray unter den unterschiedlichen Betriebssystemen und Windowmanagern unter Linux. Um dies zu lösen, implementiert die Komponente den Satz an minimalen Funktionen, der unter allen Plattformen vorhanden ist.
 
Nachflgend dazu eine Liste der unter den jeweiligen Plattformen implementierten Funktionen:
 
Nachflgend dazu eine Liste der unter den jeweiligen Plattformen implementierten Funktionen:
  
'''Windows''' - Mehrere Systemtrayicons pro Anwendung werden unterstützt. Außerdem ist es möglich, das Icon mittels des HICON-Handle zu modifizieren. Events des Icons werden über eine spezielle Message im für den Nutzer reservierten Messageraum (>= WM_USER) zum Fenster, welchem das Icon zugeordnet ist, gesendet. Es werden keine Paint-Events an das Fenster gesendet.
+
'''Windows''' - Mehrere Systemtrayicons pro Anwendung werden unterstützt. Außerdem ist es möglich, das Icon mittels des HICON-Handle zu modifizieren. Events des Icons werden über eine spezielle Message im für den Nutzer reservierten Messageraum (>= WM_USER) zum Fenster, dem das Icon zugeordnet ist, gesendet. Es werden keine Paint-Events an das Fenster gesendet.
  
 
'''Linux (Gnome, KDE, IceWM, etc)''' - Mehrere Systemtrayicons pro Anwendung werden unterstützt. Das Bild es Icons ist momentan ein sehr kleines Fenster, und kann gezeichnet werden und Nachrichten empfangen, wie jedes andere Formular.
 
'''Linux (Gnome, KDE, IceWM, etc)''' - Mehrere Systemtrayicons pro Anwendung werden unterstützt. Das Bild es Icons ist momentan ein sehr kleines Fenster, und kann gezeichnet werden und Nachrichten empfangen, wie jedes andere Formular.
  
'''Linux (WindowMaker, Openbox, etc)''' - Unterstützt von Haus aus keine Systemtrayicons. Allerdings gibt es zwei Anwendungen, welche dafür Unterstützung anbieten: [http://icculus.org/openbox/2/docker/ Docker] und [http://freshmeat.net/projects/wmsystray/ WMSystray]
+
'''Linux (WindowMaker, Openbox, etc)''' - Unterstützt von Haus aus keine Systemtrayicons. Allerdings gibt es zwei Anwendungen, die dafür Unterstützung anbieten: [http://icculus.org/openbox/2/docker/ Docker] und [http://freshmeat.net/projects/wmsystray/ WMSystray]
  
'''Mac OS X''' - Dieses System besitzt keine herkömlichen Systemtrayicons, wie sie Windows und Linux haben. Die Komponete nutzt Tray-ähnliche Funktionen von MacOS X um ein Trayicon bereitzustellen. Jede Anwendung in MacOS besitzt ein Dockicon und die Software kann diesem Dock ein Kontextmenü zuordnen. Dies ist der Weg, wie TrayIcon in der Zukunft arbeiten wird. Ein Kompatibilitätsproblem ist allerdings die Tatsache, das nur ein Dockicon pro Anwendung möglich ist.
+
'''Mac OS X''' - Dieses System besitzt keine herkömlichen Systemtrayicons, wie sie Windows und Linux haben. Die Komponete nutzt Tray-ähnliche Funktionen von macOS um ein Trayicon bereitzustellen. Jede Anwendung in MacOS besitzt ein Dockicon und die Software kann diesem Dock ein Kontextmenü zuordnen. Dies ist der Weg, wie TrayIcon in der Zukunft arbeiten wird. Ein Kompatibilitätsproblem ist allerdings die Tatsache, das nur ein Dockicon pro Anwendung möglich ist.
  
 
Hier ist ein Eindruck über das Aussehen zu finden: http://developer.apple.com/documentation/UserExperience/Conceptual/OSXHIGuidelines/XHIGMenus/chapter_16_section_6.html
 
Hier ist ein Eindruck über das Aussehen zu finden: http://developer.apple.com/documentation/UserExperience/Conceptual/OSXHIGuidelines/XHIGMenus/chapter_16_section_6.html
  
Mit diesen Gedanken wurde eine Komponete erstellt, welche alle Platformen unterstützt:
+
Mit diesen Gedanken wurde eine Komponete erstellt, die alle Platformen unterstützt:
  
* Es ist nur ein Systrayicon pro Anwednung möglich und alle Anwednungen, welche ein Systrayicon benutzen, initialisieren dies beim Start. Dazu muss das SystrayIcon-Objekt und nicht seine Klasse verwendet werden. (nötig für MacOS X)
+
* Es ist nur ein Systrayicon pro Anwednung möglich und alle Anwednungen, die ein Systrayicon benutzen, initialisieren dies beim Start. Dazu muss das SystrayIcon-Objekt und nicht seine Klasse verwendet werden. (nötig für macOS)
  
 
* Zeichnen wird über das TIcon-Objekt ausgeführt. (nötig für Windows)
 
* Zeichnen wird über das TIcon-Objekt ausgeführt. (nötig für Windows)
Line 227: Line 229:
 
Die folgenden Funktionen sind außerdem verfügbar, funktionieren jedoch nicht auf allen Plattformen:
 
Die folgenden Funktionen sind außerdem verfügbar, funktionieren jedoch nicht auf allen Plattformen:
  
* Mehrere Systemtrayicons (Funktioniert nicht mit MacOS X)
+
* Mehrere Systemtrayicons (Funktioniert nicht mit macOS)
  
 
* OnPaint-Event und Canvas-Property um das Icon frei zu zeichnen. Funktioniert nicht unter Windows)
 
* OnPaint-Event und Canvas-Property um das Icon frei zu zeichnen. Funktioniert nicht unter Windows)
Line 235: Line 237:
 
* http://www.codeproject.com/shell/ctrayiconposition.asp - Code und Theorie um die Position des Trayicons unter Windows zu ermitteln.
 
* http://www.codeproject.com/shell/ctrayiconposition.asp - Code und Theorie um die Position des Trayicons unter Windows zu ermitteln.
  
* http://cvs.gnome.org/viewcvs/gtk%2B/gtk/gtkstatusicon.c?rev=1.23&view=markup - Gtk2-Code, welcher ein gtkstatusicon implementiert
+
* http://cvs.gnome.org/viewcvs/gtk%2B/gtk/gtkstatusicon.c?rev=1.23&view=markup - Gtk2-Code, der ein gtkstatusicon implementiert

Latest revision as of 03:59, 23 December 2019

Deutsch (de) English (en)

Über

TrayIcon ist eine crossplattformtaugliche Systemtray-Komponente, die momentan unter folgenden Widgetsets funktioniert: win32, Gtk1, Gnome, Gtk2. Für die Zukunft ist außerdem Carbon ( Mac OS X ) und Qt 4 vorgesehen.

Zwei Schnittstellen werden momentan angeboten: eine visuelle Komponente und ein non-visuelles Objekt. Zweiteres heißt SystrayIcon und ist delphikompatibel. Die visuelle Komponente ist das TTrayIcon, das nur mit Lazarus funktioniert.

Als Schnelleinstieg siehe: das Demonstrationsprogramm.

Dokumentation

Nachfolgend eine Liste mit allen Methoden, Eigenschaften und Ereignissen, die die Komponente zur Verfügung stellt. Namen und Funktion sind für die visuelle und die nicht-visuelle Version identisch. Außerdem arbeiten die Funktionen, außer wenn anders angegeben unter allen Plattformen.

Methoden

Show

procedure Show;

Zeigt das Icon im Systemtray


Hide

procedure Hide;

Entfernt das Icon aus dem Systemtray


GetPosition

function GetPosition: TPoint;

Gibt die Position des Trayicons auf dem Bildschirm aus. Diese Funktion dient dazu, Nachrichten nahe des Icons anzuzeigen. Dies ist allerdings momentan nur ein Platzhalter und nicht implementiert. Stattdessen wird immer der Punkt (0, 0) zurückgegeben.

Eigenschaften

Hint

property Hint: string;


ShowHint

property ShowHint: Boolean;


PopUpMenu

property PopUpMenu: TPopUpMenu;

Gibt ein Popupmenu an, das beim Rechtsklick auf das Icon erscheint.

Ereignisse

OnPaint

property OnPaint: TNotifyEvent;

Erlaubt eine eigene Zeichenroutine für das Canvas des Icons.

Bemerkung: Arbeitet nicht unter Win32!


OnClick

property OnClick: TNotifyEvent;


OnDblClick

property OnDblClick: TNotifyEvent;


OnMouseDown

property OnMouseDown: TMouseEvent;


OnMouseUp

property OnMouseUp: TMouseEvent;


OnMouseMove

property OnMouseMove: TMouseMoveEvent;

Autoren

Felipe Monteiro de Carvalho

Andrew Haines

Lizenz

Modifizierte LGPL

Download

Status: Stabil

Ist bei jeder aktuellen Lazarusinstallation im Ordner lazarus/components/trayicon zu finden.

Installation

GTK2 WORKAROUND Es gibt ein Problem mit Trayicon unter Linux mit GTK2 und FPC 2.1.x oder neuer. Das Problem ist, dass TrayIcon die Unit gdk2x.pp enthält (actually the unit is located inside the opengl component but TrayIcon compiles it into itself). This unit has been added to FPC as of version 2.1.x but it still in the lazarus sources as well, because it doesn't exist on the latest stable FPC (2.0.4). This means that when you install TrayIcon Lazarus will refuse to build the GTK2 LCL complaining that it cannot find unit GTKint. If you look at the messages however you will see the true error: the checksum for gdk2x has changed (this is the result of the duplication). To overcome this, you need to remove either the gdk2x.pp file from the lazarus tree, or the gdk2x.o and gdk2x.ppu file from your FPC units directory. This will be fixed once fpc 2.2.0 is released, at which time gdk2x.pp will be removed from lazarus, so consider this a temporary work-around.

Demonstrationsprogramm

Es gibt 2 Arten ein Trayicon zu erstellen. Ich empfehle die erste leichtere Methode, lasse aber die alte Methode drinne.. Quelle(Diese Seite Englische version).


Die Leichte Variante:

Seit Lazarus 0.9.26 wurde TIcon vollständig implementiert, und es ist nicht länger notwendig das Bild aus einer Ressource zu laden. Das icon kann in der IDE geladen werden, oder auch mit "usual code".

Fügen sie ein TTrayIcon aus Additional in ihrer Form ein.

Füge ein TButton zu deiner Form. Und gebe in sein OnClickEvent folgendes ein.

procedure MyForm.Button1Click(Sender: TObject);
begin
  TrayIcon1.Icon.LoadFromFile('/phad_zum_icon/icon.ico');
  TrayIcon1.ShowHint := True;
  TrayIcon1.Hint := 'Mein tooltip';

  TrayIcon1.PopUpMenu := MyPopUpMenu;

  TrayIcon1.Show;
end;

Die Alte Variante:

Dieses Programm läd ein Icon aus einer internen Ressource (unter Windows) bzw. aus einer externen Datei (unter anderen Plattformen als Windows).

Um die Ressource mit dem Icon unter Windows zu erstellen und einzubinden ist folgendes nötig:

1. Erstellen sie ein Ressourcenskript traytest.rc wie dieses:

101               ICON                    "icon1.ico"

2. Compilieren sie das Ressourcenskript mittels windres.exe in eine *.res Datei. (Windres ist im Lazarusverzeichnis zu finden) Der Befehl lautet: windres -i traytest.rc -o traytest.res

Nun können sie ihr Testprogramm schreiben. Erstellen sie eine neue Anwendung mit einem Formular und fügen sie in die entsprechende Unit folgendes in den Interface-Abschnitt ein:

{$ifdef win32}
  {$R traytest.res}
{$endif}

Als nächstes benötigen sie noch einen Button. Schreiben sie folgendes in das OnClick-Ereignis des Buttons:

procedure MyForm.Button1Click(Sender: TObject);
const
  IDI_ICON1         = 101;
begin
{$ifdef win32}
  SystrayIcon.Icon.Handle := LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1));
  //7. März 2006 - Das laden einer .ico-Datei unter Windows funktioniert nicht
{$else}
  SystrayIcon.Icon.LoadFromFile('/path_to_icon/icon.ico');
  //7. März 2006 - Es kann zu Problemen mit der Darstellung von .ico-Dateien kommen.
  //Ist dies der Fall, probieren sie xpm (dies löst das Problem unter FedoraCore 4 / Gnome)
{$endif}

  SystrayIcon.ShowHint := True;
  SystrayIcon.Hint := 'Mein Tooltip';

  SystrayIcon.PopUpMenu := MyPopUpMenu;

  SystrayIcon.Show;
end;

Subversion

Zu finden unter components/trayicon/ im aktuellen Subversion-Verzeichnis

Hilfe, Bugreports und Funktionswünsche

Bitte stellen sie Bugreports und Funktionswünsche im Lazarus Bugtracker.

Hilfsanfragen können in der Lazarus-Maillinglist oder im Forum gestellt werden.

Change Log

  1. 17/01/2006 - Als Vorschau in der Lazarus-Subversion verfügbar
  2. 24/01/2006 - stable unter win32, Gnome and Gtk1, aber noch ohne Gtk2-Unterstützung. Lazarus 0.9.12 wurde mit dieser Version veröffentlicht.
  3. 17/02/2006 - gtk2-Unterstützung in Subversion eingefügt

Technische Details

Eine Schwierigkeit in der Entwicklung waren die vielen Unterschiede in der Umsetzung der Implementierungen für den Systemtray unter den unterschiedlichen Betriebssystemen und Windowmanagern unter Linux. Um dies zu lösen, implementiert die Komponente den Satz an minimalen Funktionen, der unter allen Plattformen vorhanden ist. Nachflgend dazu eine Liste der unter den jeweiligen Plattformen implementierten Funktionen:

Windows - Mehrere Systemtrayicons pro Anwendung werden unterstützt. Außerdem ist es möglich, das Icon mittels des HICON-Handle zu modifizieren. Events des Icons werden über eine spezielle Message im für den Nutzer reservierten Messageraum (>= WM_USER) zum Fenster, dem das Icon zugeordnet ist, gesendet. Es werden keine Paint-Events an das Fenster gesendet.

Linux (Gnome, KDE, IceWM, etc) - Mehrere Systemtrayicons pro Anwendung werden unterstützt. Das Bild es Icons ist momentan ein sehr kleines Fenster, und kann gezeichnet werden und Nachrichten empfangen, wie jedes andere Formular.

Linux (WindowMaker, Openbox, etc) - Unterstützt von Haus aus keine Systemtrayicons. Allerdings gibt es zwei Anwendungen, die dafür Unterstützung anbieten: Docker und WMSystray

Mac OS X - Dieses System besitzt keine herkömlichen Systemtrayicons, wie sie Windows und Linux haben. Die Komponete nutzt Tray-ähnliche Funktionen von macOS um ein Trayicon bereitzustellen. Jede Anwendung in MacOS besitzt ein Dockicon und die Software kann diesem Dock ein Kontextmenü zuordnen. Dies ist der Weg, wie TrayIcon in der Zukunft arbeiten wird. Ein Kompatibilitätsproblem ist allerdings die Tatsache, das nur ein Dockicon pro Anwendung möglich ist.

Hier ist ein Eindruck über das Aussehen zu finden: http://developer.apple.com/documentation/UserExperience/Conceptual/OSXHIGuidelines/XHIGMenus/chapter_16_section_6.html

Mit diesen Gedanken wurde eine Komponete erstellt, die alle Platformen unterstützt:

  • Es ist nur ein Systrayicon pro Anwednung möglich und alle Anwednungen, die ein Systrayicon benutzen, initialisieren dies beim Start. Dazu muss das SystrayIcon-Objekt und nicht seine Klasse verwendet werden. (nötig für macOS)
  • Zeichnen wird über das TIcon-Objekt ausgeführt. (nötig für Windows)

Die folgenden Funktionen sind außerdem verfügbar, funktionieren jedoch nicht auf allen Plattformen:

  • Mehrere Systemtrayicons (Funktioniert nicht mit macOS)
  • OnPaint-Event und Canvas-Property um das Icon frei zu zeichnen. Funktioniert nicht unter Windows)

Externe Links