![]() |
AW: Das Problem mit dem vergessenem TrayIcon
Zitat:
a.) Komponente Vorteile: Wiederverwendbar, für den Programmier leicht zu benützen, in der Regel "idiotensicher" und Fehlerfrei Nachteile: muss installiert werden, bringt gewissen Overhead mit sich b.) eine Klasse (von TObject abgeleitet) Vorteile: Wiederverwendbar, relativ leicht zu benützen Nachteile: keine c.) direkter Aufruf von Windows API-Funktionen Vorteile: erlaubt auch spezielle Anpassungen Nachteile: nicht wiederverwendbar, Fehlerträchtig, Code verschmutzt die Anwendung, schlecht auf Veränderungen anpassbar Ein professioneller Programmierer kann eigentlich nur die Ansätze a.) oder b.) verwenden. Die Variante c.) ist für Cowboy-Programmierer. |
AW: Das Problem mit dem vergessenem TrayIcon
Zitat:
bin ich doch lieber ein Cowboy-Programmierer Anstatt wie du "Ein professioneller Programmierer" Der alles in doppelter ausführung abgelegt haben muss letztendlich ruft auch deine Klasse die selbe API auf halt nur über Umwege und das soll professional sein? Zum Thema da gab es immer schon diverse probleme mit den Tray Icons das diese nicht oder schlecht aktualisiert wurden. Gab irgendwo mal einen Patch vom MS dafür .. hab ihn aber vergessen. gruss |
AW: Das Problem mit dem vergessenem TrayIcon
Zitat:
Zitat:
Zitat:
b) gegen eine Klasse habe ich nichts und wenn alles fehlerfrei funktioniert, dann mache ich es sofort. Aber auch wenn die letzte Version relativ gut funktioniert, so nicht 100% fehlerfrei. Mich wundert es, dass es hier noch keinem aufgefallen ist, allerdings ist es nicht ein Problem einzig von mir. Ich hatte schon einige Delphi-Fremdprogramme bei denen auch diese Probleme vorkamen. c) mag sein, aber nicht selten schreibe ich die paar Zeilen schneller als das ich eine Unit oder Klasse erst suchen muß. Im Grunde genommen sind es nur paar Zeilen Code, wenn man nichts komplexes will, wie z.B. wechselnde Icons, Reaktionen auf verschiedene Aktionen, usw. Wenn man nur ein PopupMenu aufrufen will, sind es nur paar Zeilen. Aber hier geht es nicht drum was die einzig richtige Methode ist, sondern warum das Problem besteht. Soll ich irgendwann im hohen Alter meinen Enkeln erzählen, ich hatte da ein Problem, ich habe es aber nicht gelöst, ich habe einfach eine Fremdkomponente genommen? |
AW: Das Problem mit dem vergessenem TrayIcon
Du hast doch ne CallBack in der Shell_NotifyIcon API
Welche Message verwendest du denn dafür? Und das wäre eine möglichkeit! FindWindowEx GetClientRect SendMessage gruss |
AW: Das Problem mit dem vergessenem TrayIcon
Zitat:
Hauptsache es funktioniert irgendwie, ist wohl deine Einstellung. Als "Profi" kann ich mir so etwas nicht leisten. Jede Unsauberkeit rächt sich später irgendwann (zumindest dann wenn man eine Software über mehr als 10 Jahre erweitern, verbessern und warten muss). Ich hab' hier mehrere Projekte mit zusammen 1,4 Mio Zeilen. Um dies zu bewältigen, muss man einfach jeden Zugriff auf die Windows API der etwas komplizierter ist auf irgendeine Art und Weise kapseln. Wenn Windows ein Handle zurückliefert mit dem weitere API-Funktionen aufgerufen werden, ist das ein ganz klares Zeichen, dass man das Handle mit einer Klasse kapseln muss. Auch Programmierer die nur so zum Spaß programmieren können noch was dazulernen indem sie ihre "Hauptsache es funktioniert" Einstellung ablegen. |
AW: Das Problem mit dem vergessenem TrayIcon
Zitat:
![]() Wobei sich das obere Beispiel in einem Punkt von allen meinen Versuchen unterscheidet: es führt in FormDestroy die ganze Prozedur ein zweites Mal durch. Ich, und eigentlich auch die anderen Beispiele, führten in FormDestroy einfach nur
Delphi-Quellcode:
aus, hier ward alles noch mal zugewiesen. Aber bis auf NotifyIconData.Wnd Zuweisung sehe ich da keinen nennenswerten Unterschied. Trotzdem funktioniert der Code besser als die anderen. Aber auch nicht perfekt.
Shell_NotifyIcon(NIM_DELETE, @NotifyIconData)
Zitat:
|
AW: Das Problem mit dem vergessenem TrayIcon
Zitat:
Das sollte gehen. (Auf die schnelle zusammengetippt (Ungetestet)) Warnung API vom Cowboy-Programmierer
Delphi-Quellcode:
gruss
procedure CleanTray;
{Entfernt ungenutzte icons vom system tray} var TrayNotifyHwnd: HWND; ParentHwnd: HWND; TrayWindowRect: TRect; x: integer; y: integer; begin ParentHwnd := FindWindow('Shell_TrayWnd', ''); //Hwnd vom TrayNotifyWnd ermitteln TrayNotifyHwnd := FindWindowEx(ParentHwnd, 0, 'TrayNotifyWnd', ''); //ClientRect von der Classe TrayNotifyWnd einlesen GetClientRect(TrayNotifyHwnd, TrayWindowRect); x :=0; y :=0; while x < TrayWindowRect.Right do begin while y < TrayWindowRect.Bottom do begin SendMessage(TrayNotifyHwnd, WM_MOUSEMOVE, 0, (y shl 16) + x); y := y + 5; end; x := x + 5; end; end; |
AW: Das Problem mit dem vergessenem TrayIcon
Zitat:
dann muß man nur an einer Stelle, in dieser Klasse, etwas ändern. Außerdem hat man den Code so an einer Stelle vereint, anstatt die verschiedenen Aufrufe/Funktionen eventuell noch sonstwo verteilt zu haben. (leichter zu finden) Und wenn diese Klasse dann auch noch mindestens in 2 Programmen verwendet wird, dann hast du gleich alle Programme automatisch angepaßt. |
AW: Das Problem mit dem vergessenem TrayIcon
Zitat:
Grundsätzlich hast du aber schon recht. (Was Delphi angeht) PS:
Delphi-Quellcode:
NotifyIconData.uCallbackMessage := WM_TASKABAREVENT;
sollte WM_MOUSEMOVE sein. Deshalb meine Frage nach der CallbackMessage. gruss |
AW: Das Problem mit dem vergessenem TrayIcon
Zitat:
Natürlich kann ich alles kapseln und ob du es glabst oder nicht, das mache ich auch, aber nicht immer. Warum soll ich die Funktion zum einlesen alle Daten eines Ordners auslagern, wenn das Programm selbst nie mehr als 30 Zeilen haben wird. Es gibt immer einen Unterschied ob man ein professionelles Programm schreibt oder schnell ein Problemlöser. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:44 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz