![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
форма поверх основной формы [D7, WinXP]
maximmsm © (2005-08-22 00:48:00)Извините за простой вопрос.
Как показать форму поверх основной, и при этом закрыть доступ к основной форме,
т.е. чтобы эта форма не выходила за границы основной и не давала бы
возможности кликать на основную форму.
что-то вроде showmodal.
Перепробовал разные mdi варианты, но ничего путного не добился.
Игорь Шевченко (2005-08-22 11:35:00) [1]Дети Ивана Кулибина
Наиль (2005-08-22 10:33:00) [2]>[21]
Я умею их готовить. Но научился готовить более вкусные блюда.
А так как делает автор ветки, я не сделал бы ни когда. В моём варианте это выглядело бы так:Frame1.Parent:=nil; Frame2.Parent:=MainPanel;Всё должно лежать на своих местах, а не ездить по форме. Другими слова то что в данный момент не нужно - прячется, а что нужно - появляется. В таком варианте, общие элементы для разных частей остаются на экране. В моём случае - это панель с маленькой интерактивной справкой такого вида "Нажми на кнопку и получешь результат".
Anatoly Podgoretsky (2005-08-22 10:13:00) [3]Наиль © (22.08.05 10:09) [20]
Тоже не люблю модальные окна.
Вы просто не умеете их готовить.
Наиль (2005-08-22 10:09:00) [4]maximmsm- родственая душа.
Тоже не люблю модальные окна. А всё из-за настроект оформления Windows.
На экране три ОК'а, и те в которые тычешь, обычно не работают.
По теме. На форму кладётся панель, всё остальное на неё (Ctrl+A,..., Ctrl+C, Ctrl+V). Остаётся у дочерней формы сделать Parent=MainForm и Panel.Enabled=false. Получается нужный эффект. Но в форуме встречалось сообщение, что не все компоненты при деактивации панели деактивируются. Так что, гарантии не даю.
alex_*** (2005-08-22 09:00:00) [5]использовать CreateParented(hwnd)
Enable := false на основную форму и Show на прогресс. Зачем потоки отдельные.. Нужен просто прогресс человеку
Defunct (2005-08-22 05:03:00) [6]maximmsm (22.08.05 04:52) [16]
> а то написали убийственное
"application can’t continue to run until the form is closed"
если рассматривать application как экземпляр TApplication, так так и есть.
Юрий Зотов (2005-08-22 05:02:00) [7]> maximmsm (22.08.05 04:52) [16]
> получается что логика модального показа похожа на
> if (topenfiledialog().execute)
Так оно и есть. Диалоги ведь тоже показываются модально, на то они и диалоги. Функции ShowMessage, MessageDlg, MessageBox и стандартная обработка исключений тоже выводят модальные окна. Ничего особенного и ничего страшного.
maximmsm (2005-08-22 04:52:00) [8]Спасибо всем.
получается что логика модального показа похожа
на
if (topenfiledialog().execute) ,
там аналогично, пока пользователь не нажмёт
отмену или ок, следующий оператор не исполнится.
+блокировка остальных форм.
Если бы Борланд удосужился написать всё то что написано в
посте № [14]
то вопросов бы не было, а то написали убийственное
"application can’t continue to run until the form is closed"
Defunct (2005-08-22 04:40:00) [9]> детально отображается прогресс длинных процедур,
> в которых задейстсвован и основной поток и другие потоки.
в таком случае, надо перестроить логику приложения.
текущий поток должен обращаться к "прогресс" форме, которая в свою очередь должна быть модальной.
пример такого кода:
tpf := TTransProgressForm.Create( Self );
try
TExecuteThread.Create( tpf.Handle, ExecUrlQuery );
tpf.ShowModal;
finally
tpf.free;
end;
по названиям надеюсь механизм будет понятен. создается форма с прогресс баром или еще чем-то, создается поток, которому передается как параметр "длинная" процедура, открывается модальная форма, поток с помощью сообщений сообщает этой форме ход выполнения "длинной" процедуры, и в конце сообщает о завершении выполнения. Происходит возврат в основной поток и разрушение модальной формы.
Юрий Зотов (2005-08-22 04:37:00) [10]> maximmsm (22.08.05 04:16) [12]
> вот эта фраза, непонятно что значит,
> что именно перестаёт работать?
При модальном показе формы:
1. Дизаблятся все остальные формы.
2. Работает не общий цикл выборки сообщений Application, а отдельный, написанный прямо внутри ShowModal.
Практически это означает, что:
1. Все формы, кроме модальной, юзеру недоступны.
2. Исполнение вызвавшего кода не будет продолжено, пока не завершится ShowModal (как, собственно, и при любом синхронном вызове любой функции).
Это не означает, что поток перестал работать. Как и при обычном вызове любой функции, приостанавливается исполнение вызвавшего ее кода, а вызванный спокойно работает. В том числе, продолжают возникать и обрабатываться события и сообщения (кроме, конечно, событий и сообщений ввода на задизабленных формах).
И происходит все это в основном потоке. Остальные потоки этот механизм вообще никак не затрагивает.
Defunct (2005-08-22 04:28:00) [11]> что именно перестаёт работать?
кнопочки на форме из которой произведен вызов. фактически за тебя, автоматически устанавливается mainform.enabled := false, и восстанавливается при возврате из модально формы.
гарантировано, что код в главной форме не будет произвольно выполняться на время показа модальной формы.
логически можно расписать так:
begin
<оператор1>
<оператор2>
ShowModal
<оператор3>
end;
оператор 3 не выполнится пока модальная форма не будет закрыта.
это очень удобно для получения результата от форм-диалогов.
maximmsm (2005-08-22 04:16:00) [12]да, думаю что вопрос можно закрыть,
просто я боюсь модальных показов как огня,
A modal form is one where the application can’t continue to run until the form is closed.
вот эта фраза, непонятно что значит,
что именно перестаёт работать?
у меня на этой форме всплывающей,
детально отображается прогресс длинных процедур,
в которых задейстсвован и основной поток и другие потоки.
Юрий Зотов (2005-08-22 03:52:00) [13]> maximmsm (22.08.05 03:27) [10]
> где-то я видел что всплывающая диалоговая форма не даёт
> кликать на основную и пищит при этом,
Как раз потому, что диалог показан модально.
> при form2.parent==mainForm
> showmodal приводит к коллапсу программы.
Так уберите присвоение parent и не будет никаких коллапсов
===================================
Честно говоря, не понимаю, в чем проблема. Обычный модальный показ - и весь вопрос.
maximmsm (2005-08-22 03:27:00) [14]1. Чем конкретно не подходит модальный показ?
при form2.parent==mainForm
showmodal приводит к коллапсу программы.
2. Почему верхняя форма не должна выходить за рамки основной?
прихоть, как и вся эта тема,
но возникла потому что где-то я видел
что всплывающая диалоговая форма
не даёт кликать на основную и пищит при этом,
и ещё у неё цвет заголовка моргает,
обращая на себя внимание.
и мне показалось что это просто стандартная вещь,
но, видимо , нет,
впрочем меня устраивает mainForm.enabled=false;
Defunct (2005-08-22 02:24:00) [15]> A modal form is one where the application can’t continue to run u ntil the form is closed.
Application cant, а вот созданные вами потоки can, еще как can.
Юрий Зотов (2005-08-22 02:23:00) [16]> maximmsm
Что-то странное Вы затеяли, в таких случаях обычно находится гораздо более простой (и гораздо более правильный) способ. Обрисуйте задачу, поищем вместе. В частности:
1. Чем конкретно не подходит модальный показ?
2. Почему верхняя форма не должна выходить за рамки основной?
Джо (2005-08-22 02:20:00) [17]Играться с Enabled?
И что такое "и не давала бы возможности кликать на основную форму"?
Кроме того, повторю свой вопрос про экзотику.
maximmsm (2005-08-22 02:17:00) [18]showmodal не подходит,
иначе вопроса бы не было
A modal form is one where the application can’t continue to run until the form is closed.
Джо (2005-08-22 02:16:00) [19]
> [3] maximmsm (22.08.05 01:52)
> за Parent спасибо, имеено то,
>
> fstopmost - это что-то апишное, нет такого в дельфе,
Да, разумеется, автоматическая описка.
А вообще, по сути - зачем эдакая экзотика понадобилась?
Defunct (2005-08-22 02:07:00) [20]maximmsm (22.08.05 00:48)
fsStayOnTop + ShowModal?