Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

DNK
I. DNK
Баллы: 5

Подробнее »



Вопрос # 1 879

/ вопрос открыт /

Приветствую, уважаемые эксперты!
Каким образом сделать чтобы форма отображалась поверх всех окон?

IlluminatI Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: IlluminatI (статус: 2-ой класс)
Вопрос отправлен: 6 сентября 2008, 15:47
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: ANBsoft

Здравствуйте, IlluminatI!
Свойство формы FormStyle в fsStayOnTop

Ответ отправил: ANBsoft (статус: Студент)
Время отправки: 6 сентября 2008, 15:59


Мини-форум вопроса

Всего сообщений: 8; последнее сообщение — 7 сентября 2008, 00:00; участников в обсуждении: 4.
Вадим К

Вадим К (статус: Академик), 6 сентября 2008, 16:47 [#1]:

возникает законный вопрос, а зачем? FormStyle в fsStayOnTop делает форму поверх остальных только для этого приложения.
А сделать форму поверх всех других - нельзя. Нельзя по одной простой и глупой причине. Приставьте себе, что появилось две такие формы (привильней всё таки говорить "окна приложения"). И обе хотят быть сверху, что же делать?
Но некоторые горе программисты решают эту задачу так. Они по таймеру проверяют, что их окно находиться под другим и с помощью BringWindowToFront подымают своё окно. Но где то в районе Win95-Win98 Майкрософт прикрыла эту возможность - теперь эта функция делает окно поверх других только в том случае, если приложение активно. А если оно свёрнуто/в фоне, то просто начинает мигать кнопктой на панели задач.
Это всё было сделано не случайно, а преднамерено - в то время практически каждая программа старалась вибросить своё окно на передний план. если было 3-4 таких программы, зрелище было незабываемое. Работать было нельзя.
Также не работают разные методики, которые вначале делают приложение активным, а потом выводят окно. Всё это присекается.
Но саму функцию, которая выводит окно на передний план, забывая о всех ограничениях, они сделали. Но эта функция не делает окно "всегда сверху".
По этому, учитывая всё вышесказанное, считаю, что окно, которое всегда стремиться вылезти на передний план - плохая затея, за исключением некоторых случаев, которые можно пересчитать по пальцам.
Галочка "подтверждения прочтения" - вселенское зло.
Amidamaru

Amidamaru (статус: 4-ый класс), 6 сентября 2008, 17:38 [#2]:

Я неслогласен. FormStyle в fsStayOnTop делает форму поверх остальных окон для всех приложений. Очень простой пример - "Диспечер задач", у которого стоит галочка Параметры - Поверх остальных окон.
Если интересно, что случится если таких форм будет несколько - запустить несколько Диспечеров задач непроблема.

Все окна распологаются в некоторой последовательности (Z-последовательнось), просто StayOnTop-окна имеют отдельную.
Приглашаю Вас на наш IRC-канал: #delphiintru в сети DalNet.
Вадим К

Вадим К (статус: Академик), 6 сентября 2008, 17:54 [#3]:

В Вин98 и раньше оно то может так и работало. Но в ХР - нет.
А диспетчер задач на то и диспетчер, что ему положенно так работать.
Галочка "подтверждения прочтения" - вселенское зло.
Amidamaru

Amidamaru (статус: 4-ый класс), 6 сентября 2008, 19:02 [#4]:

Если создать проект с формой FormStyle = fsStayOnTop и запустить несколько копий - результат будет тотже.
StayOnTop это не просто понятие делфи, например в функциях CreateWindow и SetWindowPos можно установить аттрибут окна (WS_EX_TOPMOST или HWND_TOPMOST) который и делает окно "поверх всех остальных". А Win98 здесь вообще непричом.

Цитата из хелпа к CreateWindow:
WS_EX_TOPMOST
Specifies that a window created with this style should be placed above all non-topmost windows and should stay above them, even when the window is deactivated. (Про Win98 Only ничего)

Цитата из хелпа к SetWindowPos:
HWND_TOPMOST
Places the window above all non-topmost windows. The window maintains its topmost position even when it is deactivated. (Также про Win98 Only ни слова)
Приглашаю Вас на наш IRC-канал: #delphiintru в сети DalNet.
Вадим К

Вадим К (статус: Академик), 6 сентября 2008, 22:49 [#5]:

Я немного запутался сам и Вас запутал, и мы отошли от темы. Человек хотел "поверх всех окон". Вот это уже не реально.
Я понял почему я запутался. Я в свое время мучился с поднятием окна на передний план. А когда приложение свёрнуто, то это не всегда возмножно. А начальство требовало.
Галочка "подтверждения прочтения" - вселенское зло.
IlluminatI

IlluminatI (статус: 2-ой класс), 6 сентября 2008, 23:03 [#6]:

Интересный вопрос был :) Спасибо всем, пойду пробовать!
Amidamaru

Amidamaru (статус: 4-ый класс), 6 сентября 2008, 23:24 [#7]:

(: В моём понимании "поверх всех окон" это абстрактное понятие. Конечно же не всегда оно будет поверх абсолютно всех окон, а только тогда когда оно активно, иначе "выше" него будет как минимум Меню Пуск :)
А поднятие окна на передний план я делал через SetForegroundWindow (по примеру из книги), нащёт свёрнутости непомню, но помоему не мешало
Приглашаю Вас на наш IRC-канал: #delphiintru в сети DalNet.
ANBsoft

ANBsoft (статус: Студент), 7 сентября 2008, 00:00 [#8]:

fsStayOnTop выводит окно поверх всех обычных окон, и поверх всех вообще в том случае если окно активно (оно будет даже поверх диспечера задач), если будет активно другое окно со свойством fsStayOnTop, то оно будет поверх этого окна.
Ничего сложного нет ни в реализации, ни в использовании. Когда-то давно писал свой планировщик (напоминалка что/когда делать), так при срабатывании события проверял нужно ли развернуть окно (если оно свернуто) и переключал FormStyle в fsStayOnTop, все нужное окно оказывалось поверх других. И я не замечал чтобы "практически каждая программа старалась вибросить своё окно на передний план" - для обычных задач в этом нет смысла.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 24 августа 2017, 02:02
Выполнено за 0.05 сек.
Рейтинг@Mail.ru