2010-11-16 42 views
11

J'ai une application Delphi 2006 qui peut être réduite à une icône de barre d'état et affiche divers messages d'alerte via un repère de bulle sur l'icône de barre d'état.Conseils sur les bulles sur l'icône de la barre d'applications Delphi pour continuer à apparaître indéfiniment

Dans certaines circonstances - je ne sais pas quand - une indication de ballon affichée précédemment ne cesse de se lever et ne disparaîtra pas. Il s'affiche pendant la durée programmée, se ferme, puis réapparaît immédiatement.

Il s'agit toujours d'un conseil ballon de cette application.

Si l'application affiche une autre info-bulle, celle-ci s'affiche pour l'heure programmée, puis l'indication fantôme reprend.

C'est comme si l'indice était bloqué dans une file d'attente quelque part et n'était pas supprimé. En l'absence de toute inspiration (je me rends compte que c'est long), est-ce que quelqu'un sait comment purger les bulles?

+0

vérifier si vous avez une minuterie qui appelle l'icône pour afficher le ballon ou mieux chercher encore l'ensemble du projet pour le nom du composant d'icône et voyez où vous appelez la procédure qui montre le ballon. – ComputerSaysNo

+0

@Dorin. Merci, fait cela. Le code qui affecte à la propriété BalloonHint du TTrayIcon n'est définitivement pas appelé à nouveau. – rossmcm

+0

testez-vous cela sur Windows XP? Je me souviens qu'il y avait un bug avec les ballons fournis par MS sur ce système d'exploitation. Quoi qu'il en soit, vérifiez la réponse acceptée à http://stackoverflow.com/questions/902642/how-to-hide-a-taskbar-balloon-at-will. Je pense que cela pourrait vous aider. –

Répondre

2

Quel TrayIcon utilisez-vous? Le TCustomTrayIcon dans "Vcl.ExtCtrls" utilise TNotifyIconData pour envoyer le popup au TrayIcon. Certaines propriétés nécessitent Windows Vista ou version ultérieure.

public 
    FData: TNotifyIconData; //Winapi.ShellAPI 

procedure TCustomTrayIcon.ShowBalloonHint; 
begin 
    FData.uFlags := FData.uFlags or NIF_INFO; 
    FData.dwInfoFlags := Cardinal(FBalloonFlags); 
    Shell_NotifyIcon(NIM_MODIFY, FData); //Refresh(NIM_MODIFY); 
end; 

Vous pouvez voir ce qui se passe en manipulant les messages envoyés par le trayicon.

NIN_BALLOONSHOW  = WM_USER + 2; 
NIN_BALLOONHIDE  = WM_USER + 3; 
NIN_BALLOONTIMEOUT = WM_USER + 4; 
NIN_BALLOONUSERCLICK = WM_USER + 5; 
0

Je suis confronté au même problème dans VB.NET. Mon application affiche des messages d'erreur à travers un ballon dans le systray. Lorsqu'il y a plusieurs erreurs à la fois, le ballon colle à son délai d'attente normal et affiche les erreurs les unes après les autres. Il semble qu'il y ait une sorte de tampon qui se souvient du nombre réel de fois que vous essayez d'afficher le ballon. Si vous arrêtez de montrer de nouveaux ballons et attendez assez longtemps, cela finira par s'arrêter. Mon but serait de fermer le ballon actuel dès qu'un autre vient, mais je n'ai pas encore compris. Donc, ce n'est qu'une demi-solution.


[Ajout solution complète]

La solution complète est très simple. Faites-le avant de montrer une nouvelle bulle (Où Tray est votre TrayIcon/NotifyIcon).

Tray.Visible = true; 
+0

Difficile de voir comment cela se rapporte à la question qui concernait une Delphi application –

+0

C'est une solution pour le même problème. Seulement dans un code différent.Traduire ma ligne d'un code en code Delphi. Serait-ce un problème pour le PO? – Martin