Ich habe mal in den Code von
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
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