Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Tray-Icon (https://www.delphipraxis.net/53893-tray-icon.html)

Xenonz 24. Sep 2005 18:54


Tray-Icon
 
Hallo,
Ich habe ein kleines Programm geschrieben. Ich würde in dieses gerne einen Button einfügen, der bewirkt, dass sich das Programm im Tray versteckt und keine Task mehr einnimmt. Es soll lediglich durch einen Mausklick auf das Icon wieder aufgerufen werden. Ein Menü ist nicht nötig.
Wie kann man das möglichst einfach realisieren?
Mfg Xenonz

Zacherl 24. Sep 2005 18:56

Re: Tray-Icon
 
Wenn du die JEDI Komponenten installiert hast, versuch mal TJvTrayIcon.
Ansonsten die DP Suche.

Florian

faux 24. Sep 2005 19:13

Re: Tray-Icon
 
http://www.dsdt.info/tipps/?id=35

Grüße
Faux

Matze 24. Sep 2005 19:16

Re: Tray-Icon
 
Oder in unserer Code-Library: TNATNA

Muetze1 24. Sep 2005 19:53

Re: Tray-Icon
 
In der CodeLib fehlt immernoch das neu registrieren des Icons, wenn der Explorer abgestürzt ist. Das hatte ich aber schonmal samt Code vor rund einem Dreivierteljahr angemerkt, aber irgendwie dauert das wohl alles recht lange....

Matze 24. Sep 2005 20:02

Re: Tray-Icon
 
Zitat:

Zitat von Muetze1
In der CodeLib fehlt immernoch das neu registrieren des Icons, wenn der Explorer abgestürzt ist. Das hatte ich aber schonmal samt Code vor rund einem Dreivierteljahr angemerkt, aber irgendwie dauert das wohl alles recht lange....

:shock: Das habe ich nicht mitbekommen.

Xenonz 25. Sep 2005 17:39

Re: Tray-Icon
 
Danke für die Antworten!
Ich verstehe an Luckies Code kaum etwas...
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ShellAPI, Menus;

type
  TForm1 = class(TForm)
    PopupMenu1: TPopupMenu;
    Item11: TMenuItem;
    Item21: TMenuItem;
    Item31: TMenuItem;
    procedure FormDestroy(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
    IconData: TNotifyIconData;
  public
    { Public-Deklarationen }
    procedure WndProc(var Msg: TMessage); override;
    procedure WMSysCommand(var Message: TWMSysCommand); message WM_SYSCOMMAND;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

////////////////////////////////////////////////////////////////////////////////
// auf Mausklicks reagieren, Fensterprozedur erweitern

procedure TForm1.WndProc(var Msg: TMessage);
var
  Point: TPoint;
begin
  if Msg.Msg = WM_USER + 20 then
  begin
    case Msg.lParam of
      WM_RBUTTONDOWN:
        begin
          SetForegroundWindow(Handle);
          GetCursorPos(Point);
          PopUpMenu1.PopUp(Point.X, Point.Y);
        end;
      WM_LBUTTONDOWN:
        begin
          //ShowMessage('links runter');
        end;
      WM_LBUTTONDBLCLK:
        begin
          Form1.Show;
          // Icon nur anzeigen wenn Fenster minimiert
          Shell_NotifyIcon(NIM_DELETE, @IconData);
        end;
    end;
  end;
  inherited;
end;

////////////////////////////////////////////////////////////////////////////////
// beim Minimieren Fomr verstecken und Icon in die TNA

procedure TForm1.WMSysCommand(var Message: TWMSysCommand);
begin
  if Message.CmdType and $FFF0 = SC_MINIMIZE then
  begin
    Hide;
    // Icon nur anzeigen wenn Fenster minimiert
    Shell_NotifyIcon(NIM_ADD, @IconData);
  end
  else
    inherited;
end;

////////////////////////////////////////////////////////////////////////////////
// Beim beenden Icon entfernen

procedure TForm1.FormDestroy(Sender: TObject);
begin
  Shell_NotifyIcon(NIM_DELETE, @IconData);
end;

////////////////////////////////////////////////////////////////////////////////
// Beim Erstellen des Formulares TNotifyIconData-Struktur initialisieren

procedure TForm1.FormCreate(Sender: TObject);
begin
  //Application.ShowMainForm := False; //Programm gar nicht erst anzeigen
  IconData.cbSize := SizeOf(IconData);
  IconData.Wnd := Handle;
  IconData.uID := 100;
  IconData.uFlags := NIF_MESSAGE + NIF_ICON + NIF_TIP;
  IconData.uCallBackMessage := WM_USER + 20;
  IconData.hIcon := Application.Icon.Handle;
  IconData.szTip := 'Dies ist ein TNA-Icon';
  //Shell_NotifyIcon(NIM_ADD, @IconData); // fügt das Icon ein end;
end;

end.
Kann vielleicht jemand von Euch für mich Kommentare dahintersetzen, um mir den Code verständlich zu machen?

faux 25. Sep 2005 17:42

Re: Tray-Icon
 
Vielleicht wäre es umgekehrt sinnvoller, wenn du markierst, was du nicht verstehst? :roll:

Grüße
Faux

Xenonz 25. Sep 2005 17:49

Re: Tray-Icon
 
Also:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ShellAPI, Menus;

type
  TForm1 = class(TForm)
    PopupMenu1: TPopupMenu;
    Item11: TMenuItem;                                   //in welchem Reiter sind diese Menüs?
    Item21: TMenuItem;
    Item31: TMenuItem;
    procedure FormDestroy(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
    IconData: TNotifyIconData;
  public
    { Public-Deklarationen }
    procedure WndProc(var Msg: TMessage); override;
    procedure WMSysCommand(var Message: TWMSysCommand); message WM_SYSCOMMAND;     //was ist der Unterschied                          
                                                                                    //zw. Public und Private?
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

////////////////////////////////////////////////////////////////////////////////
// auf Mausklicks reagieren, Fensterprozedur erweitern

procedure TForm1.WndProc(var Msg: TMessage);
var
  Point: TPoint;                                                //was ist ein TPoint?
begin
  if Msg.Msg = WM_USER + 20 then                               //   <hä?>
  begin
    case Msg.lParam of
      WM_RBUTTONDOWN:
        begin
          SetForegroundWindow(Handle);
          GetCursorPos(Point);
          PopUpMenu1.PopUp(Point.X, Point.Y);
        end;
      WM_LBUTTONDOWN:
        begin
          //ShowMessage('links runter');
        end;
      WM_LBUTTONDBLCLK:
        begin
          Form1.Show;
          // Icon nur anzeigen wenn Fenster minimiert
          Shell_NotifyIcon(NIM_DELETE, @IconData);
        end;
    end;
  end;
  inherited;
end;

////////////////////////////////////////////////////////////////////////////////
// beim Minimieren Fomr verstecken und Icon in die TNA

procedure TForm1.WMSysCommand(var Message: TWMSysCommand);
begin
  if Message.CmdType and $FFF0 = SC_MINIMIZE then
  begin
    Hide;
    // Icon nur anzeigen wenn Fenster minimiert
    Shell_NotifyIcon(NIM_ADD, @IconData);
  end
  else
    inherited;
end;                                                                          

////////////////////////////////////////////////////////////////////////////////
// Beim beenden Icon entfernen

procedure TForm1.FormDestroy(Sender: TObject);
begin
  Shell_NotifyIcon(NIM_DELETE, @IconData);
end;

////////////////////////////////////////////////////////////////////////////////
// Beim Erstellen des Formulares TNotifyIconData-Struktur initialisieren

procedure TForm1.FormCreate(Sender: TObject);
begin
  //Application.ShowMainForm := False; //Programm gar nicht erst anzeigen
  IconData.cbSize := SizeOf(IconData);
  IconData.Wnd := Handle;
  IconData.uID := 100;
  IconData.uFlags := NIF_MESSAGE + NIF_ICON + NIF_TIP;
  IconData.uCallBackMessage := WM_USER + 20;
  IconData.hIcon := Application.Icon.Handle;
  IconData.szTip := 'Dies ist ein TNA-Icon';
  //Shell_NotifyIcon(NIM_ADD, @IconData); // fügt das Icon ein end;        //</hä?>
end;

end.
Das sind meine Probleme.

PierreB 25. Sep 2005 17:59

Re: Tray-Icon
 
Beispiel: "Was ist der Unterschied zw. public & private"

Das hat wohl mit diesem Thema nichts zu tun und zählt eher zu Delphi-Grundlagen. Das solltest du dir also mal etwas genauer angucken. ;) http://www.dsdt.info

P.S.: Auf der Webseite ^^ gibt es den "Easy Helper", indem du viele Delphitipps findest. Unter anderem auch eine komplette Anleitung wie du das was du machen willst in dein Programm einbaust. :zwinker:

faux 25. Sep 2005 18:04

Re: Tray-Icon
 
Zum Thema public/private:

Hier im Forum suchenunterschied AND public AND private liefert:
http://www.delphipraxis.net/internal...public+private

Zum Thema TPoint:

Delphi-Referenz durchsuchenTPoint liefert:
Delphi-Quellcode:
type TPoint = packed record
  X: Longint;
  Y: Longint;
end;

Matze 25. Sep 2005 18:21

Re: Tray-Icon
 
Zitat:

Zitat von Xenonz
Delphi-Quellcode:
PopupMenu1: TPopupMenu;
Item11: TMenuItem;                                   //in welchem Reiter sind diese Menüs?
Item21: TMenuItem;
Item31: TMenuItem;

Das sind die Items, des Popupmenüs, das auf Rechtsklick in der TNA angezeigt wird (über den OI hinzufügen)

Zitat:

Zitat von Xenonz
Delphi-Quellcode:
//was ist der Unterschied
//zw. Public und Private?

Wurde ja schon angesprochen. Private ist jedenfalls nur in der Unit selbst verfügbar, public auch in anderen (Aufruf über UnitX.Prozedur / UnitX.Funktion

Zitat:

Zitat von Xenonz
Delphi-Quellcode:
Point: TPoint;                                                //was ist ein TPoint?

Wurde auch bereits angesprochen, es sind hier quasi, vereinfacht ausgedrückt 2 Variablen in einer verpackt:
Point.X und Point.Y (beides vom Typ integer)

Zitat:

Zitat von Xenonz
Delphi-Quellcode:
if Msg.Msg = WM_USER + 20 then                               //   <hä?>

Reagiert auf die Windows Nachricht, also, wenn auf das TNA-Icon geklickt wurde (bearbeitet werden hier der Klick mit der linken, mittleren und rechten Maustaste)

Zitat:

Zitat von Xenonz
Delphi-Quellcode:
  //Shell_NotifyIcon(NIM_ADD, @IconData); // fügt das Icon ein end;        //</hä?>

Steht schon im Kommentar vor deinem: Es wird das Icon in die TNA eingefügt


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:34 Uhr.

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