Delphi fsStayOnTop Странность - PullRequest
       44

Delphi fsStayOnTop Странность

3 голосов
/ 17 марта 2010

Вот сделка. Основная форма установлена ​​на fsNormal. Эта основная форма развернута на весь экран с плавающей панелью инструментов. Панель инструментов обычной формы со стилем fsStayOnTop.

В большинстве случаев это работает, как и ожидалось. Отображается основная форма, и панель инструментов всплывает поверх нее.

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

  1. При удаленном нажатии на вкладку из приложения Delphi плавающая верхняя форма fsStayOnTop остается поверх других приложений. Так что, если я перейду на Firefox, то плавающее меню останется поверх Firefox.

  2. При альтернативном вкладке из другого приложения в приложение Delphi всплывающее меню не отображается (так как оно находится за основной формой fsNormal).

Это известная ошибка или есть какие-то взломы, чтобы заставить ее работать? Это также чаще всего происходит, когда запущено несколько копий приложения (они не взаимодействуют между собой и должны запускаться в «песочнице» своих окон).

Это как если бы Delphi запутался, какое окно должно быть сверху, и поменял их местами или изменил плавающую форму на режим пребывания всего.

Или я неправильно понял fsStayOnTop? Я предполагаю, что установка стиля формы на fsStayOnTop позволяет ему оставаться поверх всех других форм в текущем приложении, а не всех окон в других запущенных приложениях.

Ответы [ 3 ]

0 голосов
/ 17 марта 2010

Я не знаю ошибки в этой области.

Позвольте мне сначала объяснить, как этот процесс работает:

Delphi сначала использует стиль fsStayOnTop во время создания окна, содержащего форму, вызывая win32-функцию SetWindowPos с параметром HWND_TOPMOST.

См. http://msdn.microsoft.com/en-us/library/ms633545(VS.85).aspx для подробного объяснения SetWindowPos.

Каждый раз, когда приложение деактивировано или свернуто, Delphi перечисляет все самые верхние формы для нормализации форм (нормализация - это термин, который используется в vcl для обозначения того, что самые верхние окна превращаются в не самые верхние), и он хранит внутренний список из всех окон, которые были самыми верхними в тот момент.

Каждый раз, когда приложение активируется или восстанавливается, Delphi использует информацию, хранящуюся в списке самых верхних окон, для восстановления всех самых верхних форм (используя setWindowPos с параметром HWND_TOPMOST)

Так что мне кажется, что проблема в том, как Delphi хранит информацию при перечислении окон, когда приложение свернуто.

Я бы взломал функцию минимизации или деактивации и проверил, правильно ли указан список самых верхних окон (он на Application.FTopMostList).

0 голосов
/ 09 марта 2012

У меня была похожая проблема, и эта ссылка мне очень помогла: Delphi: Balloon Form с fsStayOnTop не работает в Win7

Когда я вызываю функцию Application.NormalizeTopMosts (), самые верхние формы ведут себя так, как я ожидаю.

0 голосов
/ 17 марта 2010

Немного больше информации и возможное решение.

Установите плавающую форму на fsnormal.

Когда происходит событие mainform.activate, вызывается плавающая форма.bringtofront.

Но я также использую stayontop для всех других диалогов приложения. Когда запущено несколько копий приложения, в диалоговых окнах отображается та же проблема (т. Е. Если в app1 открыто диалоговое окно, а диалоговое окно находится на вкладке alt-tab, оно может остаться поверх всех других программ).

...