Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Programm beim start als TNA icon ablegen (https://www.delphipraxis.net/101574-programm-beim-start-als-tna-icon-ablegen.html)

SaFu 15. Okt 2007 20:04


Programm beim start als TNA icon ablegen
 
Hi

habe mal folgendes Problem ich möchte mein Programm beim Autostart direkt als TNA icon ablegen habe mich mal durch das forum gekämpft aber nichts richtiges gefunden.

der code hier minimiert mir erst das Programm als TNA icon wenn ich unten auf der taskleite auf das feld mit meinem Programm drücke wie kann ich es aber direkt minimiert lassen
Delphi-Quellcode:
unit Unit1; // Anmeldung

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, ShellApi, Mask,XPMan, DB, DBTables,
  OleCtrls,DateUtils, SHDocVw,INIFiles, jpeg, AppEvnts;

 const
  WM_TASKBAREVENT = WM_USER + 1;

type
  TForm1 = class(TForm)

   
    ApplicationEvents1: TApplicationEvents;
    procedure ApplicationEvents1Minimize(Sender: TObject);



  private

  procedure WMTaskbarEvent(var Message: TMessage); message WM_TASKBAREVENT;
  procedure TaskBarRemoveIcon;
  procedure TaskBarAddIcon;
  public

  end;

var
  Form1: TForm1;


implementation

uses

{$R *.dfm}


procedure TForm1.ApplicationEvents1Minimize(Sender: TObject);
begin
 TaskBarAddIcon;
end;

procedure TForm1.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;
     PostMessage(Application.Handle, WM_SYSCOMMAND, SC_MINIMIZE, 0);
  end;
   StrCopy(tnid.szTip, 'Runterfahren');
   Shell_NotifyIcon(NIM_ADD, @tnid);

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

procedure TForm1.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;

procedure TForm1.WMTaskbarEvent(var Message: TMessage);
var
  Point: TPoint;
begin
  case Message.LParamLo of
     WM_LBUTTONDOWN: TaskBarRemoveIcon;
     WM_RBUTTONDOWN:
     begin
       SetForegroundWindow(Handle);
       GetCursorPos(point);
     end;
  end;
end;
end.
muss man da nur was ändern

OregonGhost 15. Okt 2007 20:15

Re: Programm beim start als TNA icon ablegen
 
Kannst du nicht einfach TaskbarAddIcon direkt aufrufen, z.B. im FormCreate-Event?

Übrigens, nur so nebenbei, bei Larry Osterman gibt es eine interessante Artikelserie zum Thema TNA-Applets (nach "applet" suchen).

SaFu 15. Okt 2007 20:27

Re: Programm beim start als TNA icon ablegen
 
Zitat:

Zitat von OregonGhost
Kannst du nicht einfach TaskbarAddIcon direkt aufrufen, z.B. im FormCreate-Event?

das habe ich breits schon versucht geht aber nicht

Muetze1 15. Okt 2007 20:40

Re: Programm beim start als TNA icon ablegen
 
Ich hätte da ein Beispielproejekt zu bieten. Vergleich das mal, das kann dir vllt. helfen den Fehler zu finden.

SaFu 15. Okt 2007 20:55

Re: Programm beim start als TNA icon ablegen
 
Liste der Anhänge anzeigen (Anzahl: 1)
hab mir die funltion mal angeguckt aber das ist auch nicht das was ich meine dein Programm Startet auch sofort. aber es soll ja minimirt unten rechts als icon starten und erst wenn ich drauf drücke aufs icon soll es gross werden.


Es funtzt soweit bei mir auch ganz gut nur mein Programm startet Groß und nicht minimiert als icon

OregonGhost 15. Okt 2007 20:57

Re: Programm beim start als TNA icon ablegen
 
Und wenn du dein Hauptformular halt minimiert startest?

SaFu 15. Okt 2007 21:12

Re: Programm beim start als TNA icon ablegen
 
hab ich auch hiermit versucht
Delphi-Quellcode:

Application.Minimize;
wie geschrieben hab das ganze forum auf den kopf gestellt

OregonGhost 15. Okt 2007 21:17

Re: Programm beim start als TNA icon ablegen
 
Ich dachte mehr daran, den WindowState im Objektinspektor auf wsMinimized zu stellen (oder wie das in Delphi eben hieß), geht das nicht?

Progman 15. Okt 2007 21:23

Re: Programm beim start als TNA icon ablegen
 
ich habe das mal vor einiger Zeit so gemacht, dass ich mir ein Form als kleines Startfenster gemacht habe, dort wurde dann das Hauptform erzeugt und in die TNA gepackt. Dann wurde das Startform geschlossen. Das war praktisch wie ein kleiner Splashscreen mit ner Startmitteilung.
Bei Klick auf das TNA-Icon gabs dann ein Popupmenu mit Öffnen, Beenden etc.
Müsste allerdings den Code erstmal suchen....

Whookie 15. Okt 2007 21:27

Re: Programm beim start als TNA icon ablegen
 
Was spricht eigentlich dagegen TCoolTrayIcon zu verwenden?

omata 15. Okt 2007 21:41

Re: Programm beim start als TNA icon ablegen
 
[bitte löschen]

Progman 15. Okt 2007 21:41

Re: Programm beim start als TNA icon ablegen
 
Liste der Anhänge anzeigen (Anzahl: 1)
so, hier ist ne kleine Testapp im Anhang. Vielleicht hilfts ja ;)

Muetze1 15. Okt 2007 21:41

Re: Programm beim start als TNA icon ablegen
 
Zitat:

Zitat von fuknersascha
hab mir die funltion mal angeguckt aber das ist auch nicht das was ich meine dein Programm Startet auch sofort. aber es soll ja minimirt unten rechts als icon starten und erst wenn ich drauf drücke aufs icon soll es gross werden.

Nichts leichter als das. Mein Projekt dort folgende Routine ergänzen:
Delphi-Quellcode:
Procedure Tfrm_MainForm.DoCreate;
Begin
  fTaskBarNewReg      := RegisterWindowMessage('TaskbarCreated');
  fTaskBarPopupMenuMsg := RegisterWindowMessage('TaskBarPopupMenu');

    // remove for multiple instances
  fInstanceMsg        := RegisterWindowMessage('TaskBarIconExampleApp');

  Inherited DoCreate;

    // remove for multiple instances
  SendMessage(HWND_BROADCAST, fInstanceMsg, Handle, 0);

    // >>>> folgendes neu hinzu
  TaskBarAddIcon;
  Application.ShowMainForm := false;
    // <<<< bis hier
End;
Siehe letzte beiden Anweisungen

SaFu 17. Okt 2007 19:30

Re: Programm beim start als TNA icon ablegen
 
Danke euch nochmal für die Antorten habe es jetzt aber mal anders gelöst

Falls es jemanden Interessiert oder es mal brauch der Code ist auch ziemlich einfach zu verstehen

Delphi-Quellcode:
unit Unit1;

interface

uses ShellApi;
 
 const WM_TASKBAREVENT = WM_USER + 1;

type
  TForm1 = class(TForm)
    TNATimer2: TTimer;
    TNAPopup1: TPopupMenu;
    TNAImage2: TImage;
    Runterfahren1: TMenuItem;
    Beenden1: TMenuItem;
    procedure FormShow(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure TNATimer2Timer(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure oeffnen1Click(Sender: TObject);
    procedure Beenden1Click(Sender: TObject);
    procedure Timer3Timer(Sender: TObject);

  private
  procedure TaskBarRemoveIcon;
  procedure TaskBarAddIcon;

  protected
   procedure WMTaskbarEvent(var Message: TMessage); message WM_TASKBAREVENT;
  end;

var
  Form1: TForm1;

implementation

uses
var count :Integer;
{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var i: integer;
begin
  TaskBarAddIcon; // Icon setzen
end;

procedure TForm1.FormShow(Sender: TObject);
begin
  ShowWindow(GetWindow(handle,GW_OWNER),SW_HIDE); // Taskbareintrag löschen
end;

//=========Bei Formstart Iconsetzen=============================================
procedure TForm1.TNATimer2Timer(Sender: TObject);
begin
 Inc(count);
  if count = 3 then
   begin
     Self.Hide;
     TNATimer2.Enabled:= False;
   end;
end;

//==================Icon setzen=================================================
procedure TForm1.TaskBarAddIcon;
var tnid: TNotifyIconData;
 begin
   tnid.cbSize := SizeOf(TNotifyIconData);
   tnid.Wnd := Form1.Handle;
   tnid.uID := 1;
   tnid.UFlags:= NIF_MESSAGE or NIF_ICON or NIF_TIP;
   tnid.uCallbackMessage:= WM_TASKBAREVENT;
   tnid.hIcon:= Form1.TNAImage2.Picture.Icon.Handle;
   strcopy(tnid.szTip,'Rechner Runterfahren');
   Shell_NotifyIcon(NIM_Add, @tnid)
end;

//===============Beim öffnen des Icon( Popup)===================================
procedure TForm1.oeffnen1Click(Sender: TObject);
begin
 Form1.Show;
 Timer3.Enabled:= True;
end;

//===========Nach erneuten öfnnen des Programms wieder schließen================
procedure TForm1.Timer3Timer(Sender: TObject);
begin
  Self.Hide;
  Timer3.Enabled:= False;
end;

//===============Beim schließen des Icon( Popup)================================
procedure TForm1.Beenden1Click(Sender: TObject);
begin
 close;
end;

//=====Beim Form schließen Icon wieder aufräumen================================
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 TaskBarRemoveIcon;
end;

//==================Icon weg====================================================
procedure TForm1.TaskBarRemoveIcon;
var tnid: TNotifyIconData;
  begin
   tnid.cbSize := SizeOf(TNotifyIconData);
   tnid.Wnd := Form1.Handle;
   tnid.uID := 1;
   Shell_NotifyIcon(NIM_DELETE, @tnid)
end;

//=================Icon Rechts/Links klick =====================================
procedure TForm1.WMTaskbarEvent(var Message: TMessage);
var Point: TPoint;
begin
  case Message.LParamLo of
     WM_LBUTTONDOWN:   // bei Linksklick
     begin
      Form1.Show;
      Timer3.Enabled:= True;
     end;
     WM_RBUTTONDOWN: // bei Rechtsklick
     begin
        GetCursorPos(point);
        TNAPopup1.Popup(point.X,point.Y);
     end;
  end;
end;

end.
Somit wird das Programm gleich beim Start als TNA Icon angezeigt

Wenn man das programm mit rechtsklick auf das icon wieder Öffnet wird es mit hilfe der Eingestellten zeit des Timer3 wieder geschloßen.

Gruß sascha :thumb:

Muetze1 17. Okt 2007 20:56

Re: Programm beim start als TNA icon ablegen
 
Wie kannst du einen Timer3 programmieren (gleiches für Timer1 & Timer2), wenn diese nicht mal auf der Form liegen (und auch nicht deklariert sind)?

Vor allem ist eine Timerlösung wie mit Kanonen auf Spatzen schiessen. An meinem Beispiel kannst du ja sehen, dass es mit 2 zusätzlichen Zeilen (welche du bei dir genauso anwenden kannst) gleiches bewirkt.

SaFu 17. Okt 2007 21:03

Re: Programm beim start als TNA icon ablegen
 
Habe es jetzt nochmal oben Editiert und die zwei zuvielen timer heraus genommen

Ich zweifle ja nicht deine lösung würde ich mir nie bei meinem Programmierstand heraus nehmen

ich fande nur das es mir so am einfachsten erschien da ich beim Programmieren ja nicht gerade die leuchte bin im gegensatz zu anderen hier :lol:


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:20 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