Delphi-PRAXiS
Seite 4 von 4   « Erste     234   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Das Problem mit dem vergessenem TrayIcon (https://www.delphipraxis.net/166849-das-problem-mit-dem-vergessenem-trayicon.html)

Luckie 3. Mär 2012 05:56

AW: Das Problem mit dem vergessenem TrayIcon
 
Also wenn ich als Anwender einen Prozess über den Taskmanager abschieße, dann muss mir bewusst sein, dass eventuell Müll zurückbleibt, deswegen würde ich mich als Programmierer nur darum kümmern, dass mein Programm aufräumt, wenn es sauber beendet wird.

Popov 3. Mär 2012 09:16

AW: Das Problem mit dem vergessenem TrayIcon
 
Ach Leute, was soll das? Das Thema wird jetzt in eine Ecke gedrängt wo nicht hingehört, nur um Recht und das letzte Wort zu behalten. Ich sage nein, ich bin im Sommer auf eine Banane ausgerutscht. Ihr: ja im Winter ist es glatt, da rutscht man schon auf schneebedeckten Straße aus. Man kann sagen was mal will, ihr führt eurer eigenes Gespräch. Mach das, aber dann laßt mich da raus.

Ich spreche von einer Langzeitbeobachtung mit meinen und fremden Programmen und ihr kommt mir hier mit terminieren über Taskmanager.

Sir Rufo 3. Mär 2012 09:38

AW: Das Problem mit dem vergessenem TrayIcon
 
Ich habe mal in den Code von
Delphi-Quellcode:
TTrayIcon
(Delphi XE2-U4) geschaut, an welchen Stellen das Icon wieder gelöscht wird, und siehe da, das passiert nicht nur im Destroy:
Delphi-Quellcode:
destructor TCustomTrayIcon.Destroy;
begin
  if not (csDesigning in ComponentState) then
  begin
    Refresh(NIM_DELETE);
    DeallocateHWnd(FData.Wnd);
  end;
  ...
end;

procedure TCustomTrayIcon.SetVisible(Value: Boolean);
begin
  if FVisible <> Value then
  begin
    FVisible := Value;
    if (not FAnimate) or (FAnimate and FCurrentIcon.Empty) then
      SetDefaultIcon;

    if not (csDesigning in ComponentState) then
    begin
      if FVisible then
        Refresh(NIM_ADD)
      else if not (csLoading in ComponentState) then
      begin
        if not Refresh(NIM_DELETE) then
          raise EOutOfResources.Create(STrayIconRemoveError);
      end;
      if FAnimate then
        FTimer.Enabled := Value;
    end;
  end;
end;

procedure TCustomTrayIcon.WindowProc(var Message: TMessage);

...

var
  Point: TPoint;
  Shift: TShiftState;
begin
  case Message.Msg of
    WM_QUERYENDSESSION: Message.Result := 1;
    WM_ENDSESSION:
      if TWmEndSession(Message).EndSession then
        Refresh(NIM_DELETE);
  ...
end;
Das Entscheidende wird wohl hier die Reaktion auf die Nachricht
Delphi-Quellcode:
WM_ENDSESSION
sein, denn normalerweise geht man ja davon aus, dass die Komponente mit dem Form ins Nirwana gezogen wird ... wozu also dieses Reagieren auf diese Nachricht ... scheint eigentlich überflüssig, da die Form aufgrund dieser Nachricht sich ja verabschiedet.

Nein, ich verwende diese Komponente :) aber evtl. hilft das diese sporadischen TrayIcon-Hänger zu eliminieren

Popov 3. Mär 2012 10:23

AW: Das Problem mit dem vergessenem TrayIcon
 
Sieht interessant aus. Ich glaube ich bin etwas unvorbereitet in das Thema gerutscht. Seit Jahren denke ich dran, gestern habe ich die Frage gestellt, aber nicht geachtet, dass ich ein passendes Beispiel habe. Was mir aber gerade jetzt einfällt ist die Unregelmäßigkeit mit der das Problem auftritt. Jedes mal wenn das Problem auftrat, suchte ich was Neues. Und eine Zeit lang funktionierte es dann. Inzwischen frage ich mich ob das evtl. an Windows liegt. Auf jeden Fall habe ich jetzt genug neue Anregungen, so dass ich, sollte es wieder vorkommen, gezielter suchen kann.

Und an die Kollegen die glauben, dass ich seit 10 Jahren meine Programme über den Taskmanager beende: schönes Wochenende ;)

Delphi-Laie 3. Mär 2012 18:29

AW: Das Problem mit dem vergessenem TrayIcon
 
Also, sämtliche Befehle, die das TNA bzw. Systray "refreshen" (bzw. genaugenommen Windows zum Auffrischen desselben auffordern), wie soll das denn funktionieren? Das kann das Programm doch nur, solang es nicht sich selbst beeendet hat, und so lang ist das Trayicon doch aktiv?! Oder kann man das Trayicon schon vorher deaktivieren, "disablen", "visible falsen", was auch immer?

himitsu 3. Mär 2012 19:15

AW: Das Problem mit dem vergessenem TrayIcon
 
Zitat:

Zitat von delphi-laie (Beitrag 1154323)
oder kann man das trayicon schon vorher deaktivieren?

NIM_DELETE aaa

Delphi-Laie 3. Mär 2012 22:15

AW: Das Problem mit dem vergessenem TrayIcon
 
Ja, Du hast recht, ich las nicht aufmerksam genug die bisherige Diskussion.

Momentan experimentiere ich mit der Version aus der Delphi-Fundgrube (die wohl Popovs Ausführungen zugrundeliegt), es funktioniert allerdings zuverlässig.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:28 Uhr.
Seite 4 von 4   « Erste     234   

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