Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.09.11;
Скачать: CL | DM;

Вниз

форма поверх основной формы   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.024 c
1-1124210289
Андрей Молчанов
2005-08-16 20:38
2005.09.11
TShellTreeView, TShellListView и TShellComboBox


2-1123623105
MS-REM
2005-08-10 01:31
2005.09.11
Я купил книгу по SQL с ними идут практические файлы могу ли я ...


14-1124209687
Andy BitOff
2005-08-16 20:28
2005.09.11
Можно ли послать писмо или ...


14-1124307013
lookin
2005-08-17 23:30
2005.09.11
ZoneAlarm не дает спокойно жить


4-1121982988
Atrion
2005-07-22 01:56
2005.09.11
Проблема...перекодить несколько функций из C в Delphi...