Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Tutorials und Kurse (https://www.delphipraxis.net/36-tutorials-und-kurse/)
-   -   Delphi Anwendung im SysTray anzeigen ohne Komponenten (https://www.delphipraxis.net/91211-anwendung-im-systray-anzeigen-ohne-komponenten.html)

dor557 1. Mai 2007 15:52


Anwendung im SysTray anzeigen ohne Komponenten
 
Da ich mit hilfe des Tutorials von dem dsdt.info seite versucht habe das umzusetzen und einige Schwirikkeiten hatte dachte ich schreibe einfach das Tutorial nochmal Komplett mit allem was man braucht Hier hinein.

Ich habe also von dsdt.info einfach die Texte kopiert und kommplettiert.

also :

Systray oder auch TNA (Taskbar Notification Area) nennt man den Bereich neben der Windows-Uhr in der Taskleiste. Besonders bei Programmen, die lange aktiv sind, kann es sinnvoll sein, diese in den platzsparenden Systray zu verschieben.

Zunächst muss in der Uses klausel die ShellApi eingebunden werden mit

Delphi-Quellcode:
uses ShellApi;
Als nächstes muss eine sog. benutzerspezifische Botschaft in Form einer globalen Konstante erstellt werden. Als Basis wird dazu die Botschaft WM_USER verwendet:

Delphi-Quellcode:
const
 WM_TASKBAREVENT = WM_USER + 1;
Es folgt die Deklaration des Prozedurkopfes dieser Botschaft im Private Bereich.

Delphi-Quellcode:
Private
  procedure WMTaskbarEvent(var Message: TMessage); message WM_TASKBAREVENT;
Über die folgenden Prozeduren wird das Icon im Systray angezeigt (TaskbarAddIcon) und wieder entfernt (TaskBarRemoveIcon):

Delphi-Quellcode:
procedure TaskBarAddIcon;
var
  tnid: TNotifyIconData;
  Owner: HWnd;
begin
  with tnid do
  begin
    cbSize := SizeOf(TNotifyIconData);
    Wnd := Form1.Handle;
    uID := 1;
    uFlags := NIF_MESSAGE or NIF_ICON or NIF_TIP;
    uCallbackMessage := WM_TASKBAREVENT;
    hIcon := Application.Icon.Handle;
  end;
  StrCopy(tnid.szTip, 'Tooltipp');
  Shell_NotifyIcon(NIM_ADD, @tnid);

  Owner:=GetWindow(Form1.Handle,GW_OWNER);
  If Owner<>0 Then
    ShowWindow(Owner,SW_HIDE);
end;

procedure TaskBarRemoveIcon;
var
  tnid: TNotifyIconData;
  Owner: HWnd;
begin
  tnid.cbSize := SizeOf(TNotifyIconData);
  tnid.Wnd := Form1.Handle;
  tnid.uID := 1;
  Shell_NotifyIcon(NIM_DELETE, @tnid);
  Owner:=GetWindow(Form1.Handle,GW_OWNER);
  If Owner<>0 Then Begin
    ShowWindow(Owner,SW_Show);
    ShowWindow(Owner,SW_Normal);
  End;
end;
Nun folgt noch die Implementation unserer oben deklarierten Botschaft:

Delphi-Quellcode:
procedure TForm1.WMTaskbarEvent(var Message: TMessage);
var
  Point: TPoint;
begin
  case Message.LParamLo of
     WM_LBUTTONDOWN: TaskBarRemoveIcon;
     WM_RBUTTONDOWN: begin
                          SetForegroundWindow(Handle);
                          GetCursorPos(point);
                          popupmenu1.popup(point.x,point.y);
                     end;
  end;
end;
Klickt man mit der linken Maustaste auf das Icon (WM_LBUTTONDOWN), wird dieses entfernt. Mit einem Rechtsklick wird an der Stelle ein Kontextmenu (Popupmenu1) geöffnet. PopupMenu1 sollte als komponente selbstverständlich auf dem Formular platziert sein.

Da die Anwendung in diesem Beispiel nur im minimierten Zustand in SysTray erscheinen soll, muss zuerst die ApplicationEvents komponente auf dem Formular platziert werden, In der Komponente auf ereignisse klicken und dann OnMinimize Doppelt anklicken und Folgenden Code in die ApplicationEvents1Minimize Procedure einfügen:

Delphi-Quellcode:
 TaskBarAddIcon;
Da die dieses Ereignis seit Delphi 5 in der Komponente TApplicationEvents gekapselt ist solltest du bei einer älteren Delphi version das Ereignis manuell zuweisen. Im Private-Abschnitt muss dazu zusätzlich noch folgende Procedure deklariert werden:

Delphi-Quellcode:
 procedure ApplicationEvents1Minimize(Sender: TObject);

Wer ergänzungen hat kann mit diese gerne mitteilen. Werde sie dann ausprobieren und entsprechend mit in dieses Tutorial einbringen.

Gruss Sascha

Quelle : Anwendung im SysTray anzeigen

Matze 1. Mai 2007 15:56

Re: Anwendung im SysTray anzeigen ohne Komponenten
 
Hallo Sascha,

Zitat:

Zitat von dor557
Da die Anwendung in diesem Beispiel nur im minimierten Zustand in SysTray erscheinen soll, muss zuerst die ApplicationEvents komponente auf dem Formular platziert werden [...]

Das ist gar nicht nötig, ich nutze immer folgenden Code, um ein TNA-Icon anzulegen: Code-Library. ;)

dor557 1. Mai 2007 16:16

Re: Anwendung im SysTray anzeigen ohne Komponenten
 
Danke für deine Antwort.

Dachte nur es wird mal zeit das hier mal zu komplettieren.

Denn ich habe schon einige Viele Beiträge gesehen die auf diese seite verwiesen haben.

gruss Sascha

SirThornberry 1. Mai 2007 19:07

Re: Anwendung im SysTray anzeigen ohne Komponenten
 
ich fände es sehr sinnvoll wenn nicht nur erwähnt wird das man eine userspezifische Message benötigt sondern wenn auch erwähnt wird wozu diese da ist.

Mackhack 1. Mai 2007 20:33

Re: Anwendung im SysTray anzeigen ohne Komponenten
 
Zitat:

Zitat von SirThornberry
ich fände es sehr sinnvoll wenn nicht nur erwähnt wird das man eine userspezifische Message benötigt sondern wenn auch erwähnt wird wozu diese da ist.

Guter Vorschlag SirThornberry!

Luckie 1. Mai 2007 23:02

Re: Anwendung im SysTray anzeigen ohne Komponenten
 
Zitat:

Zitat von dor557
Dachte nur es wird mal zeit das hier mal zu komplettieren.

Denn ich habe schon einige Viele Beiträge gesehen die auf diese seite verwiesen haben.

Was ist an meinem Beispiel unvollständig?

dor557 2. Mai 2007 04:11

Re: Anwendung im SysTray anzeigen ohne Komponenten
 
Wenn du dir z.b. Den link hinter Quelle betrachtest und dann wirst du Feststellen das zum einen :

die ApplicationEvents Komponente nicht erwähnt wurde,
Der hinweis das die Unit ShellApi eungebunden werden sollte.

Da ich mich nicht in der Windows API auskenne kann ich keine gebnauere Beschreibung geben wofür was ist. Habe einfach das was schon Existiert hat genommen und dann noch meine Bemerkungen angepasst bzw. meine erfahrung damit eingebunden.

Dachte das wäre OK...

gruss Sascha

Luckie 2. Mai 2007 09:24

Re: Anwendung im SysTray anzeigen ohne Komponenten
 
Ich bezog mich auf meinen Beitrag in der Code-Lib, auf den Matze verwiesen hat:
http://www.delphipraxis.net/internal_redirect.php?t=137
und auf den auch du dich dann anscheinend bezogen hast.

bitsetter 25. Jun 2007 14:40

Re: Anwendung im SysTray anzeigen ohne Komponenten
 
Liste der Anhänge anzeigen (Anzahl: 1)
Da anscheinend einige Mitglieder mit der Umsetzung des Projektes Schwierigkeiten haben, hänge ich es hier sicherheitshalber noch mal an.

SirThornberry 25. Jun 2007 15:43

Re: Anwendung im SysTray anzeigen ohne Komponenten
 
wie bereits erwähnt finde ich es noch sehr wichtig das erwähnt wird wozu die Message da ist. Ansonsten wird es einfach nur ein copy&paste und da kann man auch gleiche eine fertige Komponente nehmen wenn man den quelltext nicht verstehen will.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:50 Uhr.
Seite 1 von 2  1 2      

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