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