Delphi 10.4 TrayIcon BallonHint

Использую процедуру для отображения уведомления:

procedure TForm1.TrayNotification(t_title: string; t_message: string; m_type: string);
begin
  Form1.TrayIcon1.BalloonTitle := t_title;
  Form1.TrayIcon1.BalloonHint := t_message;
  Form1.TrayIcon1.BalloonTimeout := 8;
  if (m_type = 'info') then
    Form1.TrayIcon1.BalloonFlags := bfInfo
  else if (m_type = 'warning') then
    Form1.TrayIcon1.BalloonFlags := bfWarning
  else if (m_type = 'error') then
    Form1.TrayIcon1.BalloonFlags := bfError
  else
    Form1.TrayIcon1.BalloonFlags := bfNone;
  Form1.TrayIcon1.ShowBalloonHint;
end;

У меня в программе работают 2 таймера и часто срабатывают одновременно, они отображают оповещения используя эту процедуру, и перемешиваются заголовок или содержимое сообщения + может появится лишнее оповещение из-за того, что процедура выше одновременно вызывается несколько раз подряд, а компонент 1 и записи свойств происходят одновременно разными значениями. Подскажите, как решить задачу, чтобы выводились все сообщения разные даже подряд?


Ответы (2 шт):

Автор решения: zed

Таймеры срабатывают последовательно (события обрабатываются в главном потоке), но дело в том, что после того, как первый таймер сработал и показал хинт, может сработать второй таймер ещё до того, как хинт исчезнет по таймауту или от действий пользователя и изменить заголовок и текст хинта прямо на глазах. От этого и появляется эффект перемешивания.

Попробуйте принудительно закрыть старый хинт перед выводом нового. Для этого добавьте строчку TrayIcon1.BalloonHint := ''; в самое начало вашей процедуры.

И по хорошему, надо делать какую-то очередь сообщений, которые вы хотите показать пользователю и выводить их последовательно. Иначе, из-за быстрого срабатывания таймеров, пользователь половину сообщений просто не успеет прочитать.

→ Ссылка
Автор решения: Victor

Поскольку я не нашёл других вариантов, написал для кода алгоритмы, чтобы выполнялась процедура не в 1 время и алгоритм контролировал эти запуски, чтобы процедура не выполнялась больше 1 раза за 4 секунды. Если будут варианты получше, готов рассмотреть)

→ Ссылка