Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-1124219169
Gamer
2005-08-16 23:06
2005.09.11
TImage поверх TRichEdit


6-1116865895
ATarget
2005-05-23 20:31
2005.09.11
PIPE каналы


6-1116958843
Dj_Dreamer
2005-05-24 22:20
2005.09.11
Реализация IPSec в Delphi


1-1124486594
BBoost
2005-08-20 01:23
2005.09.11
"перерисовать" экран


1-1124478201
-=[ASH]=-
2005-08-19 23:03
2005.09.11
Визуальный редактор





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский