![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Модальная форма [D6]
zz 5 © (2005-10-03 12:51:00)Всем доброго дня. При выполнении длительных операций в программе, причем в разных режимах выводится форма с прогресс-бар. Как ее вывести, чтобы, пока она не закроется, пользователь не мог с нее уйти и работать с программой, т.е. сделать ее модальной, но при этом не передовать ей управление. Заранее спасибо.
zz 5 (2005-10-04 10:05:00) [1]>> Плохиш © (04.10.05 00:13) [7]
Это немного не то, так как придется писать для каждой длительной операции свой обработчик. Сейчас у меня такой порядок
ShowProgressForm // показ модальной формы
try
for I := 1 to 43 do
begin
// операция
IncProgressFormPos // Увеличение значенея позиции прогресс-бара модальной формы
end;
finally
CloseProgressForm
end;
Плохиш (2005-10-04 00:13:00) [2]При показе формы с процессбаром послать себе сообщение, в обработчике этого сообщения выполнить необходимые действия.
zz 5 (2005-10-03 17:35:00) [3]>>zz 5 © (03.10.05 14:48) [5]
Сам склоняюсь в сторону потоков, но пока нужно быстрое решение, потому что переделка всех режимов, а их не мешьше пятидесяти, займет продолжительное время.
Спасибо за ответы, попробую пока MainForm.Enabled := False
y-soft (2005-10-03 15:22:00) [4]>>zz 5 © (03.10.05 14:48) [3]
Еще немного.
Если Ваша длительная операция атомарная, т.е. не возвращает управления до полного завершения, то, чтобы не "замораживать" программу, выход один - выносить ее в отдельный поток...
Если же операция состоит из большого кол-ва более мелких опраций, то не забывайте после каждой вызывать Application.ProcessMessages, иначе прогресс будет перерисовываться скачками...
y-soft (2005-10-03 15:04:00) [5]>zz 5 © (03.10.05 14:48) [3]
Вы имеете в виду, что ShowModal не возвращает управление до тех пор, пока модальное окно не закроется?
Ну так в Ваших руках сам код этой модальной формы. Т.е. Вы можете всю необходимую обработку производить там. Но для Windows более естественным способом является вынесение длительной операции в отдельный поток...
Еще один довольно часто используемый вариант - использование не модальной, а псевдомодальной формы. Т.е. вызываете не ShowModal, а Show а затем до конца операции делаете главную форму недоступной (Enabled := False)...
zz 5 (2005-10-03 14:48:00) [6]>y-soft © (03.10.05 13:01) [2]
Когда я вызываю окно с помощью ShowModal управление переходит в модальное окно, как мне потом, допустим, из родительского окна работать с модальным, например, увеличить значение прогресс-бар ?
Надо: 1) При старте длительной операции показать модальное окно 2) При выполнении операции постепенно наращивать значение прогресс-бар
y-soft (2005-10-03 13:01:00) [7]>zz 5 © (03.10.05 12:51)
А вы правильно понимаете, что такое модальность окна?
Это всего лишь значит, что родительское окно становится недоступным для пользовательского ввода, но отнюдь не останавливает цикл его оконной процедуры...
TUser (2005-10-03 13:00:00) [8]Сделай ее модальной и убери все способы ее закрытия.