Autor Beitrag
Luzzifus
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 200

Win2K
D6 Prof
BeitragVerfasst: Do 12.09.02 09:00 
Hi Leute..

in den FAQs stehts ja nicht mehr drin also frag ich hier:
Ich hab mein Programm mit folgendem Quelltext dazu veranlasst, im Tray und nicht in der Taskbar zu erscheinen:

ausblenden volle Höhe Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
unit main;

uses
  ...

const MSG_IconCallback = WM_APP + 100;

type
    ...
  private
    ...
  public
    ...
    procedure ApplicationEvents1Minimize(Sender: TObject);
    procedure ApplicationEvents1Restore(Sender: TObject);
    procedure WM_IconCallback(var Msg: TMessage); message MSG_IconCallback;
  end;

var
  ...
  d: TNotifyIconData;
  Ico: TIcon;

implementation
...
...

procedure TForm1.FormCreate(Sender: TObject);
begin
    ...
    Ico := TIcon.Create;
    Ico.Handle := LoadIcon(HINSTANCE, 'MAINICON');
    d.cbSize := sizeof(d);
    d.hIcon := Ico.Handle;
    d.WND := self.Handle;
    d.uID := 0;
    d.uCallbackMessage := MSG_IconCallback;
    d.uFlags := NIF_MESSAGE or NIF_ICON;
    Shell_NotifyIcon(NIM_ADD, @d);
    Application.OnMinimize := ApplicationEvents1Minimize;
    Application.OnRestore := ApplicationEvents1Restore;
    ...
end;

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

procedure TForm1.ApplicationEvents1Minimize(Sender: TObject);
begin
    ShowWindow(GetWindow(Handle,GW_OWNER),SW_HIDE);
    Shell_NotifyIcon(NIM_ADD, @d);
end;

procedure TForm1.ApplicationEvents1Restore(Sender: TObject);
begin
    ShowWindow(GetWindow(Handle,GW_OWNER),SW_HIDE);
    Application.BringToFront;
end;

procedure TForm1.WM_IconCallback(var Msg: TMessage);
begin
    if Msg.LParam = WM_LBUTTONDBLCLK then
    begin
    Application.Restore;
    Application.BringToFront;
    end;
    if Msg.LParam = WM_RBUTTONDOWN then
    PopupMenu1.Popup(Mouse.CursorPos.x, Mouse.CursorPos.y);
end;

procedure TForm1.FormShow(Sender: TObject);
begin
    ShowWindow(GetWindow(Handle,GW_OWNER),SW_HIDE);
end;


Das funktioniert eigentlich auch ganz gut, nur gibts da folgendes kleine Problem:
wenn ich per ButtonClick von fsNormal auf fsStayOnTop wechsele oder umgekehrt, verschwindet das TrayIcon einfach und kommt nicht wieder.

Wieso passiert das und/oder was kann ich dagegen tun??
OregonGhost
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 215



BeitragVerfasst: Do 12.09.02 12:24 
Ich weiß nicht genau, was beim Wechsel passiert, aber bei mir flackert immer die komplette Form auf - so als würde sie neu erzeugt werden.

Probier doch mal, vor dem Wechsel das TrayIcon zu entfernen und hinterher wieder zu erzeugen.

_________________
Oregon Ghost
---
Wenn NULL besonders groß ist, ist es fast schon wie ein bisschen eins.
Luzzifus Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 200

Win2K
D6 Prof
BeitragVerfasst: Do 12.09.02 18:05 
doesn't work.. das Icon wird dann zwar nochmal neu erstellt, aber es verschwindet trotzdem gleich wieder..
O'rallY
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 563



BeitragVerfasst: Di 17.09.02 20:07 
Guckst du mal hier: www.swissdelphicente...showcode.php?id=1303. Ein schönes Beispiel für eine einfache Kompo die ein TrayIcon fabriziert.
oder probier mal diese Kompo hier delphi.icm.edu.pl/ftp/d20free/cooltray.zip.

_________________
.oO'rallY
Linux is like a tipi: No gates, no windows and a gnu-eating apache inside...
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 17.09.02 20:21 
Ein TNA-Symbol erfordert eine "TNotifyIcon"-Variable, die man bereits beim Deklarieren zum größten Teil initialisieren kann. Dann bleiben zwei Anweisungen zum Setzen und Entfernen des Symbols, sowie eine recht einfache Prozedur für die Nachrichtenbearbeitung des Symbols.

Also, das sind im Normalfall nicht mal 10 Zeilen Code. Nichts, wofür ich eine Komponente nehmen würde. :wink:
Luzzifus Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 200

Win2K
D6 Prof
BeitragVerfasst: Di 17.09.02 22:13 
MathiasSimmack hat folgendes geschrieben:
Also, das sind im Normalfall nicht mal 10 Zeilen Code. Nichts, wofür ich eine Komponente nehmen würde.


ich bin aber nicht sooo der delphi-crack dass ich mir meine nachrichtenbehandlungs-routinen selbst schreiben kann.. :shock:
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 18.09.02 07:59 
Luzzifus hat folgendes geschrieben:
ich bin aber nicht sooo der delphi-crack dass ich mir meine nachrichtenbehandlungs-routinen selbst schreiben kann..

Ich bin auch nur ein Hobby-Entwickler und kein super bezahlter Profi (leider). Außerdem hast du´s doch schon getan:
ausblenden Quelltext
1:
procedure TForm1.WM_IconCallback(var Msg: TMessage);					

Wenn dich das Thema interessiert, dann schau dir doch einfach mal die Tutorials von Luckie an - allerdings die neue Version. (Nicht die 1.5er, die du hier bei AUQ.de in der Tutorialsparte herunterladen kannst.) Da ist ein kleines TNA-Kapitel drin.
Auf dem Reihe5-Server steckt übrigens auch noch der Quellcode von Speedy. Das Programm benutzt ebenfalls eine TNA-Schnittstelle, weil es keine eigene Oberfläche in dem Sinn hat.

Das wäre ohnehin mein nächster Rat/Tipp/Vorschlag:
Wenn dein Programm sichtbar und im Vordergrund ist, dann halte ich ein gleichzeitiges TNA-Symbol für Quatsch. Es (das Programm) ist doch zu sehen. Und wenn es durch das "stay on top" nicht mal in den Hintergrund rutschen kann, dann brauchst du das zusätzliche Symbol erst recht nicht.
Das Symbol in der TNA ist IMHO nur dazu da, dem Anwender die Steuerung des Programmes zu erlauben, wenn das nicht zu sehen ist, bzw. es zeigt gewisse Statusmeldungen durch Änderungen des Tipptextes oder des Icons an.

Wenn man dein Programm z.B. minimiert, dann könnte es in die TNA verschwinden -wenn´s denn sein soll! Oder wenn du möchtest, dass es nicht beendet sondern stattdessen in der TNA abgelegt wird, dann mach eine Dialogbox wie bei ZoneAlarm, dass der Anwender das auch merkt.

Nichts ist nerviger als eine Fehlermeldung wie
Zitat:
Das Programm kann nur einmal gestartet werden

und dann beginnt das große Rätselraten, wieso - bis man dann endlich merkt: ah, das Programm ist ja noch als TNA-Symbol aktiv.
Tino
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Veteran
Beiträge: 9839
Erhaltene Danke: 45

Windows 8.1
Delphi XE4
BeitragVerfasst: Mi 18.09.02 10:29 
MathiasSimmack hat folgendes geschrieben:
Nicht die 1.5er, die du hier bei AUQ.de in der Tutorialsparte herunterladen kannst.

Die neue 1.6 Version ist jetzt auch hier verfügbar. Das Inhaltsverzeichnis habe ich auch aktualisiert!

Danke für die Info!
Gruß
TINO
Luzzifus Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 200

Win2K
D6 Prof
BeitragVerfasst: Mi 18.09.02 12:07 
erstmal DANKE für eure vorschläge.. bin grade dabei die compo auszuprobieren, werd mir auch mal die Lucky-Tuts angucken.. ich sag dann nochmal bescheid obs mir geholfen hat..

MathiasSimmack hat folgendes geschrieben:
Außerdem hast du´s doch schon getan:
ausblenden Quelltext
1:
2:
 
procedure TForm1.WM_IconCallback(var Msg: TMessage);


hab ich das?? :D hab ich mir doch auch nur aus nem FAQ zusammengesucht..


MathiasSimmack hat folgendes geschrieben:
Wenn dein Programm sichtbar und im Vordergrund ist, dann halte ich ein gleichzeitiges TNA-Symbol für Quatsch. Es (das Programm) ist doch zu sehen. Und wenn es durch das "stay on top" nicht mal in den Hintergrund rutschen kann, dann brauchst du das zusätzliche Symbol erst recht nicht.
Das Symbol in der TNA ist IMHO nur dazu da, dem Anwender die Steuerung des Programmes zu erlauben, wenn das nicht zu sehen ist, bzw. es zeigt gewisse Statusmeldungen durch Änderungen des Tipptextes oder des Icons an.


Ich will das TNA-Symbol aus zwei Gründen:
Erstens ists ein Programm das mehr oder weniger im Hintergrund läuft, also wird auch nicht immer mit dem Fenster gearbeitet wenn das Programm läuft.. deswegen will ich nicht dass es wichtigen Platz in der Taskbar verbraucht.
Zweitens kann das Programm durchaus minimiert werden, nur WENN man grade damit arbeitet, soll die Möglichkeit bestehen das Programm dauerhaft im Vordergrund zu haben.. (aus Gründen die auf der Funktionialität des Programmes beruhen, muss man das umschalten können)
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 18.09.02 13:55 
Luzzifus hat folgendes geschrieben:
hab ich das?? :D hab ich mir doch auch nur aus nem FAQ zusammengesucht..

Tja, wie einfach das doch sein kann. :wink:

Zitat:
Erstens ists ein Programm das mehr oder weniger im Hintergrund läuft, also wird auch nicht immer mit dem Fenster gearbeitet wenn das Programm läuft.. deswegen will ich nicht dass es wichtigen Platz in der Taskbar verbraucht.

Wenn dein Formular, bzw. Fenster zu sehen ist, dann belegt es aber Platz in der Taskbar. Es sei denn natürlich, es ist vom Typ Clientwindow.

Zitat:
Zweitens kann das Programm durchaus minimiert werden,

Und daher vermute ich mal, dass es eben kein Client-Typ ist, weil der die Minimierenschaltfläche nicht bietet. Jedenfalls nicht bei mir. :(

Zitat:
nur WENN man grade damit arbeitet, soll die Möglichkeit bestehen das Programm dauerhaft im Vordergrund zu haben..

Wie gesagt, ist das Fenster sichtbar, hast du einen Button in der Taskbar. Ist es sogar "stay on top" besteht nicht mal die Gefahr, dass es verschwindet. Und selbst wenn es mal nicht sichtbar, kannst du es immer noch über die Taskbar erreichen.

Also würde ich -Achtung! persönliche Meinung, muss niemand übernehmen! :)- die TNA-Funktion nur beim Minimieren nutzen.
Luzzifus Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 200

Win2K
D6 Prof
BeitragVerfasst: Mi 18.09.02 23:51 
MathiasSimmack hat folgendes geschrieben:
Wenn dein Formular, bzw. Fenster zu sehen ist, dann belegt es aber Platz in der Taskbar. Es sei denn natürlich, es ist vom Typ Clientwindow.


tut es nicht.. meins zumindest nicht.. und es ist KEIN clientwindow und HAT eine minimize-Schaltfläche.. :D frag mich nicht wieso..

Mein proggi ist zu jedem Zeitpunkt NUR im Tray sichtbar.. und so solls auch sein. Mir gehts ja eigentlich auch nur darum, wies auch da drin bleibt (--> siehe ursprüngliches Problem).
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 19.09.02 08:54 
Luzzifus hat folgendes geschrieben:
tut es nicht.. meins zumindest nicht.. und es ist KEIN clientwindow und HAT eine minimize-Schaltfläche.. :D frag mich nicht wieso..

Da du mit der VCL programmierst, gehe ich einfach mal davon aus, irgendwo in deinem Code steckt noch ein "ShowWindow(Application.Handle,SW_HIDE)", bzw. du lässt auf andere Art und Weise den Button in der Taskbar verschwinden.

Zitat:
(--> siehe ursprüngliches Problem).

Hast du die Sache denn schon mal von einer völlig anderen Seite aus betrachtet? Guck mal, in meiner Hilfe steht folgendes:
Delphi-Hilfe (F1) hat folgendes geschrieben:
Die Eigenschaft FormStyle legt den Stil des Formulars fest.

(...)

Hinweis
Der Wert von FormStyle sollte nicht zur Laufzeit geändert werden.

Mag durchaus sein, dass wir hier nun auf eine der Merkwürdigkeiten gestoßen sind. Deine Probleme könnten durchaus damit zu tun haben, dass das TNA-Icon ständig sichtbar ist.

Ich selbst habe irgendwo noch ein Programm rumliegen, in dem ich auch zur Laufzeit umschalten kann, ob es immer sichtbar sein soll oder nicht. Nur habe ich das TNA-Symbol wirklich nur dann in der TNA, wenn ich das Programm minimieren. Dein Problem tritt bei mir also gar nicht auf.
Vielleicht solltest du diesen Ansatz mal überdenken und ausprobieren. Möglich, dass sich die ganze Sache dann in Wohlgefallen auflöst. :)
Luzzifus Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 200

Win2K
D6 Prof
BeitragVerfasst: Do 19.09.02 15:35 
MathiasSimmack hat folgendes geschrieben:
Da du mit der VCL programmierst, gehe ich einfach mal davon aus, irgendwo in deinem Code steckt noch ein "ShowWindow(Application.Handle,SW_HIDE)", bzw. du lässt auf andere Art und Weise den Button in der Taskbar verschwinden.


jepp..


MathiasSimmack hat folgendes geschrieben:
Vielleicht solltest du diesen Ansatz mal überdenken und ausprobieren. Möglich, dass sich die ganze Sache dann in Wohlgefallen auflöst.


sorry, da bin ich dickköpfig :D