Änderung des SystrayIcon bei Ereigniss?
hi,
bei icq verändert sich das Systray icon ja wenn man ne nachricht bekommt.
kann ich das mit delphi auch verwirklichen?
es is für nen netzwerkchat gedacht, der hauptsächlich in der schule verwendet wird.
Das programm läuft also minimiert mit dem Icon in der systray, wenn jetzt ne nachricht kommt sollte sich das icon ändern.
versteht ihr was ich meine?
bei icq verändert sich das Systray icon ja wenn man ne nachricht bekommt.
kann ich das mit delphi auch verwirklichen?
es is für nen netzwerkchat gedacht, der hauptsächlich in der schule verwendet wird.
Das programm läuft also minimiert mit dem Icon in der systray, wenn jetzt ne nachricht kommt sollte sich das icon ändern.
versteht ihr was ich meine?
If liberty means anything at all, it means the right to tell people what they do not want to hear. - Georg Orwell
Klar ist das möglich, es gibt im Grunde nix was nicht möglich ist mit Delphi. Das einzige, was ich mich jetzt noch frage, bevor ich dir helfen kann ist, ob du schon ein Systray-Icon implementiert hast, oder ob du im Moment mit leeren Händen da stehst. Falls du bereits nen Systray-Icon haben solltest, so lass mir doch mal den Quelltext zu kommen, so dass ich dir sagen kann, wie du das Icon ändern kannst.
Warum kann ein Tag nicht 36 Stunden haben? ://
hi,
ich hab den code von swissdelphi center:
ich hab den code von swissdelphi center:
|
|
Quellcode |
1 2 |
private procedure Systray(var sMsg: TMessage); message IC_CLICK; |
|
|
Quellcode |
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 |
procedure TForm1.ApplicationEvents1Minimize(Sender: TObject);
begin
Form1.FormStyle:=fsStayOnTop;
Hide;
with NIM do begin
cbSize := SizeOf (nIM);
Wnd := Handle;
uID := 0;
uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
uCallbackMessage := IC_CLICK;
hIcon := Application.Icon.Handle;
szTip := 'NetworkMessenger';
end;
Shell_NotifyIcon(NIM_ADD, @NIM);
end;
procedure TForm1.Systray(var sMsg: TMessage);
begin
inherited;
if (sMsg.LParam = WM_LBUTTONDOWN) then begin
Show;
Shell_NotifyIcon(NIM_DELETE, @NIM);
Application.Restore; //zeigt die Anwendung wieder an
end;
end;
|
If liberty means anything at all, it means the right to tell people what they do not want to hear. - Georg Orwell
Ich weiß nicht genau, welchen Tipp du von der Seite verwendest und habe selber nur diesen hier gefunden: http://www.swissdelphicenter.ch/de/showcode.php?id=1303
Falls du den Tipp bereits verwendest, dann ist es die Methode "procedure TTrayIcon.SetIcon(Icon: TIcon);" der Komponente "TTrayIcon" die du suchst. Konkret wäre dann der Befehl für das ändern des Icons:
Das Beispiel geht davon aus, dass deine "TTrayIcon"-Komponente auf der Form "TrayIcon1" heisst und dass die Prozedur "WannAuchImmer()" eine Methode der Form ist (z.b. Minimieren, Schliessen, aber auch Button1.Click(), etc.). Weiterhin solltest du, wie unschwer zu erkennen einen Unterordner "icons" im Verzeichnis deiner EXE-Datei haben und darin sollten sich die Dateien "TrayIcon1.ico" und "TrayIcon2.ico" befinden. Wenn dir das alles zu kompliziert ist und du die Icons lieber schon bei der Entwicklung einbinden willst, dann erzeuge zwei Images auf der Form mit Namen: ImgTrayIcon1, ImgTrayIcon2 und rufe "TrayIcon1.SetIcon()" folgendermaßen auf:
Falls du jetzt allerdings die Unit die ich oben gepostet habe nicht verwendest, sondern einen anderen Code, den ich nicht auf Anhieb dort gefunden habe, stehst du vor der Entscheidung, entweder diese Unit zusammen mit meinen Tipps zu verwenden, oder aber noch einmal zu posten und mir den Link zukommen zu lassen, so dass ich mir das mal genauer anschauen kann
Viel Erfolg bei was auch immer doch codest
Falls du den Tipp bereits verwendest, dann ist es die Methode "procedure TTrayIcon.SetIcon(Icon: TIcon);" der Komponente "TTrayIcon" die du suchst. Konkret wäre dann der Befehl für das ändern des Icons:
|
|
Quellcode |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
...
USES .... + StrUtils
...
...
...
procedure WannAuchImmer(Sender: TObject);
var imgTrayIcon1, imgTrayIcon2 : TImage;
var DateiName : String;
begin
Dateiname := LeftStr(Application.ExeName,LastDelimiter('\',Application.ExeName)) & 'icons\TrayIcon1.ico';
imgTrayIcon1.Picture.LoadFromFile(Dateiname);
Dateiname := LeftStr(Application.ExeName,LastDelimiter('\',Application.ExeName)) & 'icons\TrayIcon2.ico';
imgTrayIcon2.Picture.LoadFromFile(Dateiname);
// Und dann halt entweder:
TrayIcon1.SetIcon(imgTrayIcon1);
// oder:
TrayIcon1.SetIcon(imgTrayIcon2);
//je nach dem, welches Icon du haben willst.
end;
end;
|
Das Beispiel geht davon aus, dass deine "TTrayIcon"-Komponente auf der Form "TrayIcon1" heisst und dass die Prozedur "WannAuchImmer()" eine Methode der Form ist (z.b. Minimieren, Schliessen, aber auch Button1.Click(), etc.). Weiterhin solltest du, wie unschwer zu erkennen einen Unterordner "icons" im Verzeichnis deiner EXE-Datei haben und darin sollten sich die Dateien "TrayIcon1.ico" und "TrayIcon2.ico" befinden. Wenn dir das alles zu kompliziert ist und du die Icons lieber schon bei der Entwicklung einbinden willst, dann erzeuge zwei Images auf der Form mit Namen: ImgTrayIcon1, ImgTrayIcon2 und rufe "TrayIcon1.SetIcon()" folgendermaßen auf:
|
|
Quellcode |
1 |
TrayIcon1.SetIcon(imgTrayIcon1.Picture.Icon); |
Falls du jetzt allerdings die Unit die ich oben gepostet habe nicht verwendest, sondern einen anderen Code, den ich nicht auf Anhieb dort gefunden habe, stehst du vor der Entscheidung, entweder diese Unit zusammen mit meinen Tipps zu verwenden, oder aber noch einmal zu posten und mir den Link zukommen zu lassen, so dass ich mir das mal genauer anschauen kann

Viel Erfolg bei was auch immer doch codest
Warum kann ein Tag nicht 36 Stunden haben? ://
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Abi_Andy« (23. Dezember 2004, 01:22)
sorry das ich jetzt erst schreib.
ich hab die Komponente ApplicationEvents und den code hier:
ich habs doch nicht von swissdelphicenter, sorry
ich hab die Komponente ApplicationEvents und den code hier:
|
|
Quellcode |
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 |
procedure TForm1.ApplicationEvents1Minimize(Sender: TObject);
begin
//Vorgang: Minimieren der Anwendung, Entfernung des Taskleisteneintrags
//und Hinzufügen des Programmicons neben der Uhr
Form1.FormStyle:=fsStayOnTop;
Hide;
with NIM do begin
cbSize := SizeOf (nIM);
Wnd := Handle;
uID := 0;
uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
uCallbackMessage := IC_CLICK;
hIcon := Application.Icon.Handle;
szTip := 'NetworkMessenger';
end;
Shell_NotifyIcon(NIM_ADD, @NIM);
end;
procedure TForm1.Systray(var sMsg: TMessage);
begin
// Vorgang: Klick auf das Icon neben der Uhr und Anzeige der Anwendung
inherited;
if (sMsg.LParam = WM_LBUTTONDOWN) then begin
Show;
Shell_NotifyIcon(NIM_DELETE, @NIM);
Application.Restore; //zeigt die Anwendung wieder an
end;
end;
|
ich habs doch nicht von swissdelphicenter, sorry
If liberty means anything at all, it means the right to tell people what they do not want to hear. - Georg Orwell
|
|
Quellcode |
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 |
procedure TForm1.ApplicationEvents1Minimize(Sender: TObject);
var imgTrayIcon1, imgTrayIcon2 : TPicture;
var DateiName : String;
begin
Dateiname := (LeftStr(Application.ExeName,LastDelimiter('\',Application.ExeName)) + 'icons\TrayIcon1.ico');
imgTrayIcon1.LoadFromFile(Dateiname);
Dateiname := (LeftStr(Application.ExeName,LastDelimiter('\',Application.ExeName)) + 'icons\TrayIcon2.ico');
imgTrayIcon2.LoadFromFile(Dateiname);
//Vorgang: Minimieren der Anwendung, Entfernung des Taskleisteneintrags
//und Hinzufügen des Programmicons neben der Uhr
Form1.FormStyle:=fsStayOnTop;
Hide;
with NIM do begin
cbSize := SizeOf (nIM);
Wnd := Handle;
uID := 0;
uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
uCallbackMessage := IC_CLICK;
//hIcon := Application.Icon.Handle;
//jetzt entweder:
hIcon := imgTrayIcon1.Icon.Handle;
//oder:
hIcon := imgTrayIcon2.Icon.Handle;
//je nachdem welches der beiden Icons du nehmen willst.
szTip := 'NetworkMessenger';
end;
Shell_NotifyIcon(NIM_ADD, @NIM);
end;
procedure TForm1.Systray(var sMsg: TMessage);
begin
// Vorgang: Klick auf das Icon neben der Uhr und Anzeige der Anwendung
inherited;
if (sMsg.LParam = WM_LBUTTONDOWN) then begin
Show;
Shell_NotifyIcon(NIM_DELETE, @NIM);
Application.Restore; //zeigt die Anwendung wieder an
end;
end;
|
Ist ungeprüft, sollte aber denke ich funktionieren. Ich kann das nicht testen, weil bei mir irgendwie die Komponente "ApplicationEvents" fehlt. Ich verwende nämlich immer noch die damals kostenlose Delphi 6 Personal ... und bin im Grunde immer noch zufrieden

Versuchs einfach mal so. Wenn's nicht geht, poste halt wieder ... bin aber erst am dienstag Abend wieder hier.
Warum kann ein Tag nicht 36 Stunden haben? ://
Verzweiflung!!
Es geht nicht!
Undefinierter Bezeichner.
und wenn ich den ganzen Pfad angebe also:
dann kommt wenn ich im laufendem Programm auf Minimieren klicke die Meldung, dass das Programm wegen einem Fehler beendet wurde...
Es geht nicht!
|
|
Quellcode |
1 |
LeftStr |
Undefinierter Bezeichner.
und wenn ich den ganzen Pfad angebe also:
|
|
Quellcode |
1 |
Dateiname := Pfad:\zum\icon.ico; |
dann kommt wenn ich im laufendem Programm auf Minimieren klicke die Meldung, dass das Programm wegen einem Fehler beendet wurde...
If liberty means anything at all, it means the right to tell people what they do not want to hear. - Georg Orwell
Das Problem wurde gelöst, hier ist der funktionierende Code von Abi_Andy
vielen dank an abi_andy
|
|
Quellcode |
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 |
procedure TForm1.ApplicationEvents1Minimize(Sender: TObject);
var Dateiname : String;
var imgTrayIcon1, imgTrayIcon2 : TIcon;
begin
imgTrayIcon1 := TIcon.Create;
imgTrayIcon2 := TIcon.Create;
Dateiname := (ExtractFilePath(ParamStr(0))+'icons\TrayIcon1.ico');
if FileExists(Dateiname) then imgTrayIcon1.LoadFromFile(Dateiname)
else ShowMessage('Das Icon "TrayIcon1.ico" konnte nicht im Unterverzeichnis ' +
'"icons" gefunden werden!');
Dateiname := (ExtractFilePath(ParamStr(0))+'icons\TrayIcon2.ico');
if FileExists(Dateiname) then imgTrayIcon2.LoadFromFile(Dateiname)
else ShowMessage('Das Icon "TrayIcon2.ico" konnte nicht im Unterverzeichnis ' +
'"icons" gefunden werden!');
//Vorgang: Minimieren der Anwendung, Entfernung des Taskleisteneintrags
//und Hinzufügen des Programmicons neben der Uhr
Form1.FormStyle:=fsStayOnTop;
Hide;
with NIM do begin
cbSize := SizeOf (nIM);
Wnd := Handle;
uID := 0;
uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
uCallbackMessage := IC_CLICK;
//jetzt entweder:
hIcon := imgTrayIcon1.Handle;
//oder:
hIcon := imgTrayIcon2.Handle;
//je nachdem welches der beiden Icons du nehmen willst.
szTip := 'NetworkMessenger';
end;
Shell_NotifyIcon(NIM_ADD, @NIM);
end;
procedure TForm1.Systray(var sMsg: TMessage);
begin
// Vorgang: Klick auf das Icon neben der Uhr und Anzeige der Anwendung
inherited;
if (sMsg.LParam = WM_LBUTTONDOWN) then begin
Show;
Shell_NotifyIcon(NIM_DELETE, @NIM);
Application.Restore; //zeigt die Anwendung wieder an
end;
end;
|
vielen dank an abi_andy
If liberty means anything at all, it means the right to tell people what they do not want to hear. - Georg Orwell


